Pular para o conteúdo principal

Status: Approved · v2 · SPEC-API-ENGAGEMENT-001

depends_on: SPEC-DOMAIN-FEED-001, SPEC-DOMAIN-NOTIFICATION-001, SPEC-DOMAIN-SHARE-001

used_by: IS-MVP-11.1, IS-MVP-11.2, IS-MVP-11.3, IS-MVP-11.4, IS-MVP-12.3

API de feed, notificações, push pago e cards

Conteúdo oficial e compartilhamento externo sem transformar o MVP em rede social de posts livres.

Princípios e padrões

  • Base path /api/v1; JSON UTF-8; chaves em camelCase.
  • Toda resposta usa ApiResponse<T> com ok, data|error e meta contendo requestId e timestamp.
  • IDs são strings opacas; datas são ISO-8601 UTC; dinheiro é inteiro em centavos com moeda BRL.
  • Listas usam page e pageSize no MVP; default 20, máximo 100; metadados ficam em meta.pagination.
  • Endpoints públicos usam DTOs públicos específicos; entidades internas, memberships, saldos e dados privados nunca vazam.
  • Erros de domínio são estáveis e acionáveis; stack traces e detalhes internos não são retornados.
  • Alterações sensíveis usam Idempotency-Key, confirmação recente quando necessário e audit log.
  • Uploads usam fluxo presigned; o backend valida propósito, MIME, tamanho e ownership antes de confirmar o asset.

Endpoints

MétodoRotaAcessoRequestResponseRegras principais
GET/feedPúblico/auth opcionalFeedQueryFeedResponseOrdenação e reasons.
POST/feed/postsEntity permissionCreateFeedPostRequestFeedPostResponseOfficial/template only.
PATCH/feed/posts/:postIdEntity permissionUpdateFeedPostRequestFeedPostResponseDraft/published rules.
POST/feed/suggestions/:id/approveEntity permissionApproveSuggestionRequestFeedPostResponsePublica/agenda conforme escolha.
POST/feed/suggestions/:id/rejectEntity permissionRejectSuggestionRequestOperationResponseMotivo opcional.
POST/feed/posts/:postId/hideAutenticadoOperationResponsePreferência pessoal.
POST/feed/mutesAutenticadoCreateMuteRequestMuteResponse7/30/forever.
GET/notificationsAutenticadoNotificationQueryNotificationsResponsePersonal/management.
POST/notifications/readAutenticadoReadNotificationsRequestOperationResponseBatch.
POST/notifications/:id/archiveAutenticadoOperationResponseOwn.
PATCH/notification-settingsAutenticadoUpdateNotificationSettingsRequestNotificationSettingsResponseCategorias/canais.
POST/paid-push-campaignsEntity permissionCreatePaidPushCampaignRequestPaidPushCampaignResponsePreview de audience/custo.
POST/paid-push-campaigns/:id/confirmEntity permissionConfirmPaidPushCampaignRequestPaidPushCampaignResponseConsome créditos.
POST/shareable-cardsContextualCreateShareableCardRequestShareableCardResponseTemplate/format/data snapshot.
POST/shareable-cards/:id/generateContextualGenerateShareableCardRequestGeneratedCardResponseClient-first; server future.
GET/shareable-cards/templatesPúblicoTemplateQueryTemplatesResponseTemplates MVP controlados.

Autenticação e autorização

  • Feed público pode ser lido anônimo; personalização/mute/hide exige auth.
  • Posts só por manager permission; platform cards por system.
  • Notifications sempre do próprio usuário e permissions atuais.

Erros de domínio

CódigoHTTPQuando ocorreAção esperada no cliente
POST_TYPE_NOT_ALLOWED422Post livre/reaction/commentNão oferecer UI.
SUGGESTION_ALREADY_RESOLVED409Approve/reject concorrenteAtualizar.
MUTE_INVALID_DURATION422Duração inválidaUsar opções.
NOTIFICATION_ACTION_EXPIRED410CTA perdeu validadeAbrir contexto.
INSUFFICIENT_CREDITS409Push pagoMostrar saldo.
SHARE_CARD_PRIVACY_BLOCKED403DTO contém dado privadoRemover campo.

Idempotência e concorrência

  • Approve suggestion, paid push confirm e generation request são idempotentes.
  • Hide/mute/read são naturally idempotent.

Auditoria e efeitos colaterais

  • Post status/approvals e paid push auditados.
  • Notification actions delegam ao domínio e não duplicam regra.
  • Share card registra tipo/formato/target, não conteúdo privado.

Exemplos

feedItem

{
"id": "post_001",
"type": "match_result",
"source": "entity_official",
"publishedAt": "2026-07-12T17:00:00.000Z",
"reason": {
"code": "CHEERED_TEAM",
"label": "Você torce para este time."
}
}

shareCard

{
"id": "card_001",
"type": "match_result",
"format": "story",
"status": "preview",
"targetUrl": "https://raizfc.com.br/matches/match_001"
}

Mocks

  • Ordering deterministic por seed/time.
  • Mute/hide/read stateful.
  • Preview de share cards usa tokens e assets fixtures.

Testes obrigatórios

  • No user posts/reactions/comments.
  • Reason ordering.
  • Mute durations.
  • Action expiry.
  • Paid push debit idempotent.
  • Privacy card.

Critérios de aceite

  • Feed tem conteúdo e estados acordados.
  • Notifications personal/management.
  • Fallback link/text sempre possível.

Machine summary

spec: SPEC-API-ENGAGEMENT-001
api_group: API de feed, notificações, push pago e cards
base_path: /api/v1
response_envelope: ApiResponse<T>
ids: string
dates: ISO-8601
money: integer_cents