
{
  "rules": {
    "streams": {
      ".read": true,
      ".indexOn": ["creatorId", "status"],
      "$streamId": {
        "name": {
          ".write": "(auth != null && ((!data.exists() && newData.exists()) || (data.exists() && (root.child('streams').child($streamId).child('creatorId').val() === auth.uid || root.child('users').child(auth.uid).child('role').val() === 'admin')))) || (data.exists() && newData.val() === data.val())",
          ".validate": "newData.isString() && newData.val().length > 0"
        },
        "sourceUrls": {
          ".write": "(auth != null && ((!data.exists() && newData.exists()) || (data.exists() && (root.child('streams').child($streamId).child('creatorId').val() === auth.uid || root.child('users').child(auth.uid).child('role').val() === 'admin')))) || (data.exists() && newData.exists() && data.val() === newData.val())",
          ".validate": "newData.hasChildren()"
        },
        "description": {
          ".write": "(auth != null && ((!data.exists() && newData.exists()) || (data.exists() && (root.child('streams').child($streamId).child('creatorId').val() === auth.uid || root.child('users').child(auth.uid).child('role').val() === 'admin')))) || (data.exists() && newData.val() === data.val())",
          ".validate": "newData.isString()"
        },
        "views": {
          ".write": true,
          ".validate": "newData.isNumber() && ((!data.exists() && newData.val() === 0) || (data.exists() && newData.val() === data.val() + 1) || (auth != null && root.child('users').child(auth.uid).child('role').val() === 'admin'))"
        },
        "creatorId": {
          ".write": "!data.exists() && auth != null",
          ".validate": "(!data.exists() && newData.isString() && newData.val() === auth.uid) || (data.exists() && newData.val() === data.val())"
        },
        "status": {
          ".write": "(auth != null && ((!data.exists() && newData.val() === 'pending') || (data.exists() && ((newData.val() === 'pending_deletion' && root.child('streams').child($streamId).child('creatorId').val() === auth.uid) || root.child('users').child(auth.uid).child('role').val() === 'admin')))) || (data.exists() && newData.val() === data.val())",
          ".validate": "newData.isString() && (newData.val() === 'pending' || newData.val() === 'approved' || newData.val() === 'pending_deletion' || newData.val() === 'deleted' || newData.val() === 'rejected' || newData.val() === 'disabled')"
        },
        "createdAt": {
          ".write": "!data.exists() && auth != null",
          ".validate": "(!data.exists() && newData.val() === now) || (data.exists() && newData.val() === data.val())"
        },
        "deletedAt": {
          ".write": "(auth != null && root.child('users').child(auth.uid).child('role').val() === 'admin') || (data.exists() && newData.val() === data.val())",
          ".validate": "newData.val() === now || !newData.exists()"
        },
        "likes": {
          ".write": "auth != null || (data.exists() && newData.exists() && data.val() === newData.val()) || (!data.exists() && !newData.exists())",
          "$uid": {
            ".write": "auth != null && auth.uid === $uid",
            ".validate": "newData.isBoolean() || !newData.exists()"
          }
        },
        "comments": {
          ".write": "auth != null || (data.exists() && newData.exists() && data.val() === newData.val()) || (!data.exists() && !newData.exists())",
          "$commentId": {
            ".write": "auth != null",
            ".validate": "newData.hasChildren(['id', 'userId', 'username', 'text', 'timestamp']) && newData.child('userId').val() === auth.uid",
            "id": { ".validate": "newData.isString() && newData.val() === $commentId" },
            "userId": { ".validate": "newData.isString() && newData.val() === auth.uid" },
            "username": { ".validate": "newData.isString()" },
            "text": { ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 500" },
            "timestamp": { ".validate": "newData.val() === now" },
            "$other": { ".validate": false }
          }
        },
        "$other": { ".validate": false }
      }
    },
    "videos": {
      ".read": true,
      ".indexOn": ["creatorId", "status"],
      "$videoId": {
        ".write": "auth != null",
        "creatorId": { ".validate": "newData.isString() && newData.val() === auth.uid" },
        "status": {
          ".validate": "newData.val() === 'pending' || (root.child('users').child(auth.uid).child('role').val() === 'admin')"
        },
        "title": { ".validate": "newData.isString() && newData.val().length > 0" },
        "createdAt": { ".validate": "newData.val() === now || data.exists()" },
        "actionedAt": { ".validate": "newData.val() === now || !newData.exists()" },
        "description": { ".validate": "newData.isString()" },
        "fileName": { ".validate": "newData.isString()" },
        "fileType": { ".validate": "newData.isString()" },
        "duration": { ".validate": "newData.isNumber()" },
        "submittedAt": { ".validate": "newData.isString()" },
        "videoStorageUrl": { ".validate": "newData.isString()" },
        "$other": { ".validate": false }
      }
    },
    "users": {
      ".read": true,
      "$uid": {
        ".write": "auth != null && auth.uid === $uid"
      }
    }
  }
}

    