2017-02-16 6 views
2

DesignFirebase Правила проверки и проверки ловя неудачу в андроида приложения

  • пользователь, который может войти в приложения
  • Записан пользователи могут создавать клиентов, которые будут храниться под node, значение которого будет вошедшего в идентификатору пользователя

Текущие значения DB

{ 
    "customers" : { 
    "UserId1" : { 
     "custId1" : { 
     "customerCode" : "thk", 
     "customerLimit" : "58866", 
     "customerName" : "Test New " 
     }, 
     "custId2" : { 
     "customerCode" : "thh", 
     "customerLimit" : "5698", 
     "customerName" : "Yeth" 
     } 
    }, 
    "UserId2" : { 
     "custId3" : { 
     "customerCode" : "thh", 
     "customerLimit" : "5886", 
     "customerName" : "Test " 
     }, 
     "custId4" : { 
     "customerCode" : "tbh", 
     "customerLimit" : "58669", 
     "customerName" : "New Test" 
     } 
    } 
    } 
} 

Ниже приведено правило для customers Таблица в firebase.

{ 
    "rules": { 
    "customers":{ 
     ".read": "auth != null", 
     ".write": "auth != null", 
     "$CID":{ 
      "customerName":{ 
       ".validate": "newData.isString() && newData.val().length < 100" 
      }, 
      "customerCode":{ 
       ".validate": "newData.isString() && newData.val().length<4 && !newData.exists()" 
      }, 
      "customerLimit":{} 
     } 
    } 
    } 
} 

Даже если я определил, что правило для customerCode то оно должно иметь значение меньше, чем 4-х символов, оно позволяет вставить 5 символов. Также как я могу добавить проверку, которая проверяет уникальность customerCode для каждого userId? на данный момент он имеет !newData.exists(), но его тоже не работает.

Может ли кто-нибудь направить меня в правильном направлении?

ответ

1

Я думаю, что вы можете вставить до 5 символов, потому что ваш .length для вашего newData.val().lenght начинаются с 0, например array. В другом пути, если вы хотите связать уникальность customerCode для каждого USERID вы должны создать новую таблицу в firebase базы данных, что-то вроде:

{ 
    "customers": { 
    "UserId1": { 
     "custId1": { 
     "customerCode": "customerId1", 
     "customerLimit": "58866", 
     "customerName": "Test New " 
     }, 
     "custId2": { 
     "customerCode": "customerId2", 
     "customerLimit": "5698", 
     "customerName": "Yeth" 
     } 
    }, 
    "UserId2": { 
     "custId3": { 
     "customerCode": "customerId3", 
     "customerLimit": "5886", 
     "customerName": "Test " 
     }, 
     "custId4": { 
     "customerCode": "customerId4", 
     "customerLimit": "58669", 
     "customerName": "New Test" 
     } 
    } 
    } 
    "customerCode": { 
    "custId1": { 
     "customerId1": "thh" 
    } 
    "custId2": { 
     "customerId2": "thk" 
    } 
    "custId3": { 
     "customerId3": "thh" 
    } 
    "custId4": { 
     "customerId4": "tbh" 
    } 
    } 
} 

Используя эту модель, вы можете изменить свои правила, так что-то вроде это:

{ 
    "rules": { 
    "customers": { 
     ".read": "auth != null", 
     ".write": "auth != null", 
     "$CID": { 
     "customerName": { 
      ".validate": "newData.isString() && newData.val().length < 100" 
     }, 
     "customerCode": { 
      //Code shouls be string, less than 4 characters and it can't be already stored on customerCode table for the current userId 
      ".validate": "newData.isString() && newData.val().length<3 && !root.child('customerCode').child(auth.uid).exists()" 
     }, 
     "customerLimit": {} 
     } 
    } 
    "customerCode": { 
     "$CID": { 
     "CustomerCodeId": { 
      ".read": "auth != null", 
      ".write": "auth != null", 
     } 
     } 
    } 
    } 

может быть, правила не являются совершенными в предыдущем примере, но я уверен, что вы можете найти пути о том, как он может умещается в вашем приложении взглянуть о firechat database rules. Я много изучил этот репозиторий. Надеюсь, что это поможет вам!

+0

Прежде всего, спасибо большое за ваше время .. Но это не проблема с массивом, начиная с '0' .. Он принимает также 10 символов. Нет никакой другой работы для добавления правила, где я могу проверить для этой уникальности 'customerCode' за' userID', потому что я чувствую, что дополнительная таблица ссылок будет избыточной ... –

+1

Жаль, что это вам не помогло, так или иначе, взгляните на репозиторий, который я связал с вами выше, это хороший пример с множеством условий для «правил пожарной базы». Что касается вашей таблицы, это будет проще и дешевле на уровне данных, если вы проверите, что уникальный 'CustomerCode' связан с уникальным пользователем, чем проверка того, связан ли какой-либо пользователь всей вашей базы данных с этим« CustomerCode ». Другой способ может быть просто хранить в некотором месте все «CustomerCodes», которые ваши пользователи уже использовали в приложении, и просто проверить, существует ли код, когда новый пользователь хочет его создать. –

+0

. Я могу взять некоторые идеи с вашим предложением для создания уникального 'customerCode' .. Спасибо за ссылку и +1 за ваши усилия .. :) Я постараюсь разрешить это через ссылку, которую вы предоставили, если вообще я могу .. :) –