diff --git a/packages/backend/server/src/__tests__/__snapshots__/mails.spec.ts.md b/packages/backend/server/src/__tests__/__snapshots__/mails.spec.ts.md index 96c52d35ab..4796d6973b 100644 --- a/packages/backend/server/src/__tests__/__snapshots__/mails.spec.ts.md +++ b/packages/backend/server/src/__tests__/__snapshots__/mails.spec.ts.md @@ -902,17 +902,54 @@ Generated by [AVA](https://avajs.dev). ␊ ␊ ␊ - ␊ - test@test.com has joined␊ - Test Workspace␊ -

␊ + ␊ + ␊ + ␊ + ␊ + test@test.com has joined␊ + Test Workspace␊ +

␊ + ␊ + ␊ + ␊ + ␊ + ␊ + ␊ + Open Workspace Members␊ + ␊ + ␊ + ␊ ␊ ␊ ␊ diff --git a/packages/backend/server/src/__tests__/__snapshots__/mails.spec.ts.snap b/packages/backend/server/src/__tests__/__snapshots__/mails.spec.ts.snap index 26be3d2f1a..97131d67b9 100644 Binary files a/packages/backend/server/src/__tests__/__snapshots__/mails.spec.ts.snap and b/packages/backend/server/src/__tests__/__snapshots__/mails.spec.ts.snap differ diff --git a/packages/backend/server/src/core/notification/service.ts b/packages/backend/server/src/core/notification/service.ts index 8b80462eea..d699bd5f74 100644 --- a/packages/backend/server/src/core/notification/service.ts +++ b/packages/backend/server/src/core/notification/service.ts @@ -16,6 +16,10 @@ import { import { DocReader } from '../doc'; import { Mailer } from '../mail'; import { generateDocPath } from '../utils/doc'; +import { + generateWorkspaceSettingsPath, + WorkspaceSettingsTab, +} from '../utils/workspace'; @Injectable() export class NotificationService { @@ -167,6 +171,12 @@ export class NotificationService { workspace: { $$workspaceId: workspaceId, }, + url: this.url.link( + generateWorkspaceSettingsPath({ + workspaceId, + tab: WorkspaceSettingsTab.members, + }) + ), }, }); this.logger.log( @@ -226,7 +236,12 @@ export class NotificationService { workspace: { $$workspaceId: workspaceId, }, - url: this.url.link(`/workspace/${workspaceId}`), + url: this.url.link( + generateWorkspaceSettingsPath({ + workspaceId, + tab: WorkspaceSettingsTab.members, + }) + ), }, }); this.logger.log( diff --git a/packages/backend/server/src/core/utils/workspace.ts b/packages/backend/server/src/core/utils/workspace.ts new file mode 100644 index 0000000000..786391af00 --- /dev/null +++ b/packages/backend/server/src/core/utils/workspace.ts @@ -0,0 +1,20 @@ +export enum WorkspaceSettingsTab { + members = 'workspace:members', +} + +type SettingsPathParams = { + workspaceId: string; + tab: WorkspaceSettingsTab; +}; + +/** + * To generate a workspace settings url path like + * + * /workspace/{workspaceId}/settings?tab={tab} + */ +export function generateWorkspaceSettingsPath(params: SettingsPathParams) { + const search = new URLSearchParams({ + tab: params.tab, + }); + return `/workspace/${params.workspaceId}/settings?${search.toString()}`; +} diff --git a/packages/backend/server/src/mails/workspaces/invitation-accepted.tsx b/packages/backend/server/src/mails/workspaces/invitation-accepted.tsx index 8094b3ef28..dbdc04561f 100644 --- a/packages/backend/server/src/mails/workspaces/invitation-accepted.tsx +++ b/packages/backend/server/src/mails/workspaces/invitation-accepted.tsx @@ -1,5 +1,6 @@ import { TEST_USER, TEST_WORKSPACE } from '../common'; import { + Button, Content, P, Template, @@ -13,10 +14,11 @@ import { export type InvitationAcceptedProps = { user: UserProps; workspace: WorkspaceProps; + url: string; }; export default function InvitationAccepted(props: InvitationAcceptedProps) { - const { user, workspace } = props; + const { user, workspace, url } = props; return ( ); @@ -32,4 +35,5 @@ export default function InvitationAccepted(props: InvitationAcceptedProps) { InvitationAccepted.PreviewProps = { user: TEST_USER, workspace: TEST_WORKSPACE, + url: 'https://app.affine.pro', };