Skip to content

Commit 12e43a6

Browse files
committed
chore(tables): tidy v1 error projection cleanup
1 parent 9e71105 commit 12e43a6

7 files changed

Lines changed: 31 additions & 36 deletions

File tree

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
checkAccess,
2828
orchestrationErrorResponse,
2929
orchestrationOutcomeErrorResponse,
30-
rowWriteErrorResponse,
3130
tableLockErrorResponse,
3231
} from '@/app/api/table/utils'
3332

@@ -211,7 +210,7 @@ export const PATCH = withRouteHandler(async (request: NextRequest, context: RowR
211210
rows: [updatedRow],
212211
})
213212
} catch (error) {
214-
const response = rowWriteErrorResponse(error)
213+
const response = orchestrationErrorResponse(error)
215214
if (response) return response
216215

217216
logger.error(`[${requestId}] Error updating row:`, error)

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import {
4040
resolveTableWriteSecretProvenance,
4141
} from '@/app/api/table/row-secret-provenance'
4242
import { type RowWireTranslators, rowWireTranslators } from '@/app/api/table/row-wire'
43-
import { accessError, checkAccess, rowWriteErrorResponse } from '@/app/api/table/utils'
43+
import { accessError, checkAccess, orchestrationErrorResponse } from '@/app/api/table/utils'
4444

4545
const logger = createLogger('TableRowsAPI')
4646

@@ -168,7 +168,7 @@ async function handleBatchInsert(
168168
rows: insertedRows,
169169
})
170170
} catch (error) {
171-
const response = rowWriteErrorResponse(error)
171+
const response = orchestrationErrorResponse(error)
172172
if (response) return response
173173

174174
logger.error(`[${requestId}] Error batch inserting rows:`, error)
@@ -284,7 +284,7 @@ export const POST = withRouteHandler(
284284
return validationErrorResponse(error)
285285
}
286286

287-
const response = rowWriteErrorResponse(error)
287+
const response = orchestrationErrorResponse(error)
288288
if (response) return response
289289

290290
logger.error(`[${requestId}] Error inserting row:`, error)
@@ -527,7 +527,7 @@ export const PUT = withRouteHandler(
527527
return NextResponse.json({ error: error.message }, { status: 400 })
528528
}
529529

530-
const response = rowWriteErrorResponse(error)
530+
const response = orchestrationErrorResponse(error)
531531
if (response) return response
532532

533533
logger.error(`[${requestId}] Error updating rows by filter:`, error)
@@ -627,7 +627,7 @@ export const DELETE = withRouteHandler(
627627
return NextResponse.json({ error: error.message }, { status: 400 })
628628
}
629629

630-
const response = rowWriteErrorResponse(error)
630+
const response = orchestrationErrorResponse(error)
631631
if (response) return response
632632

633633
logger.error(`[${requestId}] Error deleting rows:`, error)
@@ -716,7 +716,7 @@ export const PATCH = withRouteHandler(
716716
return validationErrorResponse(error)
717717
}
718718

719-
const response = rowWriteErrorResponse(error)
719+
const response = orchestrationErrorResponse(error)
720720
if (response) return response
721721

722722
logger.error(`[${requestId}] Error batch updating rows:`, error)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
resolveTableWriteSecretProvenance,
1616
} from '@/app/api/table/row-secret-provenance'
1717
import { rowWireTranslators } from '@/app/api/table/row-wire'
18-
import { accessError, checkAccess, rowWriteErrorResponse } from '@/app/api/table/utils'
18+
import { accessError, checkAccess, orchestrationErrorResponse } from '@/app/api/table/utils'
1919

2020
const logger = createLogger('TableUpsertAPI')
2121

