meti-backend/migrations/000012_voting_system.up.sql
Aditya Siregar 826c5d26ad Add init
2025-08-15 21:17:19 +07:00

51 lines
1.9 KiB
SQL

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