Data: 25/10/2023 (Atualizado) Status: ✅ Resolvido
A análise revelou inconsistências entre a documentação anterior (RELATORIO_FIREBASE.md), o código atual e as especificações da missão. As correções foram aplicadas: o campo lastLoginAt foi adicionado à stack completa. O código de saveUser mantém lógica de limpeza depreciada necessária para hasOnly. unlockedWorlds está corretamente validado nas regras.
- Sincronização
questions: Campos TS correspondem ao serviço; Rules (leitura pública/escrita admin) adequadas. - Validação
unlockedWorlds: O campo está presente e validado como lista emfirestore.rules. - Campo
lastLoginAt: Adicionado em TS (UserData), Service (saveUser/getUser) e Rules (hasOnly/isValidTimestamp). - Limites Numéricos:
displayName,totalScore,attempts,streakpossuem limites adequados. - Segurança: Regras de
isOwnere validação de escrita estrita (hasOnly) implementadas.
- Localização:
src/firebase/firestore.ts(linha ~135) vsRELATORIO_FIREBASE.md - Descrição: O relatório anterior afirma que a lógica de limpeza de campos depreciados foi removida, mas o código
saveUserainda executastreak: deleteField(), etc. - Impacto: Confusão na manutenção. O código atual está correto para garantir a integridade com
hasOnly, mas o relatório está desatualizado. - Sugestão: Atualizar o relatório (feito aqui) ou refatorar se a limpeza não for mais necessária (provavelmente é necessária devido ao
hasOnly).
- Localização:
firestore.rules(match/gamification/{userId}) - Descrição:
achievementseactiveMissionssão validados apenas como listas (is list), sem verificação da estrutura interna. - Impacto: Um cliente malicioso poderia injetar objetos com formato inválido nessas listas.
- Sugestão: Implementar validação estrutural se possível, ou confiar na validação do serviço (risco aceito).
- Localização:
firestore.rules - Descrição: A regra permite score 0-9999. A verificação solicitada questionava o limite 0-1000.
- Impacto: Baixo. O limite atual (9999) é mais permissivo e seguro para pontuações altas.
- Sugestão: Manter 9999 ou ajustar se houver requisito estrito de negócio para 1000.
Nenhum problema crítico de segurança imediata bloqueante encontrado, mas a ausência de lastLoginAt pode ser bloqueante para novas features.
| Coleção | Campo TypeScript | Campo Rules | Status |
|---|---|---|---|
| users | displayName | displayName | ✅ |
| users | unlockedWorlds | unlockedWorlds | ✅ (Presente) |
| users | lastLoginAt | lastLoginAt | ✅ (Adicionado) |
| gamification | achievements | achievements | |
| userProgress | score | score (0-9999) | ✅ |