fix(billing): deep-audit P0/P1 fixes for the pinned Stripe API (2026-04-22.dahlia)

Independent audit (verified vs Stripe Basil 2025-03-31 changelog):
- P0: period end moved off the top-level Subscription -> read
  sub.items.data[0].current_period_end (grace/lapse now actually fires;
  was always null -> past_due members never went 'late').
- P0: invoice subscription metadata moved under invoice.parent.
  subscription_details -> read parent (metadata member-resolution was
  always failing, mislinking dues payments).
- P1: handle only invoice.paid (not also invoice.payment_succeeded) +
  pre-insert dedupe on (space_id,platform,external_id) -> no double
  payment-ledger rows.
- P2: idempotencyKey on customers.create -> no duplicate Stripe
  customers under concurrent checkout.
- 040: documented the 'do not wrap in manual BEGIN/COMMIT' caveat.
(P0 webhook-reprocess-on-failure was fixed in ca34e53.) Audit verdict:
isolation/secrets/RLS/status-bounds were already sound.
This commit is contained in:
Moheeb Zara
2026-05-17 03:46:08 -07:00
parent ca34e5393a
commit b477c38425
3 changed files with 58 additions and 24 deletions
+6
View File
@@ -18,6 +18,12 @@
--
-- Idempotent: ADD VALUE IF NOT EXISTS, CREATE TABLE/INDEX IF NOT EXISTS,
-- DROP POLICY IF EXISTS then CREATE.
--
-- Apply this file as-is (Supabase SQL editor / psql). Do NOT wrap it in a
-- manual BEGIN/COMMIT: `ALTER TYPE ... ADD VALUE` historically could not run
-- inside a transaction block (fine on Supabase PG15 unwrapped). The new
-- value is not used by any statement here, so a single implicit transaction
-- is safe and re-runs are no-ops.
-- =============================================================================
ALTER TYPE public.payment_platform ADD VALUE IF NOT EXISTS 'stripe';