-- 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();