Skip to content

Commit e1a294a

Browse files
Merge remote-tracking branch 'origin/staging' into feat/table-views
2 parents 1aae25b + b69fdbd commit e1a294a

39 files changed

Lines changed: 941 additions & 199 deletions

File tree

apps/docs/openapi.json

Lines changed: 439 additions & 1 deletion
Large diffs are not rendered by default.

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ const {
2626
vi.mock('@/app/api/v1/middleware', () => ({
2727
checkRateLimit: mockCheckRateLimit,
2828
createRateLimitResponse: vi.fn(),
29+
v1ValidationErrorResponse: (e: { issues: unknown[] }) =>
30+
NextResponse.json({ error: 'Validation error', details: e.issues }, { status: 400 }),
2931
}))
3032

3133
vi.mock('@/app/api/v1/audit-logs/auth', () => ({

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { getErrorMessage } from '@sim/utils/errors'
2424
import { generateId } from '@sim/utils/id'
2525
import { type NextRequest, NextResponse } from 'next/server'
2626
import { v1ListAuditLogsContract } from '@/lib/api/contracts/v1/audit-logs'
27-
import { getValidationErrorMessage, parseRequest } from '@/lib/api/server'
27+
import { parseRequest } from '@/lib/api/server'
2828
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
2929
import { validateEnterpriseAuditAccess } from '@/app/api/v1/audit-logs/auth'
3030
import { formatAuditLogEntry } from '@/app/api/v1/audit-logs/format'
@@ -35,7 +35,11 @@ import {
3535
queryAuditLogs,
3636
} from '@/app/api/v1/audit-logs/query'
3737
import { createApiResponse, getUserLimits } from '@/app/api/v1/logs/meta'
38-
import { checkRateLimit, createRateLimitResponse } from '@/app/api/v1/middleware'
38+
import {
39+
checkRateLimit,
40+
createRateLimitResponse,
41+
v1ValidationErrorResponse,
42+
} from '@/app/api/v1/middleware'
3943

4044
const logger = createLogger('V1AuditLogsAPI')
4145

@@ -65,14 +69,7 @@ export const GET = withRouteHandler(async (request: NextRequest) => {
6569
request,
6670
{},
6771
{
68-
validationErrorResponse: (error) =>
69-
NextResponse.json(
70-
{
71-
error: getValidationErrorMessage(error, 'Invalid parameters'),
72-
details: error.issues,
73-
},
74-
{ status: 400 }
75-
),
72+
validationErrorResponse: (error) => v1ValidationErrorResponse(error, 'Invalid parameters'),
7673
}
7774
)
7875
if (!parsed.success) return parsed.response

apps/sim/app/api/v1/files/[fileId]/route.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ vi.mock('@/app/api/v1/middleware', () => ({
2020
checkRateLimit: mockCheckRateLimit,
2121
createRateLimitResponse: () => new Response('rate limited', { status: 429 }),
2222
validateWorkspaceAccess: mockValidateWorkspaceAccess,
23+
v1ValidationErrorResponse: (e: { issues: unknown[] }) =>
24+
NextResponse.json({ error: 'Validation error', details: e.issues }, { status: 400 }),
2325
}))
2426
vi.mock('@/lib/uploads/contexts/workspace', () => ({
2527
getWorkspaceFile: mockGetWorkspaceFile,

apps/sim/app/api/v1/files/[fileId]/route.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { performDeleteWorkspaceFileItems } from '@/lib/workspace-files/orchestra
1515
import {
1616
checkRateLimit,
1717
createRateLimitResponse,
18+
v1ValidationErrorResponse,
1819
validateWorkspaceAccess,
1920
} from '@/app/api/v1/middleware'
2021

@@ -38,7 +39,9 @@ export const GET = withRouteHandler(async (request: NextRequest, context: FileRo
3839
}
3940

4041
const userId = rateLimit.userId!
41-
const parsed = await parseRequest(v1DownloadFileContract, request, context)
42+
const parsed = await parseRequest(v1DownloadFileContract, request, context, {
43+
validationErrorResponse: v1ValidationErrorResponse,
44+
})
4245
if (!parsed.success) return parsed.response
4346

4447
const { fileId } = parsed.data.params
@@ -119,7 +122,9 @@ export const DELETE = withRouteHandler(async (request: NextRequest, context: Fil
119122
}
120123

121124
const userId = rateLimit.userId!
122-
const parsed = await parseRequest(v1DeleteFileContract, request, context)
125+
const parsed = await parseRequest(v1DeleteFileContract, request, context, {
126+
validationErrorResponse: v1ValidationErrorResponse,
127+
})
123128
if (!parsed.success) return parsed.response
124129

125130
const { fileId } = parsed.data.params

apps/sim/app/api/v1/files/route.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
checkRateLimit,
2323
checkWorkspaceScope,
2424
createRateLimitResponse,
25+
v1ValidationErrorResponse,
2526
validateWorkspaceAccess,
2627
} from '@/app/api/v1/middleware'
2728

@@ -43,7 +44,14 @@ export const GET = withRouteHandler(async (request: NextRequest) => {
4344
}
4445

4546
const userId = rateLimit.userId!
46-
const parsed = await parseRequest(v1ListFilesContract, request, {})
47+
const parsed = await parseRequest(
48+
v1ListFilesContract,
49+
request,
50+
{},
51+
{
52+
validationErrorResponse: v1ValidationErrorResponse,
53+
}
54+
)
4755
if (!parsed.success) return parsed.response
4856

4957
const { workspaceId } = parsed.data.query

apps/sim/app/api/v1/knowledge/[id]/documents/[documentId]/route.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { parseRequest } from '@/lib/api/server'
1111
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
1212
import { deleteDocument } from '@/lib/knowledge/documents/service'
1313
import { handleError, resolveKnowledgeBase, serializeDate } from '@/app/api/v1/knowledge/utils'
14-
import { authenticateRequest } from '@/app/api/v1/middleware'
14+
import { authenticateRequest, v1ValidationErrorResponse } from '@/app/api/v1/middleware'
1515

1616
export const dynamic = 'force-dynamic'
1717
export const revalidate = 0
@@ -28,7 +28,9 @@ export const GET = withRouteHandler(
2828
const { requestId, userId, rateLimit } = auth
2929

3030
try {
31-
const parsed = await parseRequest(v1GetKnowledgeDocumentContract, request, context)
31+
const parsed = await parseRequest(v1GetKnowledgeDocumentContract, request, context, {
32+
validationErrorResponse: v1ValidationErrorResponse,
33+
})
3234
if (!parsed.success) return parsed.response
3335
const { id: knowledgeBaseId, documentId } = parsed.data.params
3436

@@ -117,7 +119,9 @@ export const DELETE = withRouteHandler(
117119
const { requestId, userId, rateLimit } = auth
118120

119121
try {
120-
const parsed = await parseRequest(v1DeleteKnowledgeDocumentContract, request, context)
122+
const parsed = await parseRequest(v1DeleteKnowledgeDocumentContract, request, context, {
123+
validationErrorResponse: v1ValidationErrorResponse,
124+
})
121125
if (!parsed.success) return parsed.response
122126
const { id: knowledgeBaseId, documentId } = parsed.data.params
123127

apps/sim/app/api/v1/knowledge/[id]/documents/route.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ const SYSTEM_BILLING_ATTRIBUTION = {
4646

4747
vi.mock('@/app/api/v1/middleware', () => ({
4848
authenticateRequest: mockAuthenticateRequest,
49+
v1ValidationErrorResponse: (e: { issues: unknown[] }) =>
50+
NextResponse.json({ error: 'Validation error', details: e.issues }, { status: 400 }),
4951
}))
5052

5153
vi.mock('@/app/api/v1/knowledge/utils', () => ({

apps/sim/app/api/v1/knowledge/[id]/documents/route.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import type { DocumentSortField, SortOrder } from '@/lib/knowledge/documents/typ
2626
import { uploadWorkspaceFile } from '@/lib/uploads/contexts/workspace'
2727
import { validateFileType } from '@/lib/uploads/utils/validation'
2828
import { handleError, resolveKnowledgeBase, serializeDate } from '@/app/api/v1/knowledge/utils'
29-
import { authenticateRequest } from '@/app/api/v1/middleware'
29+
import { authenticateRequest, v1ValidationErrorResponse } from '@/app/api/v1/middleware'
3030

3131
export const dynamic = 'force-dynamic'
3232
export const revalidate = 0
@@ -44,7 +44,9 @@ export const GET = withRouteHandler(async (request: NextRequest, context: Docume
4444
const { requestId, userId, rateLimit } = auth
4545

4646
try {
47-
const parsed = await parseRequest(v1ListKnowledgeDocumentsContract, request, context)
47+
const parsed = await parseRequest(v1ListKnowledgeDocumentsContract, request, context, {
48+
validationErrorResponse: v1ValidationErrorResponse,
49+
})
4850
if (!parsed.success) return parsed.response
4951

5052
const { workspaceId, limit, offset, search, enabledFilter, sortBy, sortOrder } =
@@ -99,7 +101,9 @@ export const POST = withRouteHandler(
99101
const { requestId, userId, rateLimit } = auth
100102

101103
try {
102-
const parsed = await parseRequest(v1UploadKnowledgeDocumentContract, request, context)
104+
const parsed = await parseRequest(v1UploadKnowledgeDocumentContract, request, context, {
105+
validationErrorResponse: v1ValidationErrorResponse,
106+
})
103107
if (!parsed.success) return parsed.response
104108
const { id: knowledgeBaseId } = parsed.data.params
105109

apps/sim/app/api/v1/knowledge/[id]/route.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
handleError,
1414
resolveKnowledgeBase,
1515
} from '@/app/api/v1/knowledge/utils'
16-
import { authenticateRequest } from '@/app/api/v1/middleware'
16+
import { authenticateRequest, v1ValidationErrorResponse } from '@/app/api/v1/middleware'
1717

1818
export const dynamic = 'force-dynamic'
1919
export const revalidate = 0
@@ -29,7 +29,9 @@ export const GET = withRouteHandler(async (request: NextRequest, context: Knowle
2929
const { requestId, userId, rateLimit } = auth
3030

3131
try {
32-
const parsed = await parseRequest(v1GetKnowledgeBaseContract, request, context)
32+
const parsed = await parseRequest(v1GetKnowledgeBaseContract, request, context, {
33+
validationErrorResponse: v1ValidationErrorResponse,
34+
})
3335
if (!parsed.success) return parsed.response
3436

3537
const { id } = parsed.data.params
@@ -54,7 +56,9 @@ export const PUT = withRouteHandler(async (request: NextRequest, context: Knowle
5456
const { requestId, userId, rateLimit } = auth
5557

5658
try {
57-
const parsed = await parseRequest(v1UpdateKnowledgeBaseContract, request, context)
59+
const parsed = await parseRequest(v1UpdateKnowledgeBaseContract, request, context, {
60+
validationErrorResponse: v1ValidationErrorResponse,
61+
})
5862
if (!parsed.success) return parsed.response
5963

6064
const { id } = parsed.data.params
@@ -106,7 +110,9 @@ export const DELETE = withRouteHandler(
106110
const { requestId, userId, rateLimit } = auth
107111

108112
try {
109-
const parsed = await parseRequest(v1DeleteKnowledgeBaseContract, request, context)
113+
const parsed = await parseRequest(v1DeleteKnowledgeBaseContract, request, context, {
114+
validationErrorResponse: v1ValidationErrorResponse,
115+
})
110116
if (!parsed.success) return parsed.response
111117

112118
const { id } = parsed.data.params

0 commit comments

Comments
 (0)