@@ -105,7 +105,7 @@ export const POST = withRouteHandler(async (request: NextRequest, context: Upser
105105
return validationErrorResponse(error)
106106
}
107107

108-
const response = rowWriteErrorResponse(error)
108+
const response = orchestrationErrorResponse(error)
109109
if (response) return response
110110

111111
logger.error(`[${requestId}] Error upserting row:`, error)

apps/sim/app/api/table/utils.test.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import { OrchestrationError } from '@/lib/core/orchestration/types'
66
import { TableRowLimitError } from '@/lib/table/billing'
77
import type { ColumnDefinition } from '@/lib/table/types'
88
import {
9+
orchestrationErrorResponse,
910
orchestrationOutcomeErrorResponse,
1011
rootErrorMessage,
11-
rowWriteErrorResponse,
1212
tableFilterError,
1313
} from '@/app/api/table/utils'
1414

@@ -34,9 +34,9 @@ describe('rootErrorMessage', () => {
3434
})
3535
})
3636

37-
describe('rowWriteErrorResponse', () => {
37+
describe('orchestrationErrorResponse', () => {
3838
it('passes the plan row-limit error through as a 400', async () => {
39-
const response = rowWriteErrorResponse(new TableRowLimitError(10000))
39+
const response = orchestrationErrorResponse(new TableRowLimitError(10000))
4040
expect(response?.status).toBe(400)
4141
const body = await response?.json()
4242
expect(body.error).toBe(
@@ -45,7 +45,7 @@ describe('rowWriteErrorResponse', () => {
4545
})
4646

4747
it('passes a classified validation failure through as 400', async () => {
48-
const response = rowWriteErrorResponse(
48+
const response = orchestrationErrorResponse(
4949
new OrchestrationError('validation', 'Value for column "email" must be unique')
5050
)
5151
expect(response?.status).toBe(400)
@@ -55,24 +55,26 @@ describe('rowWriteErrorResponse', () => {
5555

5656
it('answers the code the failure carries, not one derived from its wording', () => {
5757
expect(
58-
rowWriteErrorResponse(new OrchestrationError('not_found', 'Row not found'))?.status
58+
orchestrationErrorResponse(new OrchestrationError('not_found', 'Row not found'))?.status
5959
).toBe(404)
6060
// The phrase that used to force a 400 no longer decides anything.
6161
expect(
62-
rowWriteErrorResponse(new OrchestrationError('conflict', 'Row 3: must be unique'))?.status
62+
orchestrationErrorResponse(new OrchestrationError('conflict', 'Row 3: must be unique'))
63+
?.status
6364
).toBe(409)
6465
})
6566

6667
it('unwraps a classified failure drizzle wrapped in a query error', () => {
6768
expect(
68-
rowWriteErrorResponse(wrapLikeDrizzle(new OrchestrationError('validation', 'Row 3: bad')))
69-
?.status
69+
orchestrationErrorResponse(
70+
wrapLikeDrizzle(new OrchestrationError('validation', 'Row 3: bad'))
71+
)?.status
7072
).toBe(400)
7173
})
7274

7375
it('returns null for unknown errors so callers keep their generic 500', () => {
74-
expect(rowWriteErrorResponse(new Error('connection refused'))).toBeNull()
75-
expect(rowWriteErrorResponse(wrapLikeDrizzle(new Error('deadlock detected')))).toBeNull()
76+
expect(orchestrationErrorResponse(new Error('connection refused'))).toBeNull()
77+
expect(orchestrationErrorResponse(wrapLikeDrizzle(new Error('deadlock detected')))).toBeNull()
7678
})
7779
})
7880

apps/sim/app/api/table/utils.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ export interface TableOrchestrationFailure {
154154
* counterpart of {@link orchestrationErrorResponse} for the functions that
155155
* return a failure instead of throwing one.
156156
*
157-
* Every table route must go through this rather than reading `outcome.error`
158-
* itself, for two reasons the per-route spellings kept getting wrong:
157+
* Routes go through this rather than reading `outcome.error` themselves, for
158+
* two reasons the per-route spellings kept getting wrong:
159159
*
160160
* - An unclassified failure carries whatever text the fault happened to have —
161161
* a driver's failed SQL and its bound parameters — so it renders `fallback`
@@ -177,12 +177,6 @@ export function orchestrationOutcomeErrorResponse(
177177
)
178178
}
179179

180-
/**
181-
* {@link orchestrationErrorResponse} under the name the row-write routes call
182-
* it by. Row writes have no classification rules of their own any more.
183-
*/
184-
export const rowWriteErrorResponse = orchestrationErrorResponse
185-
186180
/**
187181
* Next.js buffers the request body for the proxy and silently truncates it past this
188182
* size (`experimental.proxyClientMaxBodySize`, default 10MB). The synchronous CSV

apps/sim/app/api/v1/tables/[tableId]/rows/route.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import { signalTableRowsChanged } from '@/lib/table/events'
3333
import { createExactEmptyTableRowSecretProvenance } from '@/lib/table/rows/secret-provenance'
3434
import { queryRows } from '@/lib/table/rows/service'
3535
import { resolveFilterSelectValues } from '@/lib/table/select-values'
36-
import { accessError, checkAccess, rowWriteErrorResponse } from '@/app/api/table/utils'
36+
import { accessError, checkAccess, orchestrationErrorResponse } from '@/app/api/table/utils'
3737
import {
3838
checkRateLimit,
3939
checkWorkspaceScope,
@@ -109,7 +109,7 @@ async function handleBatchInsert(
109109
},
110110
})
111111
} catch (error) {
112-
const response = rowWriteErrorResponse(error)
112+
const response = orchestrationErrorResponse(error)
113113
if (response) return response
114114

115115
logger.error(`[${requestId}] Error batch inserting rows:`, error)
@@ -306,7 +306,7 @@ export const POST = withRouteHandler(
306306
const validationResponse = v1ValidationErrorResponseFromError(error)
307307
if (validationResponse) return validationResponse
308308

309-
const response = rowWriteErrorResponse(error)
309+
const response = orchestrationErrorResponse(error)
310310
if (response) return response
311311

312312
logger.error(`[${requestId}] Error inserting row:`, error)
@@ -402,7 +402,7 @@ export const PUT = withRouteHandler(async (request: NextRequest, context: TableR
402402
return NextResponse.json({ error: error.message }, { status: 400 })
403403
}
404404

405-
const response = rowWriteErrorResponse(error)
405+
const response = orchestrationErrorResponse(error)
406406
if (response) return response
407407

408408
logger.error(`[${requestId}] Error updating rows by filter:`, error)
@@ -497,7 +497,7 @@ export const DELETE = withRouteHandler(
497497
return NextResponse.json({ error: error.message }, { status: 400 })
498498
}
499499

500-
const response = rowWriteErrorResponse(error)
500+
const response = orchestrationErrorResponse(error)
501501
if (response) return response
502502

503503
logger.error(`[${requestId}] Error deleting rows:`, error)

apps/sim/app/api/v2/tables/utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import { getUserEmailsByIds, requireResolvedUserEmail } from '@/lib/users/querie
1717
import {
1818
CSV_IMPORT_PROXY_BODY_CAP_BYTES,
1919
normalizeColumn,
20+
orchestrationErrorResponse,
2021
rootErrorMessage,
21-
rowWriteErrorResponse,
2222
} from '@/app/api/table/utils'
2323
import { v2Error, v2ErrorForOrchestration } from '@/app/api/v2/lib/response'
2424

@@ -257,12 +257,12 @@ export function v2TableOrchestrationError(
257257

258258
/**
259259
* Maps a known user-facing row-write failure (schema/size/unique/limit) to a v2
260-
* `BAD_REQUEST`, reusing v1's {@link rowWriteErrorResponse} classifier as the
260+
* `BAD_REQUEST`, reusing v1's {@link orchestrationErrorResponse} classifier as the
261261
* single source of truth for which messages are safe to surface. Returns `null`
262262
* for unrecognized errors so the caller logs and returns a generic 500.
263263
*/
264264
export function v2RowWriteError(error: unknown): NextResponse | null {
265-
if (!rowWriteErrorResponse(error)) return null
265+
if (!orchestrationErrorResponse(error)) return null
266266
return v2Error('BAD_REQUEST', rootErrorMessage(error))
267267
}
268268

0 commit comments

Comments
 (0)