Add interest feed customization, 20-photo gallery with crop, videos, and profile media curation

This commit is contained in:
Ryan Salazar
2026-06-26 22:01:23 -04:00
parent 9604a18f7c
commit 66e1df12b0
21 changed files with 1789 additions and 348 deletions

View File

@@ -0,0 +1,71 @@
-- 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);