-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfirestore-SEGURO.rules
More file actions
206 lines (171 loc) · 7.58 KB
/
Copy pathfirestore-SEGURO.rules
File metadata and controls
206 lines (171 loc) · 7.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// ============================================
// FUNCIONES AUXILIARES DE VALIDACIÓN
// ============================================
// Verificar si el usuario está autenticado
function isSignedIn() {
return request.auth != null;
}
// ✅ MEJORADO: Verificar si el usuario es admin
function isAdmin() {
return isSignedIn() &&
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin';
}
// Verificar si el usuario está activo
function isActiveUser() {
return isSignedIn() &&
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isActive == true;
}
// ✅ NUEVA: Validar datos de cliente
function isValidClientData() {
let req = request.resource.data;
return req.keys().hasAll(['name', 'email', 'executiveId']) &&
req.name is string && req.name.size() > 0 && req.name.size() <= 100 &&
req.email is string && req.email.matches('.*@.*\\..*') &&
req.executiveId is string && req.executiveId.size() > 0;
}
// ✅ NUEVA: Validar datos de venta
function isValidSalesData() {
let req = request.resource.data;
return req.keys().hasAll(['amount', 'executiveId']) &&
req.amount is number && req.amount > 0 &&
req.executiveId is string && req.executiveId.size() > 0;
}
// ✅ NUEVA: Validar datos de meta
function isValidGoalData() {
let req = request.resource.data;
return req.keys().hasAll(['target', 'period']) &&
req.target is number && req.target > 0;
}
// ============================================
// REGLAS PARA COLECCIÓN 'users'
// ============================================
match /users/{userId} {
// Solo admins pueden leer/escribir datos de cualquier usuario
allow read, list, create, update, delete: if isAdmin();
// Los usuarios pueden leer solo su propio documento
allow read: if isSignedIn() && request.auth.uid == userId;
// Los usuarios pueden actualizar solo ciertos campos de su propio documento
allow update: if isSignedIn() &&
request.auth.uid == userId &&
!request.resource.data.diff(resource.data).affectedKeys().hasAny(['role', 'isActive', 'email']);
}
// ============================================
// REGLAS PARA COLECCIÓN 'clients'
// ============================================
match /clients/{clientId} {
// Los usuarios activos pueden leer solo sus propios clientes
allow read: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid;
// Los admins pueden leer todos los clientes
allow read: if isAdmin();
// ✅ MEJORADO: Crear clientes con validación de datos
allow create: if isSignedIn() &&
isActiveUser() &&
request.resource.data.executiveId == request.auth.uid &&
isValidClientData();
// ✅ MEJORADO: Actualizar solo propios clientes con validación
allow update: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid &&
isValidClientData();
// Eliminar solo propios clientes
allow delete: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid;
// Los admins pueden hacer todo con cualquier cliente
allow read, write: if isAdmin();
}
// Permitir listar clientes (paginación)
match /clients/{document=**} {
allow list: if isSignedIn() && isActiveUser();
}
// ============================================
// REGLAS PARA COLECCIÓN 'ventas' (Sales)
// ============================================
match /ventas/{ventaId} {
// Los usuarios activos pueden leer sus propias ventas
allow read: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid;
// Los admins pueden leer todas las ventas
allow read: if isAdmin();
// ✅ MEJORADO: Crear ventas con validación
allow create: if isSignedIn() &&
isActiveUser() &&
request.resource.data.executiveId == request.auth.uid &&
isValidSalesData();
// ✅ MEJORADO: Actualizar solo propias ventas con validación
allow update: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid &&
isValidSalesData();
// Eliminar solo propias ventas
allow delete: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid;
// Los admins pueden hacer todo
allow read, write: if isAdmin();
}
// Permitir listar ventas
match /ventas/{document=**} {
allow list: if isSignedIn() && isActiveUser();
}
// ============================================
// REGLAS PARA COLECCIÓN 'metas' (Goals)
// ============================================
match /metas/{metaId} {
// Los usuarios activos pueden leer sus propias metas
allow read: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid;
// Los admins pueden leer todas las metas
allow read: if isAdmin();
// ✅ MEJORADO: Crear metas con validación
allow create: if isSignedIn() &&
isActiveUser() &&
request.resource.data.executiveId == request.auth.uid &&
isValidGoalData();
// ✅ MEJORADO: Actualizar solo propias metas con validación
allow update: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid &&
isValidGoalData();
// Eliminar solo propias metas
allow delete: if isSignedIn() &&
isActiveUser() &&
resource.data.executiveId == request.auth.uid;
// Los admins pueden hacer todo
allow read, write: if isAdmin();
}
// Permitir listar metas
match /metas/{document=**} {
allow list: if isSignedIn() && isActiveUser();
}
// ============================================
// REGLAS PARA COLECCIÓN 'audit_logs' (Auditoría)
// ============================================
match /audit_logs/{logId} {
// Solo admins pueden leer logs
allow read, list: if isAdmin();
// Solo Cloud Functions pueden escribir (mediante regla especial)
allow write: if false;
}
// ============================================
// REGLAS PARA COLECCIÓN 'rate_limits' (Control de Tasa)
// ============================================
match /rate_limits/{limitId} {
// Solo Cloud Functions pueden escribir
allow read, write: if false;
}
// ============================================
// REGLA POR DEFECTO: DENEGAR TODO
// ============================================
match /{document=**} {
allow read, write: if false;
}
}
}