rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { function isAdmin() { return request.auth != null && request.auth.uid == "dev-admin-placeholder-uid"; } match /products/{productId} { allow read: if true; allow write: if isAdmin(); } match /services/{serviceId} { allow read: if true; allow write: if isAdmin(); } match /scheduleTemplate/{docId} { allow read: if true; allow write: if isAdmin(); } match /scheduleExceptions/{date} { allow read: if true; allow write: if isAdmin(); } match /bookedSlots/{date} { allow read: if true; allow write: if isAdmin(); } match /bookings/{bookingId} { allow create: if request.resource.data.keys().hasAll(['serviceId', 'date', 'time', 'contact', 'status']) && request.resource.data.date is string && request.resource.data.date.matches('^[0-9]{4}-[0-9]{2}-[0-9]{2}$') && request.resource.data.time is string && request.resource.data.contact is map && request.resource.data.contact.keys().hasAll(['name', 'phone', 'email', 'notes']) && request.resource.data.status is string; allow read, update, delete: if isAdmin(); } match /inquiries/{inquiryId} { allow create: if request.resource.data.keys().hasAll(['productId', 'contact', 'status']) && request.resource.data.productId is string && request.resource.data.contact is map && request.resource.data.contact.keys().hasAll(['name', 'email', 'notes']) && request.resource.data.status is string; allow read, update, delete: if isAdmin(); } } }