espace-paie-odentas/supabase/migrations/20251009_documents_rls.sql
2025-10-12 17:05:46 +02:00

128 lines
4.2 KiB
SQL

-- Migration RLS pour la table documents
-- Permet aux clients d'accéder uniquement à leurs documents
-- et au staff d'accéder à tous les documents
-- Activer RLS sur la table documents
ALTER TABLE public.documents ENABLE ROW LEVEL SECURITY;
-- Supprimer les politiques existantes si elles existent
DROP POLICY IF EXISTS "documents_staff_read" ON public.documents;
DROP POLICY IF EXISTS "documents_staff_insert" ON public.documents;
DROP POLICY IF EXISTS "documents_staff_update" ON public.documents;
DROP POLICY IF EXISTS "documents_staff_delete" ON public.documents;
DROP POLICY IF EXISTS "documents_client_read" ON public.documents;
DROP POLICY IF EXISTS "documents_system_insert" ON public.documents;
DROP POLICY IF EXISTS "documents_system_update" ON public.documents;
DROP POLICY IF EXISTS "documents_system_delete" ON public.documents;
-- Politique de lecture pour le staff : accès à tous les documents
CREATE POLICY "documents_staff_read" ON public.documents
FOR SELECT
TO authenticated
USING (
EXISTS (
SELECT 1 FROM public.staff_users s
WHERE s.user_id = auth.uid()
AND COALESCE(s.is_staff, false) = true
)
);
-- Politique d'insertion pour le staff
CREATE POLICY "documents_staff_insert" ON public.documents
FOR INSERT
TO authenticated
WITH CHECK (
EXISTS (
SELECT 1 FROM public.staff_users s
WHERE s.user_id = auth.uid()
AND COALESCE(s.is_staff, false) = true
)
);
-- Politique de mise à jour pour le staff
CREATE POLICY "documents_staff_update" ON public.documents
FOR UPDATE
TO authenticated
USING (
EXISTS (
SELECT 1 FROM public.staff_users s
WHERE s.user_id = auth.uid()
AND COALESCE(s.is_staff, false) = true
)
)
WITH CHECK (
EXISTS (
SELECT 1 FROM public.staff_users s
WHERE s.user_id = auth.uid()
AND COALESCE(s.is_staff, false) = true
)
);
-- Politique de suppression pour le staff
CREATE POLICY "documents_staff_delete" ON public.documents
FOR DELETE
TO authenticated
USING (
EXISTS (
SELECT 1 FROM public.staff_users s
WHERE s.user_id = auth.uid()
AND COALESCE(s.is_staff, false) = true
)
);
-- Politique de lecture pour les clients : accès uniquement aux documents de leur organisation
CREATE POLICY "documents_client_read" ON public.documents
FOR SELECT
TO authenticated
USING (
EXISTS (
SELECT 1 FROM public.organization_members m
WHERE m.user_id = auth.uid()
AND m.revoked = false
AND m.org_id = documents.org_id
)
);
-- Politique d'insertion pour le système (service role)
CREATE POLICY "documents_system_insert" ON public.documents
FOR INSERT
WITH CHECK (true);
-- Politique de mise à jour pour le système (service role)
CREATE POLICY "documents_system_update" ON public.documents
FOR UPDATE
USING (true)
WITH CHECK (true);
-- Politique de suppression pour le système (service role)
CREATE POLICY "documents_system_delete" ON public.documents
FOR DELETE
USING (true);
-- Créer un index sur org_id pour optimiser les requêtes RLS
CREATE INDEX IF NOT EXISTS idx_documents_org_id ON public.documents(org_id);
-- Créer un index sur category pour optimiser le filtrage par catégorie
CREATE INDEX IF NOT EXISTS idx_documents_category ON public.documents(category);
-- Créer un index composite pour les requêtes fréquentes (org + category)
CREATE INDEX IF NOT EXISTS idx_documents_org_category ON public.documents(org_id, category);
-- Créer un index sur date_added pour le tri chronologique
CREATE INDEX IF NOT EXISTS idx_documents_date_added ON public.documents(date_added DESC);
-- Test de vérification : cette requête devrait retourner TRUE si vous êtes staff
SELECT EXISTS (
SELECT 1 FROM public.staff_users
WHERE staff_users.user_id = auth.uid()
AND COALESCE(staff_users.is_staff, false) = true
) as is_current_user_staff;
-- Test de vérification : liste des organisations auxquelles l'utilisateur a accès
SELECT DISTINCT org_id
FROM public.organization_members
WHERE user_id = auth.uid()
AND revoked = false;
-- Commentaire sur la table pour documentation
COMMENT ON TABLE public.documents IS 'Documents migré depuis Airtable vers S3/Supabase. RLS activé pour sécuriser l''accès par organisation.';