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␊
+ ␊
+ ␊
+ ␊
+ ␊
+ ␊
| ␊
␊
␊
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 (
{user.email} accepted your invitation
@@ -24,6 +26,7 @@ export default function InvitationAccepted(props: InvitationAcceptedProps) {
has joined
+
);
@@ -32,4 +35,5 @@ export default function InvitationAccepted(props: InvitationAcceptedProps) {
InvitationAccepted.PreviewProps = {
user: TEST_USER,
workspace: TEST_WORKSPACE,
+ url: 'https://app.affine.pro',
};