71 lines
2.5 KiB
PL/PgSQL
71 lines
2.5 KiB
PL/PgSQL
-- ExposedGays v3: 20 photos, videos, profile media order, album visibility
|
|
-- Run on SUPABASE_01 after migration_v2.sql
|
|
|
|
-- Photo limit 20
|
|
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) >= 20 THEN
|
|
RAISE EXCEPTION 'Maximum 20 photos per user';
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Album visibility + sort
|
|
ALTER TABLE public.gallery_albums
|
|
ADD COLUMN IF NOT EXISTS is_public BOOLEAN NOT NULL DEFAULT true,
|
|
ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0;
|
|
|
|
-- Photo profile curation
|
|
ALTER TABLE public.gallery_photos
|
|
ADD COLUMN IF NOT EXISTS show_on_profile BOOLEAN NOT NULL DEFAULT false,
|
|
ADD COLUMN IF NOT EXISTS profile_sort_order INTEGER NOT NULL DEFAULT 0,
|
|
ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0;
|
|
|
|
-- Videos (max 5 per user, 30s)
|
|
CREATE TABLE IF NOT EXISTS public.gallery_videos (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES public.profiles(id) ON DELETE CASCADE,
|
|
album_id UUID REFERENCES public.gallery_albums(id) ON DELETE SET NULL,
|
|
url TEXT NOT NULL,
|
|
thumbnail_url TEXT,
|
|
duration_sec NUMERIC(6,2),
|
|
is_explicit BOOLEAN NOT NULL DEFAULT true,
|
|
show_on_profile BOOLEAN NOT NULL DEFAULT false,
|
|
profile_sort_order INTEGER NOT NULL DEFAULT 0,
|
|
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_gallery_videos_user ON public.gallery_videos (user_id);
|
|
|
|
CREATE OR REPLACE FUNCTION public.enforce_gallery_video_limit()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
IF (SELECT COUNT(*) FROM public.gallery_videos WHERE user_id = NEW.user_id) >= 5 THEN
|
|
RAISE EXCEPTION 'Maximum 5 videos per user';
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_gallery_video_limit ON public.gallery_videos;
|
|
CREATE TRIGGER trg_gallery_video_limit
|
|
BEFORE INSERT ON public.gallery_videos
|
|
FOR EACH ROW EXECUTE FUNCTION public.enforce_gallery_video_limit();
|
|
|
|
ALTER TABLE public.gallery_videos ENABLE ROW LEVEL SECURITY;
|
|
|
|
CREATE POLICY "Videos viewable when album public or owner"
|
|
ON public.gallery_videos FOR SELECT USING (
|
|
auth.uid() = user_id
|
|
OR album_id IS NULL
|
|
OR EXISTS (
|
|
SELECT 1 FROM public.gallery_albums a
|
|
WHERE a.id = album_id AND a.is_public = true
|
|
)
|
|
);
|
|
|
|
CREATE POLICY "Users manage own videos"
|
|
ON public.gallery_videos FOR ALL USING (auth.uid() = user_id); |