Skip to content

Commit 4d4de52

Browse files
authored
fix(project-files): hold the Project and permission-group locks shared for non-charging file operations (#9058)
1 parent 29158c6 commit 4d4de52

32 files changed

Lines changed: 397 additions & 184 deletions

‎apps/sim/lib/api/contracts/project-file-doc.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,18 @@ import { z } from 'zod'
22
import { persistFileDocResponseSchema } from '@/lib/api/contracts/file-doc'
33
import { defineRouteContract } from '@/lib/api/contracts/types'
44

5-
export const projectFileDocParamsSchema = z.object({
5+
const projectFileDocParamsSchema = z.object({
66
projectId: z.string().min(1),
77
fileId: z.string().min(1),
88
})
9-
export type ProjectFileDocParams = z.output<typeof projectFileDocParamsSchema>
109

11-
export const projectFileDocAccessResponseSchema = z.object({
10+
const projectFileDocAccessResponseSchema = z.object({
1211
projectId: z.string(),
1312
fileId: z.string(),
1413
canRead: z.literal(true),
1514
canWrite: z.boolean(),
1615
docId: z.string().min(1).max(128).nullable(),
1716
})
18-
export type ProjectFileDocAccessResponse = z.output<typeof projectFileDocAccessResponseSchema>
1917

2018
export const projectFileDocAccessContract = defineRouteContract({
2119
method: 'POST',
@@ -24,11 +22,10 @@ export const projectFileDocAccessContract = defineRouteContract({
2422
response: { mode: 'json', schema: projectFileDocAccessResponseSchema },
2523
})
2624

27-
export const projectFileDocSeedResponseSchema = z.object({
25+
const projectFileDocSeedResponseSchema = z.object({
2826
update: z.string(),
2927
version: z.number().int(),
3028
})
31-
export type ProjectFileDocSeedResponse = z.output<typeof projectFileDocSeedResponseSchema>
3229

3330
export const projectFileDocSeedContract = defineRouteContract({
3431
method: 'POST',
@@ -37,7 +34,7 @@ export const projectFileDocSeedContract = defineRouteContract({
3734
response: { mode: 'json', schema: projectFileDocSeedResponseSchema },
3835
})
3936

40-
export const projectFileDocPersistBodySchema = z
37+
const projectFileDocPersistBodySchema = z
4138
.object({
4239
docState: z
4340
.string()
@@ -46,7 +43,6 @@ export const projectFileDocPersistBodySchema = z
4643
expectedVersion: z.number().int().optional(),
4744
})
4845
.strict()
49-
export type ProjectFileDocPersistBody = z.input<typeof projectFileDocPersistBodySchema>
5046

5147
export const projectFileDocPersistContract = defineRouteContract({
5248
method: 'POST',

‎apps/sim/lib/api/contracts/project-file-folders.ts‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
export const projectFileFolderParamsSchema = projectFilesParamsSchema.extend({
1616
folderId: nonEmptyIdSchema,
1717
})
18-
export type ProjectFileFolderParams = z.input<typeof projectFileFolderParamsSchema>
1918

2019
export const projectFileFolderRecordSchema = workspaceFileFolderSchema
2120
.omit({ workspaceId: true })
@@ -28,11 +27,10 @@ export type ProjectFileFolderRecord = z.output<typeof projectFileFolderRecordSch
2827
export const listProjectFileFoldersQuerySchema = listWorkspaceFileFoldersQuerySchema
2928
export type ListProjectFileFoldersQuery = z.output<typeof listProjectFileFoldersQuerySchema>
3029

31-
export const listProjectFileFoldersResponseSchema = z.object({
30+
const listProjectFileFoldersResponseSchema = z.object({
3231
folders: z.array(projectFileFolderRecordSchema),
3332
capabilities: projectFileCapabilitiesSchema,
3433
})
35-
export type ListProjectFileFoldersResponse = z.output<typeof listProjectFileFoldersResponseSchema>
3634

3735
export const listProjectFileFoldersContract = defineRouteContract({
3836
method: 'GET',
@@ -48,8 +46,7 @@ export type CreateProjectFileFolderBody = z.input<typeof createProjectFileFolder
4846
export const updateProjectFileFolderBodySchema = updateWorkspaceFileFolderBodySchema
4947
export type UpdateProjectFileFolderBody = z.input<typeof updateProjectFileFolderBodySchema>
5048

51-
export const projectFileFolderResponseSchema = z.object({ folder: projectFileFolderRecordSchema })
52-
export type ProjectFileFolderResponse = z.output<typeof projectFileFolderResponseSchema>
49+
const projectFileFolderResponseSchema = z.object({ folder: projectFileFolderRecordSchema })
5350

5451
export const createProjectFileFolderContract = defineRouteContract({
5552
method: 'POST',

‎apps/sim/lib/api/contracts/project-file-lifecycle.ts‎

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ import {
1616
} from '@/lib/api/contracts/workspace-file-folders'
1717
import { renameWorkspaceFileBodySchema } from '@/lib/api/contracts/workspace-files'
1818

19-
export const renameProjectFileBodySchema = renameWorkspaceFileBodySchema.strict()
19+
const renameProjectFileBodySchema = renameWorkspaceFileBodySchema.strict()
2020
export type RenameProjectFileBody = z.input<typeof renameProjectFileBodySchema>
2121

22-
export const renameProjectFileResponseSchema = z.object({ file: projectFileRecordSchema })
23-
export type RenameProjectFileResponse = z.output<typeof renameProjectFileResponseSchema>
22+
const renameProjectFileResponseSchema = z.object({ file: projectFileRecordSchema })
2423

2524
export const renameProjectFileContract = defineRouteContract({
2625
method: 'PATCH',
@@ -30,7 +29,7 @@ export const renameProjectFileContract = defineRouteContract({
3029
response: { mode: 'json', schema: renameProjectFileResponseSchema },
3130
})
3231

33-
export const moveProjectFileItemsBodySchema = moveWorkspaceFileItemsBodySchema.strict()
32+
const moveProjectFileItemsBodySchema = moveWorkspaceFileItemsBodySchema.strict()
3433
export type MoveProjectFileItemsBody = z.input<typeof moveProjectFileItemsBodySchema>
3534

3635
export const moveProjectFileItemsResponseSchema = z.object({
@@ -39,7 +38,6 @@ export const moveProjectFileItemsResponseSchema = z.object({
3938
movedFileIds: z.array(nonEmptyIdSchema).describe('Identifiers of moved files.'),
4039
movedFolderIds: z.array(nonEmptyIdSchema).describe('Identifiers of moved folders.'),
4140
})
42-
export type MoveProjectFileItemsResponse = z.output<typeof moveProjectFileItemsResponseSchema>
4341

4442
export const moveProjectFileItemsContract = defineRouteContract({
4543
method: 'POST',
@@ -66,7 +64,6 @@ export const archiveProjectFileItemsResponseSchema = z.object({
6664
})
6765
.describe('Identifiers of affected file items.'),
6866
})
69-
export type ArchiveProjectFileItemsResponse = z.output<typeof archiveProjectFileItemsResponseSchema>
7067

7168
export const archiveProjectFileItemsContract = defineRouteContract({
7269
method: 'POST',
@@ -76,11 +73,10 @@ export const archiveProjectFileItemsContract = defineRouteContract({
7673
response: { mode: 'json', schema: archiveProjectFileItemsResponseSchema },
7774
})
7875

79-
export const restoreProjectFileResponseSchema = z.object({
76+
const restoreProjectFileResponseSchema = z.object({
8077
restored: z.literal(true),
8178
file: projectFileRecordSchema,
8279
})
83-
export type RestoreProjectFileResponse = z.output<typeof restoreProjectFileResponseSchema>
8480

8581
export const restoreProjectFileContract = defineRouteContract({
8682
method: 'POST',
@@ -99,9 +95,6 @@ export const restoreProjectFileFolderResponseSchema = z.object({
9995
})
10096
.describe('Counts of affected file items.'),
10197
})
102-
export type RestoreProjectFileFolderResponse = z.output<
103-
typeof restoreProjectFileFolderResponseSchema
104-
>
10598

10699
export const restoreProjectFileFolderContract = defineRouteContract({
107100
method: 'POST',

‎apps/sim/lib/api/contracts/project-file-uploads.ts‎

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,16 @@ import {
1414
v2UploadTransferSchema,
1515
} from '@/lib/api/contracts/v2/uploads'
1616

17-
export const projectFileUploadParamsSchema = projectFilesParamsSchema.extend({
17+
const projectFileUploadParamsSchema = projectFilesParamsSchema.extend({
1818
uploadId: nonEmptyIdSchema,
1919
})
20-
export type ProjectFileUploadParams = z.input<typeof projectFileUploadParamsSchema>
2120

2221
export const createProjectFileUploadBodySchema = v2CreateFileUploadBodySchema
2322
.omit({ workspaceId: true })
2423
.extend({ folderId: folderIdSchema.nullish() })
2524
.strict()
26-
export type CreateProjectFileUploadBody = z.input<typeof createProjectFileUploadBodySchema>
2725

28-
export const projectFileUploadSessionSchema = z
26+
const projectFileUploadSessionSchema = z
2927
.object({
3028
id: nonEmptyIdSchema,
3129
purpose: z.literal('project_file'),
@@ -40,14 +38,13 @@ export const projectFileUploadSessionSchema = z
4038
.strict()
4139
export type ProjectFileUploadSession = z.output<typeof projectFileUploadSessionSchema>
4240

43-
export const createProjectFileUploadResponseSchema = z
41+
const createProjectFileUploadResponseSchema = z
4442
.object({
4543
session: projectFileUploadSessionSchema,
4644
uploadToken: z.string().min(1),
4745
transfer: v2UploadTransferSchema,
4846
})
4947
.strict()
50-
export type CreateProjectFileUploadResponse = z.output<typeof createProjectFileUploadResponseSchema>
5148

5249
export const createProjectFileUploadContract = defineRouteContract({
5350
method: 'POST',

‎apps/sim/lib/api/contracts/project-file-versions.ts‎

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,34 @@ export const projectFileVersionSchema = v2FileVersionSchema.meta({
1515
title: 'Project file version',
1616
description: 'One recorded version of a shared Project file.',
1717
})
18-
export type ProjectFileVersion = z.output<typeof projectFileVersionSchema>
19-
export const projectFileVersionParamsSchema = projectFileParamsSchema.extend({
18+
const projectFileVersionParamsSchema = projectFileParamsSchema.extend({
2019
version: versionNumberPathSchema.describe('Version number.'),
2120
})
22-
export type ProjectFileVersionParams = z.input<typeof projectFileVersionParamsSchema>
2321
export const listProjectFileVersionsQuerySchema = v2ListFileVersionsQuerySchema.omit({
2422
workspaceId: true,
2523
})
26-
export type ListProjectFileVersionsQuery = z.output<typeof listProjectFileVersionsQuerySchema>
27-
export const listProjectFileVersionsResponseSchema = z.object({
24+
const listProjectFileVersionsResponseSchema = z.object({
2825
revision: writtenFileRevisionSchema,
2926
versions: z.array(projectFileVersionSchema),
3027
nextCursor: z.string().nullable(),
3128
})
32-
export type ListProjectFileVersionsResponse = z.output<typeof listProjectFileVersionsResponseSchema>
33-
export const getProjectFileVersionResponseSchema = z.object({ version: projectFileVersionSchema })
34-
export type GetProjectFileVersionResponse = z.output<typeof getProjectFileVersionResponseSchema>
29+
const getProjectFileVersionResponseSchema = z.object({ version: projectFileVersionSchema })
3530
export const revertProjectFileVersionBodySchema = v2RevertFileVersionBodySchema.omit({
3631
workspaceId: true,
3732
})
38-
export type RevertProjectFileVersionBody = z.input<typeof revertProjectFileVersionBodySchema>
39-
export const revertProjectFileVersionResponseSchema = z.object({
33+
const revertProjectFileVersionResponseSchema = z.object({
4034
reverted: z.boolean(),
4135
file: projectFileRecordSchema,
4236
version: projectFileVersionSchema,
4337
revision: writtenFileRevisionSchema,
4438
})
45-
export type RevertProjectFileVersionResponse = z.output<
46-
typeof revertProjectFileVersionResponseSchema
47-
>
4839
export const deleteProjectFileVersionResponseSchema = v2DeleteFileVersionResultSchema.extend({
4940
deleted: z
5041
.literal(true)
5142
.describe(
5243
'The version is no longer available; stored-object cleanup is retried asynchronously when needed.'
5344
),
5445
})
55-
export type DeleteProjectFileVersionResponse = z.output<
56-
typeof deleteProjectFileVersionResponseSchema
57-
>
5846

5947
export const listProjectFileVersionsContract = defineRouteContract({
6048
method: 'GET',

‎apps/sim/lib/api/contracts/project-files.ts‎

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@ import {
2727
import { FILE_BROWSER_SORTS } from '@/lib/workspace-files/browser'
2828

2929
export const projectFilesParamsSchema = z.object({ id: nonEmptyIdSchema })
30-
export type ProjectFilesParams = z.input<typeof projectFilesParamsSchema>
3130

3231
export const projectFileParamsSchema = projectFilesParamsSchema.extend({ fileId: nonEmptyIdSchema })
33-
export type ProjectFileParams = z.input<typeof projectFileParamsSchema>
3432

3533
export const projectFileRecordSchema = workspaceFileRecordSchema
3634
.omit({ workspaceId: true, storageContext: true, vfsNamespace: true })
@@ -44,9 +42,8 @@ export const projectFileCapabilitiesSchema = z.object({
4442
canRead: z.boolean(),
4543
canWrite: z.boolean(),
4644
})
47-
export type ProjectFileCapabilities = z.output<typeof projectFileCapabilitiesSchema>
4845

49-
export const listProjectFilesQuerySchema = z
46+
const listProjectFilesQuerySchema = z
5047
.object({
5148
scope: workspaceFileScopeSchema.default('active'),
5249
folderId: folderIdSchema.optional(),
@@ -64,7 +61,7 @@ export const listProjectFilesQuerySchema = z
6461
})
6562
export type ListProjectFilesQuery = z.output<typeof listProjectFilesQuerySchema>
6663

67-
export const listProjectFilesResponseSchema = z.object({
64+
const listProjectFilesResponseSchema = z.object({
6865
files: z.array(projectFileRecordSchema),
6966
items: z.array(fileBrowserItemSchema),
7067
creators: z.array(fileBrowserCreatorSchema),
@@ -81,11 +78,10 @@ export const listProjectFilesContract = defineRouteContract({
8178
response: { mode: 'json', schema: listProjectFilesResponseSchema },
8279
})
8380

84-
export const getProjectFileResponseSchema = z.object({
81+
const getProjectFileResponseSchema = z.object({
8582
file: projectFileRecordSchema,
8683
capabilities: projectFileCapabilitiesSchema,
8784
})
88-
export type GetProjectFileResponse = z.output<typeof getProjectFileResponseSchema>
8985

9086
export const getProjectFileContract = defineRouteContract({
9187
method: 'GET',
@@ -94,7 +90,7 @@ export const getProjectFileContract = defineRouteContract({
9490
response: { mode: 'json', schema: getProjectFileResponseSchema },
9591
})
9692

97-
export const createProjectFileBodySchema = createWorkspaceFileBodySchema.safeExtend({
93+
const createProjectFileBodySchema = createWorkspaceFileBodySchema.safeExtend({
9894
exactName: z.boolean().default(false),
9995
folderPath: z.string().max(4096).optional(),
10096
})
@@ -108,20 +104,16 @@ export const createProjectFileContract = defineRouteContract({
108104
response: { mode: 'json', schema: getProjectFileResponseSchema, status: 201 },
109105
})
110106

111-
export const updateProjectFileContentBodySchema = updateWorkspaceFileContentBodySchema
107+
const updateProjectFileContentBodySchema = updateWorkspaceFileContentBodySchema
112108
.safeExtend({
113109
expectedRevision: z.string().min(1).max(1024).optional(),
114110
contentType: z.string().trim().min(1).max(255).optional(),
115111
})
116112
.strict()
117-
export type UpdateProjectFileContentBody = z.input<typeof updateProjectFileContentBodySchema>
118113

119-
export const updateProjectFileContentResponseSchema = getProjectFileResponseSchema.safeExtend({
114+
const updateProjectFileContentResponseSchema = getProjectFileResponseSchema.safeExtend({
120115
file: projectFileRecordSchema.extend({ currentVersion: z.number().int().positive() }),
121116
})
122-
export type UpdateProjectFileContentResponse = z.output<
123-
typeof updateProjectFileContentResponseSchema
124-
>
125117

126118
export const updateProjectFileContentContract = defineRouteContract({
127119
method: 'PUT',
@@ -138,12 +130,11 @@ export const readProjectFileContentContract = defineRouteContract({
138130
response: { mode: 'binary' },
139131
})
140132

141-
export const projectFileArtifactQuerySchema = z.object({
133+
const projectFileArtifactQuerySchema = z.object({
142134
preview: z.enum(['1', '0']).optional(),
143135
v: z.string().max(128).optional(),
144136
t: z.string().max(32).optional(),
145137
})
146-
export type ProjectFileArtifactQuery = z.input<typeof projectFileArtifactQuerySchema>
147138

148139
export const readProjectFileArtifactContract = defineRouteContract({
149140
method: 'GET',

‎apps/sim/lib/api/contracts/v2/project-file-folders.ts‎

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@ import { defineRouteContract } from '@/lib/api/contracts/types'
1111
import { v2ProjectFilesParamsSchema } from '@/lib/api/contracts/v2/project-files'
1212
import { v2CursorListResponse, v2DataResponse } from '@/lib/api/contracts/v2/shared'
1313

14-
export const v2ProjectFileFolderParamsSchema = v2ProjectFilesParamsSchema.extend({
14+
const v2ProjectFileFolderParamsSchema = v2ProjectFilesParamsSchema.extend({
1515
folderId: nonEmptyIdSchema.describe('Folder identifier within the Project.'),
1616
})
17-
export type V2ProjectFileFolderParams = z.input<typeof v2ProjectFileFolderParamsSchema>
1817

19-
export const v2ProjectFileFolderSchema = projectFileFolderRecordSchema.extend({
18+
const v2ProjectFileFolderSchema = projectFileFolderRecordSchema.extend({
2019
id: nonEmptyIdSchema.describe('Stable folder identifier.'),
2120
owner: projectFileFolderRecordSchema.shape.owner
2221
.extend({
@@ -36,14 +35,13 @@ export const v2ProjectFileFolderSchema = projectFileFolderRecordSchema.extend({
3635
})
3736
export type V2ProjectFileFolder = z.output<typeof v2ProjectFileFolderSchema>
3837

39-
export const v2ListProjectFileFoldersQuerySchema = listProjectFileFoldersQuerySchema
38+
const v2ListProjectFileFoldersQuerySchema = listProjectFileFoldersQuerySchema
4039
.extend({
4140
scope: listProjectFileFoldersQuerySchema.shape.scope.describe('Folder lifecycle scope.'),
4241
})
4342
.strict()
44-
export type V2ListProjectFileFoldersQuery = z.output<typeof v2ListProjectFileFoldersQuerySchema>
4543

46-
export const v2CreateProjectFileFolderBodySchema = createProjectFileFolderBodySchema
44+
const v2CreateProjectFileFolderBodySchema = createProjectFileFolderBodySchema
4745
.extend({
4846
name: createProjectFileFolderBodySchema.shape.name.describe('Name for the new folder.'),
4947
parentId: nonEmptyIdSchema
@@ -52,9 +50,8 @@ export const v2CreateProjectFileFolderBodySchema = createProjectFileFolderBodySc
5250
.describe('Parent folder identifier; omit or use null for the root.'),
5351
})
5452
.strict()
55-
export type V2CreateProjectFileFolderBody = z.input<typeof v2CreateProjectFileFolderBodySchema>
5653

57-
export const v2UpdateProjectFileFolderBodySchema = updateProjectFileFolderBodySchema
54+
const v2UpdateProjectFileFolderBodySchema = updateProjectFileFolderBodySchema
5855
.extend({
5956
name: updateProjectFileFolderBodySchema.shape.name.describe(
6057
'New folder name; omit to leave unchanged.'
@@ -70,15 +67,10 @@ export const v2UpdateProjectFileFolderBodySchema = updateProjectFileFolderBodySc
7067
),
7168
})
7269
.strict()
73-
export type V2UpdateProjectFileFolderBody = z.input<typeof v2UpdateProjectFileFolderBodySchema>
7470

75-
export const v2RestoreProjectFileFolderResponseSchema =
76-
restoreProjectFileFolderResponseSchema.extend({
77-
folder: v2ProjectFileFolderSchema.describe('Restored Project folder.'),
78-
})
79-
export type V2RestoreProjectFileFolderResponse = z.output<
80-
typeof v2RestoreProjectFileFolderResponseSchema
81-
>
71+
const v2RestoreProjectFileFolderResponseSchema = restoreProjectFileFolderResponseSchema.extend({
72+
folder: v2ProjectFileFolderSchema.describe('Restored Project folder.'),
73+
})
8274

8375
export const v2ListProjectFileFoldersContract = defineRouteContract({
8476
method: 'GET',

0 commit comments

Comments
 (0)