Ajout d'utilisateur OK
Ajout bouton de deconnexion
This commit is contained in:
90
em2rp/firestore.rules
Normal file
90
em2rp/firestore.rules
Normal file
@ -0,0 +1,90 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user