Skip to content

Commit ee17317

Browse files
committed
fix(api): collapse the internal error envelope and restore requestId
The builders shipped two internal error envelopes: internalOrchestrationErrorPolicy emitted { success: false, error } while internalPlainOrchestrationErrorPolicy emitted { error }. That split approximated pre-builder behavior, where the shape depended on which branch failed - guard clauses returned { error } and a route's terminal try/catch returned { success: false, error }. A per-route policy cannot express a per-branch rule, so the two disagreed on the same status across families. Collapse to the bare { error } shape. It is what messageFromErrorBody reads on the client and what most migrated routes already emitted. requestJson throws ApiClientError for any non-2xx, so no typed client ever observes the discriminator. success: true on success bodies is a separate contract and is untouched. Also restore requestId to internal error bodies. withRouteHandler stamps it on the bodies it generates, but the builder overrides dropped it, leaving it only on the x-request-id header - invisible when a user pastes an error out of the UI. It is now applied at the createJsonErrorResponse chokepoint and in both wrapper overrides, and is omitted when there is no active request scope.
1 parent e7590c8 commit ee17317

32 files changed

Lines changed: 183 additions & 90 deletions

File tree

apps/sim/app/api/audit-logs/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { listAuditLogsContract } from '@/lib/api/contracts/audit-logs'
22
import {
33
defineInternalJsonRoute,
4-
internalPlainOrchestrationErrorPolicy,
4+
internalOrchestrationErrorPolicy,
55
internalRateLimits,
66
internalSessionAuth,
77
} from '@/lib/api/server/routes'
@@ -18,7 +18,7 @@ export const GET = defineInternalJsonRoute({
1818
rateLimit: internalRateLimits.none({
1919
reason: 'Existing authenticated audit-log settings read has no request-rate policy',
2020
}),
21-
errorPolicy: internalPlainOrchestrationErrorPolicy,
21+
errorPolicy: internalOrchestrationErrorPolicy,
2222
mapInput: ({ query }) => ({
2323
organizationId: query.organizationId,
2424
includeDeparted: query.includeDeparted,

apps/sim/app/api/table/[tableId]/exports/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createTableExportResourceContract } from '@/lib/api/contracts/table-transfers'
22
import {
33
defineInternalJsonRoute,
4-
internalPlainOrchestrationErrorPolicy,
4+
internalOrchestrationErrorPolicy,
55
internalRateLimits,
66
} from '@/lib/api/server/routes'
77
import { internalTableSessionOrExecutorAuth } from '@/lib/table/api'
@@ -16,7 +16,7 @@ export const POST = defineInternalJsonRoute({
1616
rateLimit: internalRateLimits.none({
1717
reason: 'Existing authenticated table export creation has no request-rate policy',
1818
}),
19-
errorPolicy: internalPlainOrchestrationErrorPolicy,
19+
errorPolicy: internalOrchestrationErrorPolicy,
2020
mapInput: ({ params, body }) => ({
2121
tableId: params.tableId,
2222
workspaceId: body.workspaceId,

apps/sim/app/api/table/[tableId]/groups/route.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ vi.mock('@/lib/api/server/routes', () => ({
3636
},
3737
extendInternalErrorPolicy: vi.fn(() => ({ kind: 'table' })),
3838
internalErrorResponse: vi.fn(),
39-
internalPlainOrchestrationErrorPolicy: { kind: 'plain' },
39+
internalOrchestrationErrorPolicy: { kind: 'plain' },
4040
internalRateLimits: {
4141
none: ({ reason }: { reason: string }) => ({ kind: 'none', reason }),
4242
},

apps/sim/app/api/table/[tableId]/groups/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
defineInternalJsonRoute,
88
extendInternalErrorPolicy,
99
internalErrorResponse,
10-
internalPlainOrchestrationErrorPolicy,
10+
internalOrchestrationErrorPolicy,
1111
internalRateLimits,
1212
} from '@/lib/api/server/routes'
1313
import { internalTableSessionOrExecutorAuth } from '@/lib/table/api'
@@ -21,7 +21,7 @@ import { TableLockedError } from '@/lib/table/mutation-locks'
2121
import type { TableDefinition } from '@/lib/table/types'
2222
import { normalizeColumn } from '@/app/api/table/utils'
2323

24-
const errorPolicy = extendInternalErrorPolicy(internalPlainOrchestrationErrorPolicy, (error) =>
24+
const errorPolicy = extendInternalErrorPolicy(internalOrchestrationErrorPolicy, (error) =>
2525
error instanceof TableLockedError
2626
? internalErrorResponse(423, { error: error.message, lock: error.lock })
2727
: null

apps/sim/app/api/table/exports/[exportId]/download/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { downloadTableExportResourceContract } from '@/lib/api/contracts/table-transfers'
22
import {
33
defineInternalJsonRoute,
4-
internalPlainOrchestrationErrorPolicy,
4+
internalOrchestrationErrorPolicy,
55
internalRateLimits,
66
} from '@/lib/api/server/routes'
77
import { internalTableSessionOrExecutorAuth } from '@/lib/table/api'
@@ -15,7 +15,7 @@ export const GET = defineInternalJsonRoute({
1515
rateLimit: internalRateLimits.none({
1616
reason: 'Existing authenticated table export download signing has no request-rate policy',
1717
}),
18-
errorPolicy: internalPlainOrchestrationErrorPolicy,
18+
errorPolicy: internalOrchestrationErrorPolicy,
1919
mapInput: ({ params, query }) => ({
2020
exportId: params.exportId,
2121
workspaceId: query.workspaceId,

apps/sim/app/api/table/exports/[exportId]/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
} from '@/lib/api/contracts/table-transfers'
55
import {
66
defineInternalJsonRoute,
7-
internalPlainOrchestrationErrorPolicy,
7+
internalOrchestrationErrorPolicy,
88
internalRateLimits,
99
} from '@/lib/api/server/routes'
1010
import { internalTableSessionOrExecutorAuth } from '@/lib/table/api'
@@ -21,7 +21,7 @@ export const GET = defineInternalJsonRoute({
2121
auth: internalTableSessionOrExecutorAuth,
2222
operation: tableOperations.readExport,
2323
rateLimit,
24-
errorPolicy: internalPlainOrchestrationErrorPolicy,
24+
errorPolicy: internalOrchestrationErrorPolicy,
2525
mapInput: ({ params, query }) => ({
2626
exportId: params.exportId,
2727
workspaceId: query.workspaceId,
@@ -35,7 +35,7 @@ export const DELETE = defineInternalJsonRoute({
3535
auth: internalTableSessionOrExecutorAuth,
3636
operation: tableOperations.cancelExport,
3737
rateLimit,
38-
errorPolicy: internalPlainOrchestrationErrorPolicy,
38+
errorPolicy: internalOrchestrationErrorPolicy,
3939
mapInput: ({ params, query }) => ({
4040
exportId: params.exportId,
4141
workspaceId: query.workspaceId,

apps/sim/app/api/table/imports/[importId]/complete/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { completeTableImportResourceContract } from '@/lib/api/contracts/table-transfers'
22
import {
33
defineInternalJsonRoute,
4-
internalPlainOrchestrationErrorPolicy,
4+
internalOrchestrationErrorPolicy,
55
internalRateLimits,
66
} from '@/lib/api/server/routes'
77
import { internalTableSessionOrExecutorAuth } from '@/lib/table/api'
@@ -16,7 +16,7 @@ export const POST = defineInternalJsonRoute({
1616
rateLimit: internalRateLimits.none({
1717
reason: 'Existing authenticated table import completion has no request-rate policy',
1818
}),
19-
errorPolicy: internalPlainOrchestrationErrorPolicy,
19+
errorPolicy: internalOrchestrationErrorPolicy,
2020
mapInput: ({ params, query, headers }) => ({
2121
importId: params.importId,
2222
workspaceId: query.workspaceId,

apps/sim/app/api/table/imports/[importId]/parts/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createTableImportPartUrlsContract } from '@/lib/api/contracts/table-transfers'
22
import {
33
defineInternalJsonRoute,
4-
internalPlainOrchestrationErrorPolicy,
4+
internalOrchestrationErrorPolicy,
55
internalRateLimits,
66
} from '@/lib/api/server/routes'
77
import { internalTableSessionOrExecutorAuth } from '@/lib/table/api'
@@ -15,7 +15,7 @@ export const POST = defineInternalJsonRoute({
1515
rateLimit: internalRateLimits.none({
1616
reason: 'Existing authenticated table import part signing has no request-rate policy',
1717
}),
18-
errorPolicy: internalPlainOrchestrationErrorPolicy,
18+
errorPolicy: internalOrchestrationErrorPolicy,
1919
mapInput: ({ params, query, headers, body }) => ({
2020
importId: params.importId,
2121
workspaceId: query.workspaceId,

apps/sim/app/api/table/imports/[importId]/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
} from '@/lib/api/contracts/table-transfers'
55
import {
66
defineInternalJsonRoute,
7-
internalPlainOrchestrationErrorPolicy,
7+
internalOrchestrationErrorPolicy,
88
internalRateLimits,
99
} from '@/lib/api/server/routes'
1010
import { internalTableSessionOrExecutorAuth } from '@/lib/table/api'
@@ -21,7 +21,7 @@ export const GET = defineInternalJsonRoute({
2121
auth: internalTableSessionOrExecutorAuth,
2222
operation: tableOperations.readImport,
2323
rateLimit,
24-
errorPolicy: internalPlainOrchestrationErrorPolicy,
24+
errorPolicy: internalOrchestrationErrorPolicy,
2525
mapInput: ({ params, query }) => ({
2626
importId: params.importId,
2727
workspaceId: query.workspaceId,
@@ -35,7 +35,7 @@ export const DELETE = defineInternalJsonRoute({
3535
auth: internalTableSessionOrExecutorAuth,
3636
operation: tableOperations.cancelImport,
3737
rateLimit,
38-
errorPolicy: internalPlainOrchestrationErrorPolicy,
38+
errorPolicy: internalOrchestrationErrorPolicy,
3939
mapInput: ({ params, query, headers }) => ({
4040
importId: params.importId,
4141
workspaceId: query.workspaceId,

apps/sim/app/api/table/imports/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createTableImportResourceContract } from '@/lib/api/contracts/table-transfers'
22
import {
33
defineInternalJsonRoute,
4-
internalPlainOrchestrationErrorPolicy,
4+
internalOrchestrationErrorPolicy,
55
internalRateLimits,
66
} from '@/lib/api/server/routes'
77
import { internalTableSessionOrExecutorAuth } from '@/lib/table/api'
@@ -16,7 +16,7 @@ export const POST = defineInternalJsonRoute({
1616
rateLimit: internalRateLimits.none({
1717
reason: 'Existing authenticated table import creation has no request-rate policy',
1818
}),
19-
errorPolicy: internalPlainOrchestrationErrorPolicy,
19+
errorPolicy: internalOrchestrationErrorPolicy,
2020
mapInput: ({ body }) => ({ body }),
2121
useCase: createTableImportUseCase,
2222
present: ({ import: created }) => ({ data: toV2CreateTableImport(created) }),

0 commit comments

Comments
 (0)