A community based topic aggregation platform built on atproto
at main 38 lines 1.7 kB view raw
1-- +goose Up 2CREATE TABLE community_suggestions ( 3 id BIGSERIAL PRIMARY KEY, 4 title TEXT NOT NULL, 5 description TEXT NOT NULL, 6 submitter_did TEXT NOT NULL, 7 status TEXT NOT NULL DEFAULT 'open', 8 vote_count INTEGER NOT NULL DEFAULT 0, 9 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 10 updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 11 CONSTRAINT valid_suggestion_status CHECK (status IN ('open', 'under_review', 'approved', 'declined')), 12 CONSTRAINT title_not_empty CHECK (LENGTH(TRIM(title)) > 0), 13 CONSTRAINT title_max_length CHECK (LENGTH(title) <= 200), 14 CONSTRAINT description_max_length CHECK (LENGTH(description) <= 5000), 15 CONSTRAINT description_not_empty CHECK (LENGTH(TRIM(description)) > 0) 16); 17 18CREATE TABLE suggestion_votes ( 19 id BIGSERIAL PRIMARY KEY, 20 suggestion_id BIGINT NOT NULL REFERENCES community_suggestions(id) ON DELETE CASCADE, 21 voter_did TEXT NOT NULL, 22 value SMALLINT NOT NULL, 23 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 24 CONSTRAINT valid_vote_value CHECK (value IN (1, -1)), 25 CONSTRAINT unique_suggestion_voter UNIQUE (suggestion_id, voter_did) 26); 27 28-- Indexes 29CREATE INDEX idx_suggestions_status ON community_suggestions(status); 30CREATE INDEX idx_suggestions_created_at ON community_suggestions(created_at DESC); 31CREATE INDEX idx_suggestions_vote_count ON community_suggestions(vote_count DESC); 32CREATE INDEX idx_suggestions_submitter ON community_suggestions(submitter_did); 33CREATE INDEX idx_suggestion_votes_suggestion ON suggestion_votes(suggestion_id); 34CREATE INDEX idx_suggestion_votes_voter ON suggestion_votes(voter_did); 35 36-- +goose Down 37DROP TABLE IF EXISTS suggestion_votes; 38DROP TABLE IF EXISTS community_suggestions;