Heavily customized version of smokesignal - https://whtwnd.com/kayrozen.com/3lpwe4ymowg2t
at main 2.3 kB view raw
1-- Event bookmarks migration 2-- This creates the core tables for the bookmark calendar feature 3 4-- Event bookmarks table (local cache for performance) 5CREATE TABLE event_bookmarks ( 6 id SERIAL PRIMARY KEY, 7 did VARCHAR(512) NOT NULL, 8 bookmark_aturi VARCHAR(1024) NOT NULL, -- ATproto bookmark record URI 9 event_aturi VARCHAR(1024) NOT NULL, -- Event being bookmarked 10 tags TEXT[] NOT NULL DEFAULT '{}', -- Tags for organization 11 synced_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), 12 created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), 13 UNIQUE(did, event_aturi), -- Prevent duplicate event bookmarks 14 FOREIGN KEY (event_aturi) REFERENCES events(aturi) ON DELETE CASCADE 15); 16 17-- Bookmark calendars table (user-created collections) 18CREATE TABLE bookmark_calendars ( 19 id SERIAL PRIMARY KEY, 20 calendar_id VARCHAR(64) NOT NULL, -- Public identifier for sharing 21 did VARCHAR(512) NOT NULL, 22 name VARCHAR(256) NOT NULL, 23 description TEXT DEFAULT NULL, 24 tags TEXT[] NOT NULL, -- Tags that define this calendar 25 tag_operator VARCHAR(16) NOT NULL DEFAULT 'OR', -- 'AND' or 'OR' for tag matching 26 is_public BOOLEAN NOT NULL DEFAULT FALSE, 27 event_count INTEGER NOT NULL DEFAULT 0, 28 created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), 29 updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(), 30 UNIQUE(calendar_id), 31 CHECK(array_length(tags, 1) > 0), -- Ensure at least one tag per calendar 32 CHECK(tag_operator IN ('AND', 'OR')), 33 CHECK(array_length(tags, 1) <= 10) -- Maximum 10 tags per calendar 34); 35 36-- Indexes for event_bookmarks 37CREATE INDEX idx_event_bookmarks_did ON event_bookmarks(did); 38CREATE INDEX idx_event_bookmarks_event_aturi ON event_bookmarks(event_aturi); 39CREATE INDEX idx_event_bookmarks_tags ON event_bookmarks USING GIN(tags); 40CREATE INDEX idx_event_bookmarks_synced_at ON event_bookmarks(synced_at); 41 42-- Indexes for bookmark_calendars 43CREATE INDEX idx_bookmark_calendars_did ON bookmark_calendars(did); 44CREATE INDEX idx_bookmark_calendars_public ON bookmark_calendars(is_public) WHERE is_public = true; 45CREATE INDEX idx_bookmark_calendars_tags ON bookmark_calendars USING GIN(tags); 46CREATE INDEX idx_bookmark_calendars_calendar_id ON bookmark_calendars(calendar_id);