90 lines
3.0 KiB
Plaintext
90 lines
3.0 KiB
Plaintext
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;
|
|
}
|
|
}
|
|
} |