Pular para o conteúdo principal

Status: Approved · v2.2 · SPEC-DOMAIN-SHARE-001

depends_on: SPEC-BRAND-001, SPEC-DOMAIN-MATCH-001, SPEC-DOMAIN-RANKING-001

used_by: IS-MVP-12.3, IS-MVP-17.4, IS-POST-12.1

Cards compartilháveis

Arte pública gerada a partir de dados canônicos para WhatsApp e Instagram, com assinatura discreta do RaizFC.

Objetivo e limites

Esta especificação define o comportamento canônico do domínio Cards compartilháveis no RaizFC. Ela deve ser consultada antes de alterar contratos, mocks, endpoints, telas, permissões ou Increment Specifications relacionados.

Incluído no MVP

  • Formatos story 1080×1920, square 1080×1080 e vertical 1080×1350.
  • Resultado, próximo jogo, escalação lista, convocação, reforço, título, ranking, artilharia, perfil time/jogador/torcida/campeonato e apoio.
  • Marca RaizFC obrigatória.
  • Geração client-side quando possível.
  • Fallback texto+link.

Fora do MVP

  • Animação/vídeo.
  • Templates premium.
  • Remoção de marca.
  • Patrocínio no card.
  • Editor livre.

Atores e responsabilidades

AtorResponsabilidade
Visitante/usuárioCompartilha card permitido.
GestorGera cards oficiais de entidade e jogo.
JogadorGera perfil quando privacidade permite.
SistemaMonta templates e fallback de texto/link.

Conceitos canônicos

ShareableCard

Representação visual gerável.

Template

Layout controlado por tipo/formato.

Brand Signature

RaizFC + domínio/tagline discretos.

Source Snapshot

Dados públicos capturados no momento da geração.

Fallback Share

Texto e link quando imagem falha.

Invariantes

  • Card nunca expõe dado privado.
  • Marca RaizFC é obrigatória no MVP.
  • Time/jogador/conteúdo é protagonista; plataforma é assinatura.
  • Patrocínio não aparece no card no MVP.
  • Resultado contestado não pode ser apresentado como definitivo.
  • Perfil privado não gera card público.
  • Template não busca dados diretamente; recebe props/DTO.
  • Todo card possui link de destino quando aplicável.

Estados

EstadoSignificadoVisibilidade/efeito
draftConfiguração iniciadaNão compartilhável.
previewRenderização localPode ajustar opções permitidas.
generatedImagem prontaCompartilhável.
failedFalhaFallback disponível.
expiredLink/asset temporário expiradoPode regenerar.

Transições permitidas

OrigemAçãoDestinoAutoridadeEfeitos
createdraftUsuário/gestorValida tipo/source.
draftpreviewpreviewClienteRenderiza.
previewgenerategeneratedCliente/servidorCria asset.
draft/previewfailfailedSistemaOferece fallback.
generatedexpireexpiredJob/storageLink temporário.

Permissões

Permission keyQuem recebe por padrãoAção protegidaAuditoria
share.generatePublicPúblico/autenticadoCard de conteúdo públicoNão
share.generateOfficialGestor contextualTemplates oficiaisSim leve
share.generatePlayerPróprio jogador/público conforme privacyPerfil jogadorNão

Fluxos funcionais

Resultado

  1. Carrega PublicMatchDto.
  2. Verifica status validated ou inclui badge aguardando/contestado.
  3. Escolhe formato.
  4. Renderiza placar, escudos, times, contexto e assinatura.
  5. Permite compartilhar imagem ou fallback.

Escalação

  1. Gestor usa MatchReport/lineup permitido.
  2. MVP usa lista de titulares e banco opcional.
  3. Nomes convidados respeitam visibilidade.

Perfil de jogador

  1. Verifica privacy.
  2. Usa foto/avatar, nome, posição, time e stats públicas.
  3. Inclui link do perfil.

Falha de geração

  1. Captura erro técnico.
  2. Mantém preview/dados.
  3. Oferece texto formatado e link.

