Pular para conteúdo

Campanhas e curadoria

Campanhas

Campanhas vivem em campaigns e usam Cloud Functions para mutações privilegiadas.

Super Admin

  • createCampaign: cria em draft e 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

  • joinCampaign cria/atualiza campaign_participations para interested;
  • withdrawCampaignParticipation marca withdrawn quando permitido;
  • submitCampaignOffer valida janela de submissão, propriedade das stores e cria uma oferta por unidade selecionada, com source=campaign e status=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.