mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
86 lines
3.2 KiB
PL/PgSQL
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();
|