Firestore e Storage¶
Firestore Rules¶
Users e subscriptions¶
O usuário pode ler/editar o próprio documento, mas campos de Premium/Stripe são bloqueados para writes do cliente. subscriptions/{userId} é somente leitura para o dono/Super Admin e backend-only para escrita.
Partners e stores¶
Partner autenticado pode manter seus próprios dados e stores, respeitando campos de curadoria bloqueados. Super Admin possui acesso ampliado.
Offers¶
Leitura exige autenticação. Criação direta por partner exige:
- autoria igual ao UID autenticado;
createdByRole=partner;createdByAdmin=false;- source regular;
- store pertencente ao partner;
- tier
free; - status
pending_review; - contadores de quota iniciando em zero.
Updates de partner não podem alterar campos de autoria, curadoria nem contadores operacionais. Delete direto é negado.
Coupon redemptions¶
coupon_redemptions é backend-only para escrita. Leitura é permitida ao dono, Super Admin, partner dono ou sessão de garçom válida quando o cupom aguarda check-in.
Campanhas¶
Clientes não escrevem campaigns nem campaign_participations diretamente; mutações passam por Functions.
Default deny¶
A regra final nega qualquer caminho não declarado.
Subcoleções privadas de oferta¶
offers/{offerId}/admin_notes/{noteId}
offers/{offerId}/deletion_context/{contextId}
offers/{offerId}/audit_logs/{logId}
admin_notes e deletion_context são somente leitura para Super Admin; writes são backend-only. audit_logs também pode ser lido pelo partner dono da oferta.
Storage Rules¶
| Prefixo | Leitura | Escrita |
|---|---|---|
offers/{partnerId}/... |
pública | partner dono, somente imagem < 8 MiB |
stores/{partnerId}/... |
pública | partner dono, somente imagem < 8 MiB |
campaigns/{campaignSlug}/... |
pública | Super Admin, somente imagem < 8 MiB |
public/... |
pública | Super Admin, somente imagem < 8 MiB |
Qualquer outro caminho é negado.
Índices e evolução¶
Ao adicionar query composta:
- reproduza no Emulator quando possível;
- adicione índice em
firestore.indexes.json; - valide query e Rules juntas;
- documente qualquer campo novo que faça parte de autorização ou transação.
Não use Rules como substituto de transaction para quota/concorrência: Rules protegem acesso, enquanto Functions garantem a atualização atômica de estado relacionado.