Files
moeka-project/server/apps/api/drizzle/meta/_journal.json
T
37c837e502 refactor(api): extract payment CORE to support other payment providers [1/2] (#2335)
## Why

Stripe checkout used Stripe-only tables. This extracts a shared payment
CORE. New checkout writes `payment_order`. Old Stripe tables stay so
in-progress Sessions can still settle.

This PR is [1/2]. [#2368](https://github.com/moeru-ai/airi/pull/2368) is
[2/2]. That PR archives leftover Stripe tables after in-progress
Sessions finish or expire.

## Changes

- Add `payment_order` and `provider_account`.
- Copy `stripe_checkout_session` into `payment_order`.
- Copy `stripe_customer` into `provider_account`.
- Keep `stripe_*` tables and `user_flux.stripe_customer_id`.
- New checkout writes `payment_order` and stores
`metadata.payment_order_id`.
- Webhook resolves new Sessions by `metadata.payment_order_id`.
- Webhook resolves older Sessions by `provider_order_id`, then by a
leftover `stripe_checkout_session` row.
- That leftover-row lookup covers Sessions opened before this deploy,
and rows written while 0023 runs.
[#2368](https://github.com/moeru-ai/airi/pull/2368) deletes it after
those Sessions finish or expire.

## Test plan

- [x] `pnpm exec vitest run
server/apps/api/src/services/domain/payment/tests/payment.test.ts
server/apps/api/src/routes/stripe`
- [x] `pnpm -F @proj-airi/api-server typecheck`
- [x] `git diff --check`

## Visual changes

No user-visible changes.

## Open: settle after account deletion

Account deletion stamps `payment_order.deletedAt`. A Checkout Session
that is still open can still pay after that stamp. This PR keeps `main`
behavior. `settle` loads the row by id, including a soft-deleted row,
then marks it `paid` and credits Flux.

Follow-up policy: if `deletedAt` is set, skip. Do not update the archive
row. Do not credit Flux. Do not insert a live `provider_account`. Stripe
remains the payment record. Skip matches the soft-delete rule: a deleted
row is gone, not write it again.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: RainbowBird <git@luoling.moe>
2026-09-12 17:43:10 +08:00

175 lines
3.4 KiB
JSON

{
"version": "7",
"dialect": "postgresql",
"entries": [
{
"idx": 0,
"version": "7",
"when": 1772532674887,
"tag": "0000_mean_slipstream",
"breakpoints": true
},
{
"idx": 1,
"version": "7",
"when": 1772532802115,
"tag": "0001_magenta_skrulls",
"breakpoints": true
},
{
"idx": 2,
"version": "7",
"when": 1772634952890,
"tag": "0002_mean_tigra",
"breakpoints": true
},
{
"idx": 3,
"version": "7",
"when": 1773229668722,
"tag": "0003_old_titania",
"breakpoints": true
},
{
"idx": 4,
"version": "7",
"when": 1773421458174,
"tag": "0004_bouncy_devos",
"breakpoints": true
},
{
"idx": 5,
"version": "7",
"when": 1774582846222,
"tag": "0005_tough_living_tribunal",
"breakpoints": true
},
{
"idx": 6,
"version": "7",
"when": 1774584037626,
"tag": "0006_overconfident_susan_delgado",
"breakpoints": true
},
{
"idx": 7,
"version": "7",
"when": 1774632446757,
"tag": "0007_red_nicolaos",
"breakpoints": true
},
{
"idx": 8,
"version": "7",
"when": 1775032828818,
"tag": "0008_gray_xavin",
"breakpoints": true
},
{
"idx": 9,
"version": "7",
"when": 1777370103031,
"tag": "0009_perpetual_lilandra",
"breakpoints": true
},
{
"idx": 10,
"version": "7",
"when": 1778223289077,
"tag": "0010_sudden_bastion",
"breakpoints": true
},
{
"idx": 11,
"version": "7",
"when": 1779100599148,
"tag": "0011_common_doctor_octopus",
"breakpoints": true
},
{
"idx": 12,
"version": "7",
"when": 1779118725550,
"tag": "0012_clumsy_the_stranger",
"breakpoints": true
},
{
"idx": 13,
"version": "7",
"when": 1779728850192,
"tag": "0013_naive_groot",
"breakpoints": true
},
{
"idx": 14,
"version": "7",
"when": 1780498188307,
"tag": "0014_vengeful_blonde_phantom",
"breakpoints": true
},
{
"idx": 15,
"version": "7",
"when": 1780498188308,
"tag": "0015_concerned_piledriver",
"breakpoints": true
},
{
"idx": 16,
"version": "7",
"when": 1782847276369,
"tag": "0016_tired_dagger",
"breakpoints": true
},
{
"idx": 17,
"version": "7",
"when": 1782912836523,
"tag": "0017_nappy_dagger",
"breakpoints": true
},
{
"idx": 18,
"version": "7",
"when": 1785833974268,
"tag": "0018_blushing_scarlet_witch",
"breakpoints": true
},
{
"idx": 19,
"version": "7",
"when": 1785843526589,
"tag": "0019_low_namora",
"breakpoints": true
},
{
"idx": 20,
"version": "7",
"when": 1786787455390,
"tag": "0020_smart_war_machine",
"breakpoints": true
},
{
"idx": 21,
"version": "7",
"when": 1786864179375,
"tag": "0021_chilly_starjammers",
"breakpoints": true
},
{
"idx": 22,
"version": "7",
"when": 1786957404391,
"tag": "0022_worthless_shriek",
"breakpoints": true
},
{
"idx": 23,
"version": "7",
"when": 1789035949919,
"tag": "0023_payment_order",
"breakpoints": true
}
]
}