128 lines
4.2 KiB
SQL
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.';
|