Files
MyClub/database/migrations/000020_create_polls.up.sql
T
Tomáš Dvořák 12cba639b9 upload
2025-10-16 13:32:05 +02:00

86 lines
3.2 KiB
PL/PgSQL

-- Create polls table
CREATE TABLE IF NOT EXISTS polls (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
type VARCHAR(50) NOT NULL DEFAULT 'single',
status VARCHAR(20) NOT NULL DEFAULT 'draft',
start_date TIMESTAMP,
end_date TIMESTAMP,
allow_multiple BOOLEAN DEFAULT FALSE,
max_choices INTEGER DEFAULT 1,
show_results VARCHAR(20) DEFAULT 'after_vote',
require_auth BOOLEAN DEFAULT FALSE,
allow_guest_vote BOOLEAN DEFAULT TRUE,
featured BOOLEAN DEFAULT FALSE,
category_id INTEGER REFERENCES categories(id) ON DELETE SET NULL,
related_match_id INTEGER,
image_url VARCHAR(500),
total_votes INTEGER DEFAULT 0,
created_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
deleted_at TIMESTAMP
);
-- Create poll_options table
CREATE TABLE IF NOT EXISTS poll_options (
id SERIAL PRIMARY KEY,
poll_id INTEGER NOT NULL REFERENCES polls(id) ON DELETE CASCADE,
text VARCHAR(255) NOT NULL,
description TEXT,
image_url VARCHAR(500),
display_order INTEGER DEFAULT 0,
vote_count INTEGER DEFAULT 0,
player_id INTEGER REFERENCES players(id) ON DELETE SET NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Create poll_votes table
CREATE TABLE IF NOT EXISTS poll_votes (
id SERIAL PRIMARY KEY,
poll_id INTEGER NOT NULL REFERENCES polls(id) ON DELETE CASCADE,
option_id INTEGER NOT NULL REFERENCES poll_options(id) ON DELETE CASCADE,
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
ip_hash VARCHAR(64),
user_agent VARCHAR(500),
session_token VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Create indexes for performance
CREATE INDEX IF NOT EXISTS idx_polls_status ON polls(status);
CREATE INDEX IF NOT EXISTS idx_polls_featured ON polls(featured);
CREATE INDEX IF NOT EXISTS idx_polls_start_date ON polls(start_date);
CREATE INDEX IF NOT EXISTS idx_polls_end_date ON polls(end_date);
CREATE INDEX IF NOT EXISTS idx_polls_deleted_at ON polls(deleted_at);
CREATE INDEX IF NOT EXISTS idx_poll_options_poll_id ON poll_options(poll_id);
CREATE INDEX IF NOT EXISTS idx_poll_options_display_order ON poll_options(display_order);
CREATE INDEX IF NOT EXISTS idx_poll_votes_poll_id ON poll_votes(poll_id);
CREATE INDEX IF NOT EXISTS idx_poll_votes_option_id ON poll_votes(option_id);
CREATE INDEX IF NOT EXISTS idx_poll_votes_user_id ON poll_votes(user_id);
CREATE INDEX IF NOT EXISTS idx_poll_votes_ip_hash ON poll_votes(ip_hash);
CREATE INDEX IF NOT EXISTS idx_poll_votes_session_token ON poll_votes(session_token);
-- Add trigger for updated_at
CREATE OR REPLACE FUNCTION update_polls_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_polls_updated_at
BEFORE UPDATE ON polls
FOR EACH ROW
EXECUTE FUNCTION update_polls_updated_at();
CREATE TRIGGER trigger_poll_options_updated_at
BEFORE UPDATE ON poll_options
FOR EACH ROW
EXECUTE FUNCTION update_polls_updated_at();