refactor: derive api error codes from contract (WealthLedger/backend#117) (#123)
Frontend verify / commits (push) Skipped
Frontend verify / security (push) Successful in 9s
Frontend verify / verify (push) Failing after 6m30s

This commit was merged in pull request #123.
This commit is contained in:
2026-10-28 17:31:22 +03:00
parent 5796d2d789
commit 32e8fe9402
7 changed files with 65 additions and 10 deletions
+16 -2
View File
@@ -1,3 +1,5 @@
import type { components } from "./generated/schema";
enum ApiErrorCode {
BankDependentRefunds = "BANK_DEPENDENT_REFUNDS",
BankIntentConflict = "BANK_INTENT_CONFLICT",
@@ -6,7 +8,6 @@ enum ApiErrorCode {
BankVersionConflict = "BANK_VERSION_CONFLICT",
BankWriteConflict = "BANK_WRITE_CONFLICT",
BondTickerAmbiguous = "BOND_TICKER_AMBIGUOUS",
Forbidden = "FORBIDDEN",
InvalidOperationsCursor = "INVALID_OPERATIONS_CURSOR",
InvalidTbankToken = "INVALID_TBANK_TOKEN",
NotFound = "NOT_FOUND",
@@ -16,6 +17,16 @@ enum ApiErrorCode {
Unauthorized = "UNAUTHORIZED",
}
/**
Compile-time drift guard: collapses to `never` when any enum member is absent
from the generated ProblemDetails contract, so every call site fails to build.
*/
type ContractApiErrorCode
= Exclude<
`${ApiErrorCode}`,
components["schemas"]["ProblemDetailsDto"]["code"]
> extends never ? ApiErrorCode : never;
function apiErrorCode(error: unknown): string | undefined {
return typeof error === "object" && error !== null && "code" in error
? String(error.code)
@@ -23,7 +34,10 @@ function apiErrorCode(error: unknown): string | undefined {
}
// Incoming codes are an open wire string; unknown values retain their fallback.
function isApiErrorCode(value: unknown, expected: ApiErrorCode): boolean {
function isApiErrorCode(
value: unknown,
expected: ContractApiErrorCode,
): boolean {
return value === expected;
}