-- Voting System Tables -- Vote Events Table CREATE TABLE IF NOT EXISTS vote_events ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), title VARCHAR(255) NOT NULL, description TEXT, start_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, end_date TIMESTAMP WITHOUT TIME ZONE NOT NULL, is_active BOOLEAN NOT NULL DEFAULT TRUE, created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TRIGGER trg_vote_events_updated_at BEFORE UPDATE ON vote_events FOR EACH ROW EXECUTE FUNCTION set_updated_at(); -- Candidates Table CREATE TABLE IF NOT EXISTS candidates ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), vote_event_id UUID NOT NULL REFERENCES vote_events(id) ON DELETE CASCADE, name VARCHAR(255) NOT NULL, image_url VARCHAR(500), description TEXT, created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TRIGGER trg_candidates_updated_at BEFORE UPDATE ON candidates FOR EACH ROW EXECUTE FUNCTION set_updated_at(); CREATE INDEX IF NOT EXISTS idx_candidates_vote_event_id ON candidates(vote_event_id); -- Votes Table CREATE TABLE IF NOT EXISTS votes ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), vote_event_id UUID NOT NULL REFERENCES vote_events(id) ON DELETE CASCADE, candidate_id UUID NOT NULL REFERENCES candidates(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Ensure one vote per user per event CREATE UNIQUE INDEX IF NOT EXISTS uq_votes_user_event ON votes(user_id, vote_event_id); CREATE INDEX IF NOT EXISTS idx_votes_vote_event_id ON votes(vote_event_id); CREATE INDEX IF NOT EXISTS idx_votes_candidate_id ON votes(candidate_id); CREATE INDEX IF NOT EXISTS idx_votes_user_id ON votes(user_id);