Skip to content

feat(spec 041 REQ-MINT-3): add Gateway.getCreatedAt + GatewayQuote.createdAt (0.13.0)#228

Merged
tcheeric merged 1 commit into
developfrom
spec-041-gateway-getcreatedat
Jun 5, 2026
Merged

feat(spec 041 REQ-MINT-3): add Gateway.getCreatedAt + GatewayQuote.createdAt (0.13.0)#228
tcheeric merged 1 commit into
developfrom
spec-041-gateway-getcreatedat

Conversation

@tcheeric

@tcheeric tcheeric commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Adds Gateway.getCreatedAt(quoteId) default port returning Instant (default: null) so consumers like cashu-mint's MintTask can enforce strict NUT-04 quote expiry by computing createdAt + getPaymentExpiry().
  • Adds GatewayQuote.createdAt JPA column auto-populated by a @PrePersist hook; nullable for backward compatibility.
  • PhoenixdGateway implements the override.
  • Bumps to 0.13.0 (additive / binary-compatible — default method on interface + nullable column).

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 MintTask reads getCreatedAt + getPaymentExpiry via the Gateway port; before this PR, no port for createdAt existed. Phase 0 sign-off was issued 2026-06-05 against staging running this code.

Test plan

  • mvn install — BUILD SUCCESS, full test suite green
  • payment-adapter-rest:0.13.0 image built + pushed to docker.398ja.xyz/staging/payment-adapter-rest
  • Live verified on staging: GET /quote/{id} returns "createdAt": "2026-06-05T21:05:58.155309Z" for newly created quotes; existing rows return "createdAt": null (backward compatibility working).
  • cashu-mint's MintTask early expiry check verified by spec 041 Phase 0 harness (t003-req-mint-3.mjs — PASS).

Related

  • Spec 041 Phase 0 sign-off — imani-apps/specs/041-client-side-voucher-minting/contracts/abandoned-mint-recovery.contract.md §Sign-off
  • Downstream PR — cashu-mint 0.21.0 picks up this pin (will be opened separately).

🤖 Generated with Claude Code

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

@github-actions

github-actions Bot commented Jun 5, 2026

Copy link
Copy Markdown

Qodana Community for JVM

6 new problems were found

Inspection name Severity Problems
Unused assignment 🔶 Warning 2
Non-distinguishable logging calls ◽️ Notice 4

☁️ View the detailed Qodana report

Contact Qodana team

Contact us at qodana-support@jetbrains.com

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) (default null) and persist GatewayQuote.createdAt via @PrePersist for 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

Comment thread README.md
Comment thread pom.xml
@tcheeric tcheeric changed the base branch from master to develop June 5, 2026 21:45
@tcheeric tcheeric force-pushed the spec-041-gateway-getcreatedat branch from 8a98bfd to b766fc0 Compare June 5, 2026 21:45
…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>
@tcheeric tcheeric force-pushed the spec-041-gateway-getcreatedat branch from b766fc0 to 163b9c7 Compare June 5, 2026 21:46
@tcheeric tcheeric merged commit 8490f99 into develop Jun 5, 2026
3 of 5 checks passed
@tcheeric tcheeric deleted the spec-041-gateway-getcreatedat branch June 5, 2026 22:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants