91 lines
3.3 KiB
SQL
91 lines
3.3 KiB
SQL
-- 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
|
|
)
|
|
);
|
|
|