rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { function signedIn() { return request.auth != null; } function isAdmin() { return signedIn() && exists(/databases/$(database)/documents/admins/$(request.auth.uid)); } // অ্যাডমিন তালিকা — শুধু Firebase Console থেকে ডকুমেন্ট বানাতে হবে match /admins/{uid} { allow read: if signedIn() && request.auth.uid == uid; allow write: if false; } // সবাই পড়তে পারবে, শুধু অ্যাডমিন লিখতে পারবে match /settings/{id} { allow read: if true; allow write: if isAdmin(); } match /products/{id} { allow read: if true; allow write: if isAdmin(); } match /banners/{id} { allow read: if true; allow write: if isAdmin(); } match /publicOrders/{id} { allow read: if true; allow write: if isAdmin(); } // রেফার কোড -> uid ম্যাপ match /refCodes/{code} { allow read: if true; allow create: if signedIn() && request.resource.data.uid == request.auth.uid && request.resource.data.keys().hasOnly(['uid']); allow update, delete: if isAdmin(); } // কাস্টমার প্রোফাইল match /users/{uid} { allow read: if isAdmin() || (signedIn() && request.auth.uid == uid); // সাইন আপে ১০ পয়েন্ট ফিক্সড (বদলাতে চাইলে নিচের 10 বদলান) allow create: if signedIn() && request.auth.uid == uid && request.resource.data.points == 10 && request.resource.data.wallet == 0 && request.resource.data.totalSpent == 0; // কাস্টমার শুধু পয়েন্ট কমাতে পারবে (চেকআউটে ব্যবহার), বাড়াতে পারবে না allow update: if isAdmin() || (signedIn() && request.auth.uid == uid && request.resource.data.diff(resource.data).affectedKeys().hasOnly(['points']) && request.resource.data.points <= resource.data.points && request.resource.data.points >= 0); allow delete: if isAdmin(); } // অর্ডার match /orders/{id} { allow create: if signedIn() && request.resource.data.uid == request.auth.uid && request.resource.data.status == 'pending'; allow read: if isAdmin() || (signedIn() && resource.data.uid == request.auth.uid); allow update, delete: if isAdmin(); } // রেফার কমিশন লগ match /commissions/{id} { allow read: if isAdmin() || (signedIn() && resource.data.to == request.auth.uid); allow write: if isAdmin(); } // লাইভ চ্যাট match /chats/{uid} { allow read, write: if isAdmin() || (signedIn() && request.auth.uid == uid); match /messages/{mid} { allow read: if isAdmin() || (signedIn() && request.auth.uid == uid); allow create: if isAdmin() || (signedIn() && request.auth.uid == uid && request.resource.data.from == 'user'); allow update, delete: if isAdmin(); } } } }