Campanhas e curadoria¶
Campanhas¶
Campanhas vivem em campaigns e usam Cloud Functions para mutações privilegiadas.
Super Admin¶
createCampaign: cria emdrafte garante slug único;updateCampaign: altera campanha apenas em estados editáveis;changeCampaignStatus: aplica matriz de transições no backend.
Leituras são feitas pelo CampaignRepositoryImpl; criação/edição/status usam Functions.
Parceiro¶
joinCampaigncria/atualizacampaign_participationsparainterested;withdrawCampaignParticipationmarcawithdrawnquando permitido;submitCampaignOffervalida janela de submissão, propriedade das stores e cria uma oferta por unidade selecionada, comsource=campaignestatus=pending_review.
Curadoria de ofertas¶
curateOffer exige custom claim super_admin == true e aceita:
| Ação | Efeito principal |
|---|---|
approve |
status = active |
reject |
status = rejected + motivo obrigatório |
request_adjustments |
status = pending_review + notas |
set_tier |
visibilityTier = free|premium |
A Function também registra curatedBy, curatedAt, lastAdminActionBy, lastAdminActionAt, updatedBy e updatedByRole.
Criação administrativa¶
createOfferAsAdmin permite ao Super Admin criar uma oferta em nome de um parceiro sem falsificar autoria.
Valida partner, store, vínculo store→partner, preços, tipo, datas, status e quota. O documento recebe:
createdBy = UID real do Super Admin
createdByRole = super_admin
createdByAdmin = true
createdOnBehalfOfPartnerId = partner representado
createdOnBehalfOfRestaurantId = unidade representada
Observação administrativa opcional é gravada em offers/{offerId}/admin_notes/current, uma subcoleção privada ao Super Admin.
Delete¶
Clientes não podem deletar offers diretamente pelas Firestore Rules. O fluxo atual passa por deleteOffer, que registra contexto privado de deleção antes de remover o documento.
Há uma limitação conhecida: o callable preserva a regra de autoria do criador para partners; portanto, uma oferta criada por Super Admin em nome do partner pode exigir caminho administrativo para exclusão. Não contorne isso habilitando delete genérico nas Rules.
Schedulers de campanha¶
campaignAutoTransitions e closeExpiredCampaigns são controlados também pelo documento settings/schedulers, com defaults de 5 e 10 minutos, respectivamente. Configuração operacional não substitui validação de status/janela nas Functions.