-- Tables de messagerie interne (V1) CREATE TABLE IF NOT EXISTS public.messagerie_threads ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS public.messagerie_participants ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), thread_id UUID NOT NULL REFERENCES public.messagerie_threads(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES public.utilisateurs(id) ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(thread_id, user_id) ); CREATE TABLE IF NOT EXISTS public.messagerie_messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), thread_id UUID NOT NULL REFERENCES public.messagerie_threads(id) ON DELETE CASCADE, sender_id UUID NOT NULL REFERENCES public.utilisateurs(id) ON DELETE CASCADE, contenu TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_messagerie_participants_user_id ON public.messagerie_participants(user_id); CREATE INDEX IF NOT EXISTS idx_messagerie_messages_thread_id ON public.messagerie_messages(thread_id); CREATE INDEX IF NOT EXISTS idx_messagerie_messages_created_at ON public.messagerie_messages(created_at DESC); -- RLS simple: participant du thread uniquement ALTER TABLE public.messagerie_threads ENABLE ROW LEVEL SECURITY; ALTER TABLE public.messagerie_participants ENABLE ROW LEVEL SECURITY; ALTER TABLE public.messagerie_messages ENABLE ROW LEVEL SECURITY; DROP POLICY IF EXISTS messagerie_threads_select ON public.messagerie_threads; CREATE POLICY messagerie_threads_select ON public.messagerie_threads FOR SELECT TO anon USING ( EXISTS ( SELECT 1 FROM public.messagerie_participants p WHERE p.thread_id = messagerie_threads.id ) ); DROP POLICY IF EXISTS messagerie_threads_insert ON public.messagerie_threads; CREATE POLICY messagerie_threads_insert ON public.messagerie_threads FOR INSERT TO anon WITH CHECK (true); DROP POLICY IF EXISTS messagerie_threads_update ON public.messagerie_threads; CREATE POLICY messagerie_threads_update ON public.messagerie_threads FOR UPDATE TO anon USING ( EXISTS ( SELECT 1 FROM public.messagerie_participants p WHERE p.thread_id = messagerie_threads.id ) ) WITH CHECK (true); DROP POLICY IF EXISTS messagerie_participants_select ON public.messagerie_participants; CREATE POLICY messagerie_participants_select ON public.messagerie_participants FOR SELECT TO anon USING (true); DROP POLICY IF EXISTS messagerie_participants_insert ON public.messagerie_participants; CREATE POLICY messagerie_participants_insert ON public.messagerie_participants FOR INSERT TO anon WITH CHECK (true); DROP POLICY IF EXISTS messagerie_messages_select ON public.messagerie_messages; CREATE POLICY messagerie_messages_select ON public.messagerie_messages FOR SELECT TO anon USING ( EXISTS ( SELECT 1 FROM public.messagerie_participants p WHERE p.thread_id = messagerie_messages.thread_id ) ); DROP POLICY IF EXISTS messagerie_messages_insert ON public.messagerie_messages; CREATE POLICY messagerie_messages_insert ON public.messagerie_messages FOR INSERT TO anon WITH CHECK ( EXISTS ( SELECT 1 FROM public.messagerie_participants p WHERE p.thread_id = messagerie_messages.thread_id AND p.user_id = messagerie_messages.sender_id ) );