Firestore Rules

rules_version = '2';
service cloud.firestore {
  match /databases/{db}/documents {
    function isAdmin() {
      return request.auth != null &&
        exists(/databases/$(db)/documents/admins/$(request.auth.uid));
    }
    function me(uid) { return request.auth != null && request.auth.uid == uid; }

    match /admins/{uid} {
      allow read: if me(uid);
      allow write: if false;
    }
    match /settings/{d} { allow read: if true; allow write: if isAdmin(); }
    match /products/{d} { allow read: if true; allow write: if isAdmin(); }
    match /banners/{d} { allow read: if true; allow write: if isAdmin(); }
    match /publicOrders/{d} { allow read: if true; allow write: if isAdmin(); }

    match /users/{uid} {
      allow read: if me(uid) || isAdmin();
      allow create: if me(uid)
        && request.resource.data.points <= 10
        && request.resource.data.wallet == 0;
      allow update: if isAdmin() || (me(uid)
        && request.resource.data.wallet == resource.data.wallet
        && request.resource.data.points <= resource.data.points);
    }
    match /orders/{id} {
      allow create: if me(request.resource.data.uid)
        && request.resource.data.status == 'pending';
      allow read: if isAdmin() || me(resource.data.uid);
      allow update, delete: if isAdmin();
    }
    match /commissions/{id} {
      allow read: if isAdmin() || me(resource.data.to);
      allow write: if isAdmin();
    }
    match /chats/{cid} {
      allow read, write: if me(cid) || isAdmin();
      match /messages/{m} { allow read, write: if me(cid) || isAdmin(); }
    }
  }
}