From 3d2c4fe007d596855c40d529391bc6027765a870 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Wed, 5 Mar 2025 01:49:33 +0000 Subject: [PATCH] feat(server): add user existence check and optimize permission queries (#10402) --- .../server/src/__tests__/models/user.spec.ts | 8 ++++++++ .../server/src/base/graphql/pagination.ts | 2 +- .../server/src/core/workspaces/resolvers/doc.ts | 16 ++++------------ packages/backend/server/src/models/user.ts | 7 +++++++ 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/backend/server/src/__tests__/models/user.spec.ts b/packages/backend/server/src/__tests__/models/user.spec.ts index 6109cc143..4ce583530 100644 --- a/packages/backend/server/src/__tests__/models/user.spec.ts +++ b/packages/backend/server/src/__tests__/models/user.spec.ts @@ -297,6 +297,14 @@ test('should paginate users', async t => { ); }); +test('should check if user exists', async t => { + const user = await t.context.user.create({ + email: 'test@affine.pro', + }); + t.true(await t.context.user.exists(user.id)); + t.false(await t.context.user.exists('non-existing-user')); +}); + // #region ConnectedAccount test('should create, get, update, delete connected account', async t => { diff --git a/packages/backend/server/src/base/graphql/pagination.ts b/packages/backend/server/src/base/graphql/pagination.ts index 1c0fde85b..6e851b825 100644 --- a/packages/backend/server/src/base/graphql/pagination.ts +++ b/packages/backend/server/src/base/graphql/pagination.ts @@ -102,7 +102,7 @@ export class PageInfo { hasPreviousPage!: boolean; } -export function Paginated(classRef: Type): any { +export function Paginated(classRef: Type) { @ObjectType(`${classRef.name}Edge`) abstract class EdgeType { @Field(() => String) diff --git a/packages/backend/server/src/core/workspaces/resolvers/doc.ts b/packages/backend/server/src/core/workspaces/resolvers/doc.ts index 50834c190..4a26ce4c7 100644 --- a/packages/backend/server/src/core/workspaces/resolvers/doc.ts +++ b/packages/backend/server/src/core/workspaces/resolvers/doc.ts @@ -498,22 +498,14 @@ export class DocResolver { ]); }); - const users = new Map( - await Promise.all( - permissions.map( - async p => - [p.userId, await this.models.user.getPublicUser(p.userId)] as [ - string, - PublicUserType, - ] - ) - ) + const publicUsers = await this.models.user.getPublicUsers( + permissions.map(p => p.userId) ); - + const publicUsersMap = new Map(publicUsers.map(pu => [pu.id, pu])); return paginate( permissions.map(p => ({ ...p, - user: users.get(p.userId), + user: publicUsersMap.get(p.userId) as PublicUserType, })), 'createdAt', pagination, diff --git a/packages/backend/server/src/models/user.ts b/packages/backend/server/src/models/user.ts index 21a0df419..1aac574b4 100644 --- a/packages/backend/server/src/models/user.ts +++ b/packages/backend/server/src/models/user.ts @@ -61,6 +61,13 @@ export class UserModel extends BaseModel { }); } + async exists(id: string) { + const count = await this.db.user.count({ + where: { id }, + }); + return count > 0; + } + async getPublicUser(id: string): Promise { return this.db.user.findUnique({ select: publicUserSelect,