Casos-limite e erros

CenárioComportamento esperadoCódigo/estado
Logo do time ausenteUsar placeholder neutro com iniciais
Nome longoAplicar regras de truncamento/escalaCARD_CONTENT_OVERFLOW
Resultado contestadoBadge e texto neutroSOURCE_CONTESTED
Perfil privadoBloquearCARD_NOT_ALLOWED
Canvas/view capture falhaFallback texto+linkCARD_GENERATION_FAILED

Privacidade e exposição pública

  • Somente DTOs públicos entram no template.
  • Telefone/endereço privado, saldo e valores nunca entram.
  • Convidado não confirmado pode ser omitido ou mostrado apenas pelo nome permitido no contexto.

Notificações e auditoria

  • Não gera notificação comum.
  • Card oficial pode ser associado a post/campanha com auditoria separada.

API relacionada

MétodoRotaAcessoFinalidade
POST/api/v1/shareable-cardsPúblico/contextualCriar config
GET/api/v1/shareable-cards/:idPúblico/contextualDetalhe
POST/api/v1/shareable-cards/:id/generateContextualGerar server-side futuro
GET/api/v1/shareable-cards/templatesPúblicoTemplates
GET/api/v1/shareable-cards/optionsContextualOpções permitidas

Contratos compartilhados

  • ShareableCardType
  • ShareableCardFormat
  • ShareableCardDto
  • CreateShareableCardRequest/Response
  • ShareableCardSourceDto
  • ShareFallbackDto

Requisitos de UX

  • Preview em tela dedicada com escolha de formato.
  • Sem editor livre; apenas opções controladas como fundo/variação quando disponíveis.
  • Safe areas e legibilidade em tela pequena.
  • Botões compartilhar, salvar imagem quando suportado e copiar texto/link.

Comportamento dos mocks

  • Todos os tipos prioritários.
  • Long names, no logo, contested, private, generation failure.
  • Assets determinísticos.

Critérios de aceite

  • Três formatos.
  • Marca obrigatória.
  • Fallback sempre.
  • Sem dado privado/sponsor.
  • Resultado status correto.
  • Template por props.

Testes obrigatórios

  • Privacy.
  • Format dimensions.
  • Overflow.
  • Fallback.
  • Source status.
  • Template mapping.

Pós-MVP

  • Vídeo, premium, sponsor moderado, identidade avançada e geração server-side.
  • Cards celebrativos de aniversário de jogador, time ou torcida e marco de campanha, gerados como sugestão privada e publicados somente após aprovação explícita no preview.
  • Aniversários usam America/Sao_Paulo; as fontes são data de nascimento do jogador e data de fundação de time/torcida.
  • A idade aparece somente quando permitida no painel de privacidade, mas sua ocultação não impede a sugestão do card.
  • Registro configurável de marcos inicialmente limitado a 5 vitórias validadas na campanha, 100º jogo validado e entrada no top 3 de qualquer ranking canônico disponível.

Decisões registradas

  • Cards são motor central de viralização.
  • Escalação MVP usa lista.
  • Marca pequena obrigatória.
  • Patrocínio em cards fica pós-MVP.
  • Card celebrativo não é publicação automática; aprovação explícita em notificação acionável é invariante do fluxo pós-MVP.

Machine summary

spec: SPEC-DOMAIN-SHARE-001
domain: Cards compartilháveis
must_preserve:
- Card nunca expõe dado privado.
- Marca RaizFC é obrigatória no MVP.
- Time/jogador/conteúdo é protagonista; plataforma é assinatura.
- Patrocínio não aparece no card no MVP.
- Resultado contestado não pode ser apresentado como definitivo.
- Perfil privado não gera card público.
- Template não busca dados diretamente; recebe props/DTO.
- Todo card possui link de destino quando aplicável.
touches:
- contracts
- mocks
- api
- frontend
- backend
- tests
- documentation