mirror of
https://github.com/jjbrunton/Sauci.git
synced 2026-10-31 10:19:43 +00:00
92 lines
2.7 KiB
PL/PgSQL
92 lines
2.7 KiB
PL/PgSQL
-- Update RLS policies to allow partner premium access
|
|
-- When either user OR their partner has is_premium = TRUE, both can access premium packs
|
|
|
|
-- Drop existing premium pack policy
|
|
DROP POLICY IF EXISTS "Premium users can view premium packs" ON public.question_packs;
|
|
|
|
-- Create new policy that checks couple premium status
|
|
-- Access granted if: pack is not premium OR user is premium OR partner is premium
|
|
CREATE POLICY "Users or partners with premium can view premium packs"
|
|
ON public.question_packs FOR SELECT
|
|
USING (
|
|
is_premium = FALSE OR
|
|
EXISTS (
|
|
SELECT 1 FROM public.profiles p
|
|
WHERE p.id = auth.uid()
|
|
AND (
|
|
p.is_premium = TRUE OR
|
|
EXISTS (
|
|
SELECT 1 FROM public.profiles partner
|
|
WHERE partner.couple_id = p.couple_id
|
|
AND partner.couple_id IS NOT NULL
|
|
AND partner.id != p.id
|
|
AND partner.is_premium = TRUE
|
|
)
|
|
)
|
|
)
|
|
);
|
|
|
|
-- Update questions policy similarly
|
|
DROP POLICY IF EXISTS "Anyone can view questions in visible packs" ON public.questions;
|
|
|
|
CREATE POLICY "Users can view questions in accessible packs"
|
|
ON public.questions FOR SELECT
|
|
USING (
|
|
pack_id IN (
|
|
SELECT qp.id FROM public.question_packs qp
|
|
WHERE qp.is_public = TRUE
|
|
AND (
|
|
qp.is_premium = FALSE OR
|
|
EXISTS (
|
|
SELECT 1 FROM public.profiles p
|
|
WHERE p.id = auth.uid()
|
|
AND (
|
|
p.is_premium = TRUE OR
|
|
EXISTS (
|
|
SELECT 1 FROM public.profiles partner
|
|
WHERE partner.couple_id = p.couple_id
|
|
AND partner.couple_id IS NOT NULL
|
|
AND partner.id != p.id
|
|
AND partner.is_premium = TRUE
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
|
|
-- Create a helper function to check premium access for a user
|
|
-- This can be used in application code and other policies
|
|
CREATE OR REPLACE FUNCTION public.has_premium_access(check_user_id UUID)
|
|
RETURNS BOOLEAN AS $$
|
|
DECLARE
|
|
user_premium BOOLEAN;
|
|
partner_premium BOOLEAN;
|
|
user_couple_id UUID;
|
|
BEGIN
|
|
-- Get user's premium status and couple_id
|
|
SELECT is_premium, couple_id INTO user_premium, user_couple_id
|
|
FROM public.profiles
|
|
WHERE id = check_user_id;
|
|
|
|
-- If user is premium, return true
|
|
IF user_premium = TRUE THEN
|
|
RETURN TRUE;
|
|
END IF;
|
|
|
|
-- If user has no couple, return false
|
|
IF user_couple_id IS NULL THEN
|
|
RETURN FALSE;
|
|
END IF;
|
|
|
|
-- Check if partner is premium
|
|
SELECT is_premium INTO partner_premium
|
|
FROM public.profiles
|
|
WHERE couple_id = user_couple_id
|
|
AND id != check_user_id
|
|
LIMIT 1;
|
|
|
|
RETURN COALESCE(partner_premium, FALSE);
|
|
END;
|
|
$$ LANGUAGE plpgsql SECURITY DEFINER STABLE;
|