102 lines
3.9 KiB
PL/PgSQL
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); |