Files
exposedgays/supabase/migration_v2.sql

102 lines
3.9 KiB
PL/PgSQL

-- ExposedGays v2 migration: albums, canned messages, ID verification
-- Run after schema.sql on SUPABASE_01
-- Profile extensions
ALTER TABLE public.profiles
ADD COLUMN IF NOT EXISTS state TEXT,
ADD COLUMN IF NOT EXISTS id_verified BOOLEAN NOT NULL DEFAULT false,
ADD COLUMN IF NOT EXISTS id_verified_at TIMESTAMPTZ;
-- ============================================================
-- GALLERY ALBUMS (max 5 per user)
-- ============================================================
CREATE TABLE IF NOT EXISTS public.gallery_albums (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES public.profiles(id) ON DELETE CASCADE,
name TEXT NOT NULL CHECK (char_length(name) <= 40),
is_default BOOLEAN NOT NULL DEFAULT false,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_gallery_albums_user ON public.gallery_albums (user_id);
-- Add album_id to gallery_photos
ALTER TABLE public.gallery_photos
ADD COLUMN IF NOT EXISTS album_id UUID REFERENCES public.gallery_albums(id) ON DELETE SET NULL;
-- ============================================================
-- CANNED MESSAGES (max 20 per user)
-- ============================================================
CREATE TABLE IF NOT EXISTS public.canned_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES public.profiles(id) ON DELETE CASCADE,
title TEXT NOT NULL CHECK (char_length(title) <= 40),
content TEXT NOT NULL CHECK (char_length(content) <= 500),
sort_order INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_canned_messages_user ON public.canned_messages (user_id, sort_order);
-- ============================================================
-- LIMIT ENFORCEMENT TRIGGERS
-- ============================================================
CREATE OR REPLACE FUNCTION public.enforce_gallery_album_limit()
RETURNS TRIGGER AS $$
BEGIN
IF (SELECT COUNT(*) FROM public.gallery_albums WHERE user_id = NEW.user_id) >= 5 THEN
RAISE EXCEPTION 'Maximum 5 albums per user';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_gallery_album_limit ON public.gallery_albums;
CREATE TRIGGER trg_gallery_album_limit
BEFORE INSERT ON public.gallery_albums
FOR EACH ROW EXECUTE FUNCTION public.enforce_gallery_album_limit();
CREATE OR REPLACE FUNCTION public.enforce_gallery_photo_limit()
RETURNS TRIGGER AS $$
BEGIN
IF (SELECT COUNT(*) FROM public.gallery_photos WHERE user_id = NEW.user_id) >= 15 THEN
RAISE EXCEPTION 'Maximum 15 photos per user';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_gallery_photo_limit ON public.gallery_photos;
CREATE TRIGGER trg_gallery_photo_limit
BEFORE INSERT ON public.gallery_photos
FOR EACH ROW EXECUTE FUNCTION public.enforce_gallery_photo_limit();
CREATE OR REPLACE FUNCTION public.enforce_canned_message_limit()
RETURNS TRIGGER AS $$
BEGIN
IF (SELECT COUNT(*) FROM public.canned_messages WHERE user_id = NEW.user_id) >= 20 THEN
RAISE EXCEPTION 'Maximum 20 canned messages per user';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS trg_canned_message_limit ON public.canned_messages;
CREATE TRIGGER trg_canned_message_limit
BEFORE INSERT ON public.canned_messages
FOR EACH ROW EXECUTE FUNCTION public.enforce_canned_message_limit();
-- ============================================================
-- RLS
-- ============================================================
ALTER TABLE public.gallery_albums ENABLE ROW LEVEL SECURITY;
ALTER TABLE public.canned_messages ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Albums viewable by everyone"
ON public.gallery_albums FOR SELECT USING (true);
CREATE POLICY "Users manage own albums"
ON public.gallery_albums FOR ALL USING (auth.uid() = user_id);
CREATE POLICY "Canned messages owner only"
ON public.canned_messages FOR ALL USING (auth.uid() = user_id);