@luansemz muito bom seu projeto cara! Parabéns.
Fiz algo parecido aqui na empresa, usamos o firebase faz 6 anos, e encontramos algumas pedras que nos fizeram criar nossa lib intermediária. Vou tentar compartilhar dois pontos que solucionamos.
Consistência.
Toda vez que chamamos um documento, fazemos da seguinte forma ex:
db.users.get({where: []})
O mais importante é como os dados chegam.
imagine que temos dois usuários criados em versões diferentes do software
{
name: 'Rafael',
age: 20
},
{
name: 'Maria',
age: 30
adress: {
street: 'Baker Street'
}
},
Em nossa lib ele iria criar os campos que faltam quando fosse carregando no front, para nao causar bugs
{
name: 'Rafael',
age: 20,
adress: {
street: '' // propriedade criada
}
},
{
name: 'Maria',
age: 30
adress: {
street: 'Baker Street'
}
},
Claro que também temos a rotina de normalizar os dados no banco, este artifício é apenas para garantir... vai que dá merda né kkk
Segmentação de documentos
outra coisa que nossa lib faz é segmentar documentos de acordo com a permissão do usuário.
Quando eu faço a mesma chamada
db.users.get({where: []})
Ele só trará os usuários que você possui a permissão de ler (não é permissão dos rules, se só tiver no rules, pode quebrar a aplicação), por exemplo, os usuários da sua empresa.
Isto é feito com um outro where que já está interno neste meu db.users.get, ele já filtra somente os usuários que pertencem a mesma organização.
Fim
Bem, poderia ficar falando aqui o dia inteiro sobre algumas formas e malabares que fazemos no firebase para conseguir uma performance e qualidades incríveis... mas para não chatear vocês, por hoje é só.