From 0ff8d3af6f2b45361896c270ee8f466416bba9f4 Mon Sep 17 00:00:00 2001 From: forehalo Date: Wed, 5 Feb 2025 10:09:57 +0000 Subject: [PATCH] feat(server): auto create page owner role (#9944) --- .../server/src/core/doc/adapters/workspace.ts | 10 ++++++++++ .../backend/server/src/core/permission/service.ts | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/packages/backend/server/src/core/doc/adapters/workspace.ts b/packages/backend/server/src/core/doc/adapters/workspace.ts index c2d1c4e277..d571ff1417 100644 --- a/packages/backend/server/src/core/doc/adapters/workspace.ts +++ b/packages/backend/server/src/core/doc/adapters/workspace.ts @@ -32,6 +32,11 @@ declare global { workspaceId: string; docId: string; }; + 'doc.update.pushed': { + workspaceId: string; + docId: string; + editor?: string; + }; } } @Injectable() @@ -105,6 +110,11 @@ export class PgWorkspaceDocStorageAdapter extends DocStorageAdapter { await this.updateCachedUpdatesCount(workspaceId, docId, batch.length); } }); + this.event.emit('doc.update.pushed', { + workspaceId, + docId, + editor: editorId, + }); } catch (e) { this.logger.error('Failed to insert doc updates', e); metrics.doc.counter('doc_update_insert_failed').add(1); diff --git a/packages/backend/server/src/core/permission/service.ts b/packages/backend/server/src/core/permission/service.ts index 0c9a628038..11eef54eca 100644 --- a/packages/backend/server/src/core/permission/service.ts +++ b/packages/backend/server/src/core/permission/service.ts @@ -6,6 +6,7 @@ import { groupBy } from 'lodash-es'; import { DocAccessDenied, EventBus, + OnEvent, SpaceAccessDenied, SpaceOwnerNotFound, SpaceShouldHaveOnlyOneOwner, @@ -29,6 +30,18 @@ export class PermissionService { private readonly event: EventBus ) {} + @OnEvent('doc.update.pushed') + async onDocUpdatePushed(payload: Events['doc.update.pushed']) { + const { workspaceId, docId, editor } = payload; + + await this.prisma.$queryRaw` + INSERT INTO "workspace_page_user_permissions" ("workspace_id", "page_id", "user_id", "type", "accepted", "created_at", "updated_at") + VALUES (${workspaceId}, ${docId}, ${editor}, ${DocRole.Owner}, true, now(), now()) + ON CONFLICT ("workspace_id", "page_id", "user_id") + DO NOTHING + `; + } + private get acceptedCondition() { return [ {