From e0cada49f5ba4b97805bbc22d8940cc253c742fa Mon Sep 17 00:00:00 2001 From: liuyi Date: Wed, 6 Dec 2023 08:35:48 +0000 Subject: [PATCH] refactor(server): do not force init binary when creating workspace (#5146) --- .../src/modules/sync/events/events.gateway.ts | 5 +- .../server/src/modules/workspaces/resolver.ts | 50 +++++++++++-------- packages/backend/server/src/schema.gql | 2 +- .../graphql/src/graphql/create-workspace.gql | 4 +- .../frontend/graphql/src/graphql/index.ts | 6 +-- packages/frontend/graphql/src/schema.ts | 4 +- .../frontend/workspace/src/affine/crud.ts | 7 +-- 7 files changed, 37 insertions(+), 41 deletions(-) diff --git a/packages/backend/server/src/modules/sync/events/events.gateway.ts b/packages/backend/server/src/modules/sync/events/events.gateway.ts index f847842c1..495324118 100644 --- a/packages/backend/server/src/modules/sync/events/events.gateway.ts +++ b/packages/backend/server/src/modules/sync/events/events.gateway.ts @@ -25,7 +25,6 @@ import { EventError, InternalError, NotInWorkspaceError, - WorkspaceNotFoundError, } from './error'; export const GatewayErrorWrapper = (): MethodDecorator => { @@ -319,9 +318,7 @@ export class EventsGateway implements OnGatewayConnection, OnGatewayDisconnect { if (!doc) { return { - error: docId.isWorkspace - ? new WorkspaceNotFoundError(workspaceId) - : new DocNotFoundError(workspaceId, docId.guid), + error: new DocNotFoundError(workspaceId, docId.guid), }; } diff --git a/packages/backend/server/src/modules/workspaces/resolver.ts b/packages/backend/server/src/modules/workspaces/resolver.ts index 6b83076e3..e1aae88a1 100644 --- a/packages/backend/server/src/modules/workspaces/resolver.ts +++ b/packages/backend/server/src/modules/workspaces/resolver.ts @@ -308,22 +308,11 @@ export class WorkspaceResolver { }) async createWorkspace( @CurrentUser() user: UserType, - @Args({ name: 'init', type: () => GraphQLUpload }) - update: FileUpload + // we no longer support init workspace with a preload file + // use sync system to uploading them once created + @Args({ name: 'init', type: () => GraphQLUpload, nullable: true }) + init: FileUpload | null ) { - // convert stream to buffer - const buffer = await new Promise((resolve, reject) => { - const stream = update.createReadStream(); - const chunks: Uint8Array[] = []; - stream.on('data', chunk => { - chunks.push(chunk); - }); - stream.on('error', reject); - stream.on('end', () => { - resolve(Buffer.concat(chunks)); - }); - }); - const workspace = await this.prisma.workspace.create({ data: { public: false, @@ -341,14 +330,31 @@ export class WorkspaceResolver { }, }); - if (buffer.length) { - await this.prisma.snapshot.create({ - data: { - id: workspace.id, - workspaceId: workspace.id, - blob: buffer, - }, + if (init) { + // convert stream to buffer + const buffer = await new Promise(resolve => { + const stream = init.createReadStream(); + const chunks: Uint8Array[] = []; + stream.on('data', chunk => { + chunks.push(chunk); + }); + stream.on('error', () => { + resolve(Buffer.from([])); + }); + stream.on('end', () => { + resolve(Buffer.concat(chunks)); + }); }); + + if (buffer.length) { + await this.prisma.snapshot.create({ + data: { + id: workspace.id, + workspaceId: workspace.id, + blob: buffer, + }, + }); + } } return workspace; diff --git a/packages/backend/server/src/schema.gql b/packages/backend/server/src/schema.gql index 68dc28c52..c6ee591b2 100644 --- a/packages/backend/server/src/schema.gql +++ b/packages/backend/server/src/schema.gql @@ -292,7 +292,7 @@ type Mutation { sendVerifyChangeEmail(token: String!, email: String!, callbackUrl: String!): Boolean! """Create a new workspace""" - createWorkspace(init: Upload!): WorkspaceType! + createWorkspace(init: Upload): WorkspaceType! """Update workspace""" updateWorkspace(input: UpdateWorkspaceInput!): WorkspaceType! diff --git a/packages/frontend/graphql/src/graphql/create-workspace.gql b/packages/frontend/graphql/src/graphql/create-workspace.gql index 315768c16..2b849ad97 100644 --- a/packages/frontend/graphql/src/graphql/create-workspace.gql +++ b/packages/frontend/graphql/src/graphql/create-workspace.gql @@ -1,5 +1,5 @@ -mutation createWorkspace($init: Upload!) { - createWorkspace(init: $init) { +mutation createWorkspace { + createWorkspace { id public createdAt diff --git a/packages/frontend/graphql/src/graphql/index.ts b/packages/frontend/graphql/src/graphql/index.ts index 9f543e056..bc2d22c79 100644 --- a/packages/frontend/graphql/src/graphql/index.ts +++ b/packages/frontend/graphql/src/graphql/index.ts @@ -153,10 +153,10 @@ export const createWorkspaceMutation = { id: 'createWorkspaceMutation' as const, operationName: 'createWorkspace', definitionName: 'createWorkspace', - containsFile: true, + containsFile: false, query: ` -mutation createWorkspace($init: Upload!) { - createWorkspace(init: $init) { +mutation createWorkspace { + createWorkspace { id public createdAt diff --git a/packages/frontend/graphql/src/schema.ts b/packages/frontend/graphql/src/schema.ts index b0243ca90..7010647b6 100644 --- a/packages/frontend/graphql/src/schema.ts +++ b/packages/frontend/graphql/src/schema.ts @@ -199,9 +199,7 @@ export type CreateCustomerPortalMutation = { createCustomerPortal: string; }; -export type CreateWorkspaceMutationVariables = Exact<{ - init: Scalars['Upload']['input']; -}>; +export type CreateWorkspaceMutationVariables = Exact<{ [key: string]: never }>; export type CreateWorkspaceMutation = { __typename?: 'Mutation'; diff --git a/packages/frontend/workspace/src/affine/crud.ts b/packages/frontend/workspace/src/affine/crud.ts index e4a656c40..434cd729b 100644 --- a/packages/frontend/workspace/src/affine/crud.ts +++ b/packages/frontend/workspace/src/affine/crud.ts @@ -40,13 +40,8 @@ export const CRUD: WorkspaceCRUD = { } const { createWorkspace } = await fetcher({ query: createWorkspaceMutation, - variables: { - init: new File( - [Y.encodeStateAsUpdate(upstreamWorkspace.doc)], - 'initBinary.yDoc' - ), - }, }); + createdWorkspaces.push(upstreamWorkspace.id); const newBlockSuiteWorkspace = getOrCreateWorkspace( createWorkspace.id,