Pular para conteúdo

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:

  1. reproduza no Emulator quando possível;
  2. adicione índice em firestore.indexes.json;
  3. valide query e Rules juntas;
  4. 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.