Durable-store-guarden (getSqlForDurableStore, lib/db.ts) kastar SiaxError(DEPENDENCY_UNAVAILABLE, httpStatus 503, retryable) när en pengar-bärande store annars faller tillbaka till in-memory Map i production. /api/0pt/*-ytan mappar felet redan via src/http/siax-error-response.ts — men de 7 legacy-routes utanför middleware-matchern gjorde det inte, så den dokumenterade 503:an läckte som Next opaka 500 utan body.
webhooks/stripe: store-outage → 503 received:false reason:store_unavailable — Stripes retry-väg hålls öppen (aldrig tyst received:true för ett betalt event som INTE processats).
Nytt test pinar 503 + structured body (code/source/retryable).
Verifierat
typecheck ren, 1062/184 test (3 nya), build grön, lint: inga nya fel (alla 12 pre-existing i andra filer).
Beteendet failar STÄNGT som innan — bara felkroppen/statusen är nu den dokumenterade.
## Varför (0pt#53)
Durable-store-guarden (`getSqlForDurableStore`, lib/db.ts) kastar `SiaxError(DEPENDENCY_UNAVAILABLE, httpStatus 503, retryable)` när en pengar-bärande store annars faller tillbaka till in-memory Map i production. `/api/0pt/*`-ytan mappar felet redan via src/http/siax-error-response.ts — men de 7 legacy-routes utanför middleware-matchern gjorde det inte, så den dokumenterade 503:an läckte som Next opaka 500 utan body.
## Fix
- `app/api/siax-error-mapping.ts`: delad mapper (`isSiaxError` + `siaxErrorResponseForLegacy`).
- orders (POST/GET), orders/[id] (GET/PATCH), subscriptions (GET/POST), payments/deposit, payments/release, admin/metrics: try/catch → mapper, varje routes egen typade felkontrakt bevaras (idempotency conflict 409 m.m.).
- webhooks/stripe: store-outage → 503 `received:false reason:store_unavailable` — Stripes retry-väg hålls öppen (aldrig tyst received:true för ett betalt event som INTE processats).
- Nytt test pinar 503 + structured body (code/source/retryable).
## Verifierat
- typecheck ren, 1062/184 test (3 nya), build grön, lint: inga nya fel (alla 12 pre-existing i andra filer).
- Beteendet failar STÄNGT som innan — bara felkroppen/statusen är nu den dokumenterade.
getSqlForDurableStore throws SiaxError(DEPENDENCY_UNAVAILABLE, httpStatus 503,
retryable) when a money-bearing store would fall back to an in-memory Map in a
production runtime (the durable-store guard). The /api/0pt/* surface already
maps it via src/http/siax-error-response.ts; the seven legacy routes outside
the middleware matcher did not — the documented 503 leaked as Next's opaque
500 with no body.
- app/api/siax-error-mapping.ts: shared isSiaxError + siaxErrorResponseForLegacy
- orders (POST/GET), orders/[id] (GET/PATCH), subscriptions (GET/POST),
payments/deposit, payments/release, admin/metrics: try/catch -> mapper,
each route's own typed error contract preserved (idempotency conflict 409 etc.)
- webhooks/stripe: store outage -> 503 received:false reason:store_unavailable
so Stripe's delivery retry path stays open (never a silent received:true)
- tests/api/legacy-routes-siax-error-mapping.test.ts: pins the 503 + body
CODEOWNERS rules
requested review from sax3l 2026-09-22 02:34:08 +00:00
Oberoende re-review av c7fd9d4: mappningen bevarar varje routes typade felkontrakt, webhook retry-pathen är bevarad, 3 nya tester pinar 503-kontraktet, full CI-kedja grön (quality+integration+security på push och PR). Godkänd.
Oberoende re-review av c7fd9d4: mappningen bevarar varje routes typade felkontrakt, webhook retry-pathen är bevarad, 3 nya tester pinar 503-kontraktet, full CI-kedja grön (quality+integration+security på push och PR). Godkänd.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Varför (0pt#53)
Durable-store-guarden (
getSqlForDurableStore, lib/db.ts) kastarSiaxError(DEPENDENCY_UNAVAILABLE, httpStatus 503, retryable)när en pengar-bärande store annars faller tillbaka till in-memory Map i production./api/0pt/*-ytan mappar felet redan via src/http/siax-error-response.ts — men de 7 legacy-routes utanför middleware-matchern gjorde det inte, så den dokumenterade 503:an läckte som Next opaka 500 utan body.Fix
app/api/siax-error-mapping.ts: delad mapper (isSiaxError+siaxErrorResponseForLegacy).received:false reason:store_unavailable— Stripes retry-väg hålls öppen (aldrig tyst received:true för ett betalt event som INTE processats).Verifierat
Reviderat oberoende: 7 legacy-routes får SiaxError-mappning, egen typad felkontrakt bevarad, webhook 503 retry-path bevarad, 3 nya tester pinar kontraktet (1062 gröna). Godkänd.
Oberoende re-review av
c7fd9d4: mappningen bevarar varje routes typade felkontrakt, webhook retry-pathen är bevarad, 3 nya tester pinar 503-kontraktet, full CI-kedja grön (quality+integration+security på push och PR). Godkänd.Oberoende re-review av
c7fd9d4: godkänd.