rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // Fonction pour vérifier si l'utilisateur est authentifié function isAuthenticated() { return request.auth != null; } function getUserRole() { let userData = get(/databases/$(database)/documents/users/$(request.auth.uid)).data; return userData != null ? userData.role : null; } // Fonction pour vérifier si l'utilisateur est un admin function isAdmin() { return isAuthenticated() && getUserRole() == 'ADMIN'; } function isOwner(userId) { return isAuthenticated() && request.auth.uid == userId; } // Nouvelle fonction pour vérifier si un CREW est assigné à un événement du client function isAssignedToClientEvent(clientId) { let events = getAfter(/databases/$(database)/documents/events) .where("clientId", "==", clientId) .where("assignedUsers." + request.auth.uid, "==", true).limit(1); return events.size() > 0; } // Fonction pour vérifier si c'est le premier utilisateur function isFirstUser() { return !exists(/databases/$(database)/documents/users); } // Fonction pour vérifier si c'est une mise à jour de l'UID function isUidUpdate() { return request.resource.data.diff(resource.data).affectedKeys().hasOnly(['uid']); } // Règles pour la collection users match /users/{userId} { allow read: if isAuthenticated() && (isAdmin() || isOwner(userId)); // Permettre la création si admin OU si l'utilisateur crée son propre document allow create: if isAdmin() || (isAuthenticated() && request.auth.uid == userId); allow update: if isAdmin() || (isOwner(userId) && request.resource.data.diff(resource.data).affectedKeys() .hasOnly(['phoneNumber', 'profilePhotoUrl', 'firstName', 'lastName', 'role'])); allow delete: if isAdmin(); } // Règles pour la collection clients match /clients/{clientId} { // Lecture : // - Les admins peuvent tout voir // - Les CREW ne peuvent voir que les clients liés à leurs événements allow read: if isAdmin() || (getUserRole() == 'CREW' && isAssignedToClientEvent(clientId)); // Création, modification et suppression : Seuls les admins allow create, update, delete: if isAdmin(); } // Règles pour la collection events (prestations) match /events/{eventId} { allow read: if isAdmin() || (isAuthenticated() && (resource.data.assignedUsers[request.auth.uid] == true)); allow create, update: if isAdmin(); allow delete: if isAdmin(); } // Règles pour la collection quotes (devis) match /quotes/{quoteId} { allow read, write: if isAdmin(); } // Règles pour la collection invoices (factures) match /invoices/{invoiceId} { allow read, write: if isAdmin(); } // Règles pour les autres collections match /{document=**} { // Par défaut, refuser l'accès allow read, write: if false; } } }