fix(prod): map SiaxError in the 7 legacy money routes — DEPENDENCY_UNAVAILABLE/503 instead of opaque 500 #81

Merged
admin merged 1 commits from fix/legacy-routes-siax-error-mapping into main 2026-09-22 02:41:55 +00:00
Owner

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.
## 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.
admin added 1 commit 2026-09-22 02:34:08 +00:00
fix(prod): map SiaxError in the 7 legacy money routes — DEPENDENCY_UNAVAILABLE/503 instead of opaque 500 (0pt#53)
CI (SIAX Cloud) / integration (push) Has been skipped
masterplan-lock / check (pull_request) Successful in 3s
masterplan-lock / check (push) Successful in 3s
CI (SIAX Cloud) / security (push) Successful in 15s
Security Scan (SIAX Cloud) / security (push) Successful in 14s
Security Scan (SIAX Cloud) / security (pull_request) Successful in 18s
CI (SIAX Cloud) / quality (pull_request) Successful in 31s
CI (SIAX Cloud) / quality (push) Successful in 40s
CI (SIAX Cloud) / security (pull_request) Successful in 42s
CI (SIAX Cloud) / integration (pull_request) Successful in 45s
c7fd9d45a2
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
siax-bot approved these changes 2026-09-22 02:37:16 +00:00
siax-bot left a comment
Collaborator

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.

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.
admin closed this pull request 2026-09-22 02:37:22 +00:00
admin deleted branch fix/legacy-routes-siax-error-mapping 2026-09-22 02:37:22 +00:00
admin reopened this pull request 2026-09-22 02:37:25 +00:00
siax-bot approved these changes 2026-09-22 02:41:34 +00:00
siax-bot left a comment
Collaborator

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.
siax-bot approved these changes 2026-09-22 02:41:51 +00:00
siax-bot left a comment
Collaborator

Oberoende re-review av c7fd9d4: godkänd.

Oberoende re-review av c7fd9d4: godkänd.
admin merged commit 2ae1fad1f5 into main 2026-09-22 02:41:55 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/0pt#81