Repository navigation
State Pattern
Rótulo: Explicação TL;DR: Cada status do agregado é uma classe própria que conhece suas próprias transições e permissões. Substitui
switch (status)espalhado. Última revisão: 2026-05-18
A Ordem de Serviço tem 8 estados + 2 terminais. Cada estado:
- Define quais operações são permitidas (ex.:
AdicionarProdutosó antes deEmExecucao). - Sabe para qual próximo estado ir em
AvancarEtapa(). - Sabe se pode reverter, cancelar, etc.
Com switch (status) em cada método do agregado, novos estados exigem editar N lugares — e o compilador não avisa se você esqueceu de um.
Com State Pattern, novos estados são uma classe nova herdando da base. O agregado delega para o estado atual.
public abstract class OrdemDeServicoStatusBase
{
public abstract string Nome { get; }
public abstract bool PermiteEditarProdutos { get; }
public abstract Result<OrdemDeServicoStatusBase> AvancarEtapa();
public abstract Result<OrdemDeServicoStatusBase> ReverterEtapa();
public virtual Result<OrdemDeServicoStatusBase> Cancelar()
=> Result.Success(new StatusCancelada()); // default: pode cancelar
}
public sealed class StatusRecebida : OrdemDeServicoStatusBase
{
public override string Nome => "Recebida";
public override bool PermiteEditarProdutos => true;
public override Result<OrdemDeServicoStatusBase> AvancarEtapa()
=> Result.Success<OrdemDeServicoStatusBase>(new StatusEmDiagnostico());
public override Result<OrdemDeServicoStatusBase> ReverterEtapa()
=> Result.Failure<OrdemDeServicoStatusBase>(
HttpStatusCode.Conflict,
new Error("OS.sem-anterior", "Recebida é o estado inicial."));
}No agregado:
public Result AvancarEtapa()
{
var resultado = _status.AvancarEtapa();
if (resultado.IsFailure) return resultado;
var novoStatus = resultado.Value!;
_status = novoStatus;
_historico.Add(new OrdemDeServicoHistoricoStatus(novoStatus.Nome, DomainClock.UtcNow));
RaiseDomainEvent(new OrdemDeServicoStatusAlteradoEvent(Id, novoStatus.Nome));
return Result.Success();
}Ver diagrama completo em Domínio de negócio.
| Estado | PermiteEditarProdutos |
AvancarEtapa |
|---|---|---|
Recebida |
✅ | EmDiagnostico |
EmDiagnostico |
✅ | AguardandoAprovacao |
AguardandoAprovacao |
❌ | (via consumer) EmExecucao ou Rejeitada
|
EmExecucao |
❌ | ManutencaoFinalizada |
ManutencaoFinalizada |
❌ | AguardandoPagamento |
AguardandoPagamento |
❌ | (via consumer) PagamentoConfirmado ou volta para ManutencaoFinalizada
|
PagamentoConfirmado |
❌ | Entregue |
Entregue |
❌ | falha (estado terminal) |
Rejeitada |
❌ | falha (terminal) |
Cancelada |
❌ | falha (terminal) |
A API de Pagamentos tem state machine própria:
PendenteGeracao
│ GerarLink (chama MP)
▼
LinkGerado
│ MarcarEmailEnviado
▼
AguardandoConfirmacao
│ Confirmar → Pago (terminal)
│ Recusar → Recusado (terminal)
│ Expirar → Expirado (terminal)
- Compilador força a definir todas as operações ao adicionar um estado.
- Cada estado é testável isoladamente.
- Histórico de transições vem de graça (
OrdemDeServicoHistoricoStatusadicionado a cada mudança).
🔧 Mecânica Hermes — Tech Challenge 13SOAT (FIAP) · Wiki pública, não inclua credenciais · Editar a Wiki · Plano editorial
🏠 Home
📖 Visão geral
🧭 Como usar a Wiki
🚀 Início rápido
🏛️ Arquitetura
Padrões transversais
- Clean Architecture + DDD + CQRS
- Result Pattern
- State Pattern
- SAGA com MassTransit
- Outbox transacional
- Idempotência cross-service
- DLQ observability
Mensageria
Persistência
Segurança
- Autenticação Cognito + JWT
- Autorização por scopes
- M2M Client Credentials
- Webhooks assinados (HMAC)
- Modelo de ameaças
🔁 Fluxos de negócio
- Caminho feliz
- Orçamento rejeitado
- Pagamento recusado e recriado
- Pagamento expirado
- Cancelamento em execução
- Cancelamento em aguardando pagamento
- Idempotência de webhook
- Proteção por timeout da SAGA
🛠️ Infraestrutura e deploy
- Diagrama AWS completo
- Provisionamento (Terraform)
- Cluster Kubernetes
- API Gateway + VPC Link
- Cognito
- Lambda CognitoToken
- Bancos de dados
- RabbitMQ
- Pipelines GitHub Actions
📊 Observabilidade
- Visão geral
- Logs
- Métricas de negócio
- Métricas de mensageria
- Traces distribuídos
- Dashboards e alertas
🧪 Qualidade
🚨 Operação
- Runbook macro
- Runbook — Ordem de Serviço
- Runbook — Cadastros
- Runbook — Pagamentos
- Resposta a incidentes
- Forçar limpeza de namespace
🧩 SDK compartilhado
👥 Contribuição
📚 Referência
🧠 Decisões