From 8f124c5070f82a4043c1126ed7d3d3ee4beeadc4 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Thu, 27 Mar 2025 00:41:22 +0000 Subject: [PATCH] fix(server): use client doc title when server title is empty (#11210) close CLOUD-185 --- .../src/__tests__/mocks/doc-meta.mock.ts | 16 +++++++++++ .../server/src/__tests__/mocks/index.ts | 2 ++ .../notification/__tests__/service.spec.ts | 28 +++++++++++++++++++ .../server/src/core/notification/service.ts | 2 +- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 packages/backend/server/src/__tests__/mocks/doc-meta.mock.ts diff --git a/packages/backend/server/src/__tests__/mocks/doc-meta.mock.ts b/packages/backend/server/src/__tests__/mocks/doc-meta.mock.ts new file mode 100644 index 000000000..938995c94 --- /dev/null +++ b/packages/backend/server/src/__tests__/mocks/doc-meta.mock.ts @@ -0,0 +1,16 @@ +import type { WorkspaceDoc } from '@prisma/client'; +import { Prisma } from '@prisma/client'; + +import { Mocker } from './factory'; + +export type MockDocMetaInput = Prisma.WorkspaceDocUncheckedCreateInput; + +export type MockedDocMeta = WorkspaceDoc; + +export class MockDocMeta extends Mocker { + override async create(input: MockDocMetaInput) { + return await this.db.workspaceDoc.create({ + data: input, + }); + } +} diff --git a/packages/backend/server/src/__tests__/mocks/index.ts b/packages/backend/server/src/__tests__/mocks/index.ts index d210f228f..785103b86 100644 --- a/packages/backend/server/src/__tests__/mocks/index.ts +++ b/packages/backend/server/src/__tests__/mocks/index.ts @@ -4,6 +4,7 @@ export * from './user.mock'; export * from './workspace.mock'; export * from './workspace-user.mock'; +import { MockDocMeta } from './doc-meta.mock'; import { MockMailer } from './mailer.mock'; import { MockJobQueue } from './queue.mock'; import { MockTeamWorkspace } from './team-workspace.mock'; @@ -18,6 +19,7 @@ export const Mockers = { TeamWorkspace: MockTeamWorkspace, WorkspaceUser: MockWorkspaceUser, UserSettings: MockUserSettings, + DocMeta: MockDocMeta, }; export { MockJobQueue, MockMailer }; diff --git a/packages/backend/server/src/core/notification/__tests__/service.spec.ts b/packages/backend/server/src/core/notification/__tests__/service.spec.ts index daeef5048..ff0849ee2 100644 --- a/packages/backend/server/src/core/notification/__tests__/service.spec.ts +++ b/packages/backend/server/src/core/notification/__tests__/service.spec.ts @@ -587,3 +587,31 @@ test('should send mention email by user setting', async t => { // should not send mention email t.is(module.mails.count('Mention'), mentionMailCount); }); + +test('should send mention email with use client doc title if server doc title is empty', async t => { + const { notificationService, module } = t.context; + const docId = randomUUID(); + await module.create(Mockers.DocMeta, { + workspaceId: workspace.id, + docId, + // mock empty title + title: '', + }); + const notification = await notificationService.createMention({ + userId: member.id, + body: { + workspaceId: workspace.id, + createdByUserId: owner.id, + doc: { + id: docId, + title: 'doc-title-1', + blockId: 'block-id-1', + mode: DocMode.page, + }, + }, + }); + t.truthy(notification); + const mentionMail = module.mails.last('Mention'); + t.is(mentionMail.to, member.email); + t.is(mentionMail.props.doc.title, 'doc-title-1'); +}); diff --git a/packages/backend/server/src/core/notification/service.ts b/packages/backend/server/src/core/notification/service.ts index b923eab3c..a785f3202 100644 --- a/packages/backend/server/src/core/notification/service.ts +++ b/packages/backend/server/src/core/notification/service.ts @@ -57,7 +57,7 @@ export class NotificationService { input.body.workspaceId, input.body.doc.id ); - const title = doc?.title ?? input.body.doc.title; + const title = doc?.title || input.body.doc.title; const url = this.url.link( generateDocPath({ workspaceId: input.body.workspaceId,