feat(spec 041 REQ-MINT-3): add Gateway.getCreatedAt + GatewayQuote.createdAt (0.13.0)#228
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8a98bfdee4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Qodana Community for JVM6 new problems were found
☁️ View the detailed Qodana report Contact Qodana teamContact us at qodana-support@jetbrains.com
|
There was a problem hiding this comment.
Pull request overview
This PR expands the payment-adapter to support stricter quote-expiry enforcement (Spec 041 REQ-MINT-3) by introducing an explicit quote creation timestamp, and also introduces a new Stripe integration (gateway + webhook + connect) with associated persistence, migrations, docs, and tests. The release version is bumped to 0.13.0.
Changes:
- Add
Gateway.getCreatedAt(quoteId)(defaultnull) and persistGatewayQuote.createdAtvia@PrePersistfor strict expiry computation. - Introduce
payment-adapter-stripe(gateway/webhook/connect) including webhook signature verification, idempotent event processing, and Stripe-specific persistence entities. - Update build/test setup (new modules, dependency management, new IT/E2E coverage) plus docs and changelog updates.
Reviewed changes
Copilot reviewed 88 out of 89 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Document Stripe modules/config |
| pom.xml | Bump version, add Stripe module, deps |
| payment-adapter-webhook/pom.xml | Version bump |
| payment-adapter-test/pom.xml | Version bump |
| payment-adapter-test/payment-adapter-test-integration/pom.xml | Add Stripe deps + test timeout |
| payment-adapter-test/payment-adapter-test-e2e/pom.xml | Add REST/Stripe deps + test timeout |
| payment-adapter-test/payment-adapter-test-integration/src/test/java/xyz/tcheeric/payment/adapter/test/integration/webhook/StripeWebhookHandlerDbIT.java | Stripe webhook DB integration tests |
| payment-adapter-test/payment-adapter-test-integration/src/test/java/xyz/tcheeric/payment/adapter/test/integration/service/StripeConnectServiceIT.java | Stripe Connect integration tests |
| payment-adapter-test/payment-adapter-test-integration/src/test/java/xyz/tcheeric/payment/adapter/test/integration/repository/StripePaymentReferenceRepositoryIT.java | Stripe repo integration tests |
| payment-adapter-test/payment-adapter-test-integration/src/test/java/xyz/tcheeric/payment/adapter/test/integration/migration/FlywayMigrationIT.java | Flyway assertions for Stripe tables |
| payment-adapter-test/payment-adapter-test-e2e/src/test/java/xyz/tcheeric/payment/adapter/test/e2e/flow/StripeCheckoutFlowE2ETest.java | Stripe checkout E2E flow |
| payment-adapter-test/payment-adapter-test-e2e/src/test/java/xyz/tcheeric/payment/adapter/test/e2e/E2ETestApplication.java | Expand repo/component scanning |
| payment-adapter-test/payment-adapter-test-e2e/src/test/java/xyz/tcheeric/payment/adapter/test/e2e/BaseE2ETest.java | DB cleanup + gateway base URL wiring |
| payment-adapter-stripe/pom.xml | New Stripe aggregator module |
| payment-adapter-stripe/payment-adapter-stripe-gateway/pom.xml | Stripe gateway module build |
| payment-adapter-stripe/payment-adapter-stripe-webhook/pom.xml | Stripe webhook module build |
| payment-adapter-stripe/payment-adapter-stripe-connect/pom.xml | Stripe connect module build |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/StripeGateway.java | Stripe Gateway implementation |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/config/StripeGatewayConfig.java | Stripe gateway Spring config |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/config/StripeGatewayProperties.java | Stripe gateway configuration properties |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/service/StripeCheckoutClient.java | Checkout client interface |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/service/StripeCheckoutService.java | Checkout request validation + idempotency |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/service/StripeSdkCheckoutClient.java | Stripe SDK-backed checkout client |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/model/StripeCheckoutRequest.java | Checkout request DTO |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/model/StripeCheckoutSession.java | Checkout session DTO |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/exception/StripeGatewayException.java | Base Stripe gateway exception |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/exception/StripeValidationException.java | Stripe validation exception |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/main/java/xyz/tcheeric/payment/adapter/stripe/gateway/exception/StripeCheckoutCreationException.java | Checkout creation exception |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/test/java/xyz/tcheeric/payment/adapter/stripe/gateway/StripeGatewayTest.java | Stripe gateway unit tests |
| payment-adapter-stripe/payment-adapter-stripe-gateway/src/test/java/xyz/tcheeric/payment/adapter/stripe/gateway/StripeCheckoutServiceTest.java | Checkout service unit tests |
| payment-adapter-stripe/payment-adapter-stripe-webhook/src/main/java/xyz/tcheeric/payment/adapter/stripe/webhook/StripeWebhookHandler.java | Stripe webhook parsing/handling |
| payment-adapter-stripe/payment-adapter-stripe-webhook/src/main/java/xyz/tcheeric/payment/adapter/stripe/webhook/StripeWebhookPayload.java | Webhook payload DTO |
| payment-adapter-stripe/payment-adapter-stripe-webhook/src/main/java/xyz/tcheeric/payment/adapter/stripe/webhook/service/StripeWebhookSignatureVerifier.java | Signature verifier SPI |
| payment-adapter-stripe/payment-adapter-stripe-webhook/src/main/java/xyz/tcheeric/payment/adapter/stripe/webhook/service/DefaultStripeWebhookSignatureVerifier.java | Stripe SDK signature verification |
| payment-adapter-stripe/payment-adapter-stripe-webhook/src/main/resources/META-INF/services/xyz.tcheeric.payment.adapter.webhook.spi.WebhookHandler | Register Stripe webhook handler (SPI) |
| payment-adapter-stripe/payment-adapter-stripe-webhook/src/test/java/xyz/tcheeric/payment/adapter/stripe/webhook/StripeWebhookHandlerTest.java | Stripe webhook handler unit tests |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/StripeConnectController.java | Stripe Connect REST API |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/StripeConnectExceptionHandler.java | Stripe Connect error mapping |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/StripeConnectService.java | Connect service + webhook processing |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/StripeConnectClient.java | Connect client interface |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/StripeSdkConnectClient.java | Stripe SDK-backed connect client |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/StripeAccountSnapshot.java | Stripe account snapshot record |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/config/StripeConnectConfig.java | Connect Spring wiring |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/config/StripeConnectProperties.java | Connect properties |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/exception/StripeConnectException.java | Connect exception type |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/exception/StripeConnectExceptionCode.java | Connect error codes |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/model/StripeConnectAccountRequest.java | Connect request DTO |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/model/StripeConnectRefreshRequest.java | Refresh request DTO |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/model/StripeConnectAccountResponse.java | Connect status response DTO |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/model/StripeConnectWebhookResponse.java | Connect webhook response DTO |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/main/java/xyz/tcheeric/payment/adapter/stripe/connect/model/StripeConnectErrorResponse.java | Connect error response DTO |
| payment-adapter-stripe/payment-adapter-stripe-connect/src/test/java/xyz/tcheeric/payment/adapter/stripe/connect/StripeConnectServiceTest.java | Connect service unit tests |
| payment-adapter-ln/pom.xml | Version bump |
| payment-adapter-ln/payment-adapter-ln-webhook/pom.xml | Version bump |
| payment-adapter-ln/payment-adapter-ln-phoenixd/pom.xml | Version bump |
| payment-adapter-ln/payment-adapter-ln-dummy/pom.xml | Version bump |
| payment-adapter-ln/payment-adapter-ln-phoenixd/src/main/java/xyz/tcheeric/payment/adapter/ln/phoenixd/PhoenixdGateway.java | Implement getCreatedAt |
| payment-adapter-core/pom.xml | Version bump |
| payment-adapter-core/payment-adapter-common/pom.xml | Version bump |
| payment-adapter-core/payment-adapter-client/pom.xml | Version bump |
| payment-adapter-core/payment-adapter-model/pom.xml | Add Flyway postgres plugin dep |
| payment-adapter-core/payment-adapter-rest/pom.xml | Add Stripe gateway/connect deps |
| payment-adapter-core/payment-adapter-rest/src/main/java/xyz/tcheeric/payment/adapter/core/rest/PaymentGatewaySpringApplication.java | Broaden component/repo scanning |
| payment-adapter-core/payment-adapter-rest/src/test/java/xyz/tcheeric/payment/adapter/core/rest/StripeConnectControllerTest.java | REST tests for Connect controller |
| payment-adapter-core/payment-adapter-client/src/main/java/xyz/tcheeric/payment/adapter/core/client/QuoteClient.java | Add updateQuote() method |
| payment-adapter-core/payment-adapter-client/src/test/java/xyz/tcheeric/payment/adapter/core/client/QuoteClientTest.java | Unit test updateQuote() |
| payment-adapter-core/payment-adapter-common/src/main/java/xyz/tcheeric/payment/adapter/core/common/Gateway.java | Add getCreatedAt default method |
| payment-adapter-core/payment-adapter-model/src/main/java/xyz/tcheeric/payment/adapter/core/model/entity/GatewayQuote.java | Add createdAt + @PrePersist |
| payment-adapter-core/payment-adapter-model/src/main/java/xyz/tcheeric/payment/adapter/core/model/entity/stripe/StripePaymentReference.java | Stripe payment reference entity |
| payment-adapter-core/payment-adapter-model/src/main/java/xyz/tcheeric/payment/adapter/core/model/entity/stripe/ProcessedStripeWebhookEvent.java | Webhook event audit entity |
| payment-adapter-core/payment-adapter-model/src/main/java/xyz/tcheeric/payment/adapter/core/model/entity/stripe/ConnectedStripeAccount.java | Connected account entity |
| payment-adapter-core/payment-adapter-model/src/main/java/xyz/tcheeric/payment/adapter/core/model/entity/stripe/StripeWebhookProcessingStatus.java | Webhook processing enum |
| payment-adapter-core/payment-adapter-model/src/main/java/xyz/tcheeric/payment/adapter/core/model/repository/StripePaymentReferenceRepository.java | Stripe reference repository |
| payment-adapter-core/payment-adapter-model/src/main/java/xyz/tcheeric/payment/adapter/core/model/repository/ProcessedStripeWebhookEventRepository.java | Processed event repository |
| payment-adapter-core/payment-adapter-model/src/main/java/xyz/tcheeric/payment/adapter/core/model/repository/ConnectedStripeAccountRepository.java | Connected account repository |
| payment-adapter-core/payment-adapter-model/src/main/resources/db/migration/V4__create_stripe_tables.sql | Create Stripe persistence tables |
| payment-adapter-core/payment-adapter-model/src/main/resources/db/migration/V5__extend_connected_stripe_account.sql | Extend connected account schema |
| payment-adapter-core/payment-adapter-model/src/test/java/xyz/tcheeric/payment/adapter/core/model/entity/stripe/StripePaymentReferenceTest.java | Stripe entity unit test |
| payment-adapter-core/payment-adapter-model/src/test/java/xyz/tcheeric/payment/adapter/core/model/entity/stripe/ProcessedStripeWebhookEventTest.java | Processed event unit test |
| payment-adapter-cash/pom.xml | Version bump |
| payment-adapter-cash/payment-adapter-cash-gateway/pom.xml | Version bump |
| payment-adapter-cash/payment-adapter-cash-webhook/pom.xml | Version bump |
| payment-adapter-cash/payment-adapter-cash-nostr/pom.xml | Version bump |
| docs/specs/payment-adapter-stripe-spec.md | Stripe module specification |
| docs/reference/webhook.md | Document Stripe webhook handler |
| docs/reference/configuration.md | Document Stripe properties/env vars |
| docs/README.md | Add docs index |
| CHANGELOG.md | Add 0.13.0 release notes |
| .gitignore | Ignore Stripe module logs |
8a98bfd to
b766fc0
Compare
…eatedAt Bumps to 0.13.0. Adds a `Gateway.getCreatedAt(quoteId)` default port returning `Instant` (default: null) so consumers like cashu-mint's MintTask can compute the absolute quote-expiry instant as `createdAt + getPaymentExpiry()` and enforce NUT-04 strict expiry. The default returns null so legacy Gateway implementations stay binary-compatible — callers MUST treat null as "skip enforcement" and fall through to existing permissive behaviour. Persistence: GatewayQuote gains a new `created_at` JPA column auto- populated by a `@PrePersist` hook. Nullable for backward compatibility with rows persisted before this column was added (they decode cleanly with null and downstream consumers fall through). PhoenixdGateway implements the override; the BOLT-11 phoenixd path is the load-bearing gateway for staging's spec-041 verification. Spec 041 (client-side voucher minting) Phase 0 REQ-MINT-3 sign-off was issued 2026-06-05 against staging running on top of this code — see specs/041-client-side-voucher-minting/contracts/abandoned-mint- recovery.contract.md §Sign-off (in the imani-apps repo). Tested: - mvn install — BUILD SUCCESS (test suite green) - payment-adapter-rest:0.13.0 image built + pushed to docker.398ja.xyz/staging/payment-adapter-rest Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
b766fc0 to
163b9c7
Compare
Summary
Gateway.getCreatedAt(quoteId)default port returningInstant(default:null) so consumers like cashu-mint'sMintTaskcan enforce strict NUT-04 quote expiry by computingcreatedAt + getPaymentExpiry().GatewayQuote.createdAtJPA column auto-populated by a@PrePersisthook; nullable for backward compatibility.PhoenixdGatewayimplements the override.Why
Spec 041 (client-side voucher minting) Phase 0 REQ-MINT-3 — the cashu mint must reject mint requests past quote expiry. The mint's
MintTaskreadsgetCreatedAt + getPaymentExpiryvia theGatewayport; before this PR, no port forcreatedAtexisted. Phase 0 sign-off was issued 2026-06-05 against staging running this code.Test plan
mvn install— BUILD SUCCESS, full test suite greenpayment-adapter-rest:0.13.0image built + pushed todocker.398ja.xyz/staging/payment-adapter-restGET /quote/{id}returns"createdAt": "2026-06-05T21:05:58.155309Z"for newly created quotes; existing rows return"createdAt": null(backward compatibility working).MintTaskearly expiry check verified by spec 041 Phase 0 harness (t003-req-mint-3.mjs— PASS).Related
imani-apps/specs/041-client-side-voucher-minting/contracts/abandoned-mint-recovery.contract.md§Sign-offcashu-mint0.21.0 picks up this pin (will be opened separately).🤖 Generated with Claude Code