diff --git a/docs/assets/architecture.html b/docs/assets/architecture.html new file mode 100644 index 0000000..52ae714 --- /dev/null +++ b/docs/assets/architecture.html @@ -0,0 +1,13222 @@ + + + + + + + payment-api — Runtime Architecture Diagram + + + + + + + + + + + +
+ +
+
+
+

payment-api — Runtime Architecture

+
+

Pix payment core · Hexagonal Architecture

+
+ + + + + + +
+ + payment-api — Runtime Architecture + Pix payment core · Hexagonal Architecture + + + + + + + + + + + + + + + + + + + + + + + + + payment-api (Spring Boot, mesmo processo) + + + + + + + + + + + + + + + Cliente · REST client · Architecture component + + + + Cliente + REST client + + + + Provedor Pix · envia webhooks de status · Architecture component + + + + Provedor Pix + envia webhooks de status + + + + REST API · ChargeController · WebhookController · payment-api (Spring Boot, mesmo processo) + + + + REST API + ChargeController · WebhookController + + + + Casos de Uso · Create/Process/GetCharge + Coordinators · payment-api (Spring Boot, mesmo processo) + + + + Casos de Uso + Create/Process/GetCharge + Coordinators + + + + PostgreSQL · charges · outbox_events · idempotency_records · Architecture component + + + + PostgreSQL + charges · outbox_events · idempotency_records + + + + Outbox Relay · SKIP LOCKED · a cada 5s · payment-api (Spring Boot, mesmo processo) + + + + Outbox Relay + SKIP LOCKED · a cada 5s + + + + Expiration Job · agendado 60s · por-charge tx · payment-api (Spring Boot, mesmo processo) + + + + Expiration Job + agendado 60s · por-charge tx + + + + Kafka · payments.charge-created · Architecture component + + + + Kafka + payments.charge-created + + + + Prometheus · scrape /actuator/prometheus · Architecture component + + + + Prometheus + scrape /actuator/prometheus + + + + Jaeger · traces via OTLP · Architecture component + + + + Jaeger + traces via OTLP + + + + + + POST /charges + Idempotency-Key + + + + POST /webhooks/provider + + + + + JPA — charge + outbox + idempotency (mesma tx) + + + + SKIP LOCKED poll + + + + poll ACTIVE vencidas + + + + publish ChargeCreated + + + + scrape + + + + OTLP traces + + + + + Legend + + + External + + + + Backend + + + + Database + + + + Message bus + + + + Cloud + + + +

+ + + + + + + + +
+ + +
+
+
+
+

Idempotency-Key

+
+
    +
  • • Chave repetida + mesmo corpo → replay (200), não duplica
  • +
  • • Race entre 2 requests novas: perdedora recebe replay da vencedora, não 500
  • +
+
+ +
+
+
+

Optimistic locking

+
+
    +
  • • Charge.version (@Version) via Persistable<UUID>
  • +
  • • Webhook e Expiration Job não se sobrescrevem silenciosamente
  • +
+
+ +
+
+
+

Outbox transacional

+
+
    +
  • • Charge + evento gravados na mesma transação Postgres
  • +
  • • SKIP LOCKED permite múltiplas instâncias do relay em paralelo
  • +
+
+ +
+
+
+

Domínio puro

+
+
    +
  • • Charge, Money, ChargeStatus sem Spring/JPA
  • +
  • • ArchUnit trava a regra em CI (DomainPurityArchTest)
  • +
+
+
+ + + +
+ + + +