rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // Fonction helper pour vérifier si l'utilisateur est authentifié function isAuthenticated() { return request.auth != null; } // Fonction helper pour vérifier si l'utilisateur est propriétaire function isOwner(userId) { return isAuthenticated() && request.auth.uid == userId; } // Règles pour la collection users match /users/{userId} { // Lecture : l'utilisateur peut lire ses propres données ou celles partagées avec lui allow read: if isOwner(userId) || (isAuthenticated() && resource.data.sharedWith != null && request.auth.uid in resource.data.sharedWith); // Écriture : uniquement le propriétaire allow create: if isOwner(userId); allow update: if isOwner(userId); allow delete: if isOwner(userId); } // Règles pour la collection transactions match /transactions/{transactionId} { // Lecture : l'utilisateur peut lire ses propres transactions allow read: if isAuthenticated() && resource.data.userId == request.auth.uid; // Création : l'utilisateur peut créer ses propres transactions allow create: if isAuthenticated() && request.resource.data.userId == request.auth.uid && request.resource.data.keys().hasAll(['userId', 'type', 'amount', 'category', 'date', 'createdAt', 'updatedAt']); // Mise à jour : uniquement le propriétaire allow update: if isAuthenticated() && resource.data.userId == request.auth.uid && request.resource.data.userId == resource.data.userId; // Suppression : uniquement le propriétaire allow delete: if isAuthenticated() && resource.data.userId == request.auth.uid; } // Règles pour la collection categories match /categories/{categoryId} { // Lecture : l'utilisateur peut lire ses propres catégories allow read: if isAuthenticated() && resource.data.userId == request.auth.uid; // Création : l'utilisateur peut créer ses propres catégories allow create: if isAuthenticated() && request.resource.data.userId == request.auth.uid && request.resource.data.keys().hasAll(['userId', 'name', 'icon', 'color', 'type']); // Mise à jour : uniquement le propriétaire allow update: if isAuthenticated() && resource.data.userId == request.auth.uid && request.resource.data.userId == resource.data.userId; // Suppression : uniquement le propriétaire allow delete: if isAuthenticated() && resource.data.userId == request.auth.uid; } // Règles pour la collection subscriptions match /subscriptions/{subscriptionId} { // Lecture : l'utilisateur peut lire ses propres abonnements allow read: if isAuthenticated() && resource.data.userId == request.auth.uid; // Création : l'utilisateur peut créer ses propres abonnements allow create: if isAuthenticated() && request.resource.data.userId == request.auth.uid && request.resource.data.keys().hasAll(['userId', 'name', 'amount', 'category', 'frequency', 'nextPaymentDate', 'reminderDaysBefore', 'isActive', 'createdAt', 'updatedAt']); // Mise à jour : uniquement le propriétaire allow update: if isAuthenticated() && resource.data.userId == request.auth.uid && request.resource.data.userId == resource.data.userId; // Suppression : uniquement le propriétaire allow delete: if isAuthenticated() && resource.data.userId == request.auth.uid; } } }