feat(server): supplement team email remind (#9483)

fix PD-2047 AF-1996
This commit is contained in:
darkskygit
2025-01-21 05:18:02 +00:00
parent 42428fbf99
commit 1116a1d74e
13 changed files with 345 additions and 17 deletions

View File

@@ -460,6 +460,10 @@ export class PermissionService {
workspaceId,
count,
});
this.event.emit('workspace.members.removed', {
workspaceId,
userId: user,
});
if (
permission.status === 'UnderReview' ||

View File

@@ -38,6 +38,7 @@ import {
WorkspaceBlobResolver,
WorkspaceService,
],
exports: [WorkspaceService],
})
export class WorkspaceModule {}

View File

@@ -2,7 +2,13 @@ import { Injectable, Logger } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
import { getStreamAsBuffer } from 'get-stream';
import { Cache, MailService, UserNotFound } from '../../../base';
import {
Cache,
type EventPayload,
MailService,
OnEvent,
UserNotFound,
} from '../../../base';
import { Models } from '../../../models';
import { DocContentService } from '../../doc-renderer';
import { Permission, PermissionService } from '../../permission';
@@ -131,7 +137,24 @@ export class WorkspaceService {
return true;
}
async sendReviewRequestedMail(inviteId: string) {
async sendTeamWorkspaceUpgradedEmail(workspaceId: string) {
const workspace = await this.getWorkspaceInfo(workspaceId);
const owner = await this.permission.getWorkspaceOwner(workspaceId);
const admin = await this.permission.getWorkspaceAdmin(workspaceId);
await this.mailer.sendTeamWorkspaceUpgradedEmail(owner.email, {
...workspace,
isOwner: true,
});
for (const user of admin) {
await this.mailer.sendTeamWorkspaceUpgradedEmail(user.email, {
...workspace,
isOwner: false,
});
}
}
async sendReviewRequestedEmail(inviteId: string) {
const { workspaceId, inviteeUserId } = await this.getInviteInfo(inviteId);
if (!inviteeUserId) {
this.logger.error(`Invitee user not found for inviteId: ${inviteId}`);
@@ -151,7 +174,7 @@ export class WorkspaceService {
const admin = await this.permission.getWorkspaceAdmin(workspaceId);
for (const user of [owner, ...admin]) {
await this.mailer.sendReviewRequestMail(
await this.mailer.sendReviewRequestEmail(
user.email,
invitee.email,
workspace
@@ -159,7 +182,7 @@ export class WorkspaceService {
}
}
async sendInviteMail(inviteId: string) {
async sendInviteEmail(inviteId: string) {
const target = await this.getInviteeEmailTarget(inviteId);
if (!target) {
@@ -208,8 +231,43 @@ export class WorkspaceService {
});
}
async sendOwnerTransferred(email: string, ws: { id: string }) {
async sendOwnerTransferredEmail(email: string, ws: { id: string }) {
const workspace = await this.getWorkspaceInfo(ws.id);
await this.mailer.sendOwnerTransferred(email, { name: workspace.name });
await this.mailer.sendOwnershipTransferredEmail(email, {
name: workspace.name,
});
}
async sendMemberRemoved(email: string, ws: { id: string }) {
const workspace = await this.getWorkspaceInfo(ws.id);
await this.mailer.sendMemberRemovedEmail(email, {
name: workspace.name,
});
}
@OnEvent('workspace.members.removed')
async onMemberRemoved({
userId,
workspaceId,
}: EventPayload<'workspace.members.requestDeclined'>) {
const user = await this.models.user.get(userId);
if (!user) return;
await this.sendMemberRemoved(user.email, { id: workspaceId });
}
@OnEvent('workspace.subscription.notify')
async onSubscriptionNotify({
workspaceId,
expirationDate,
deletionDate,
}: EventPayload<'workspace.subscription.notify'>) {
const owner = await this.permission.getWorkspaceOwner(workspaceId);
if (!owner) return;
const workspace = await this.getWorkspaceInfo(workspaceId);
await this.mailer.sendWorkspaceExpireRemindEmail(owner.email, {
...workspace,
expirationDate,
deletionDate,
});
}
}

View File

@@ -124,7 +124,7 @@ export class TeamWorkspaceResolver {
// after user click the invite link, we can check again and reject if charge failed
if (sendInviteMail) {
try {
await this.workspaceService.sendInviteMail(ret.inviteId);
await this.workspaceService.sendInviteEmail(ret.inviteId);
ret.sentSuccess = true;
} catch (e) {
this.logger.warn(
@@ -344,7 +344,7 @@ export class TeamWorkspaceResolver {
inviteId,
}: EventPayload<'workspace.members.reviewRequested'>) {
// send review request mail to owner and admin
await this.workspaceService.sendReviewRequestedMail(inviteId);
await this.workspaceService.sendReviewRequestedEmail(inviteId);
}
@OnEvent('workspace.members.requestDeclined')
@@ -388,7 +388,7 @@ export class TeamWorkspaceResolver {
workspaceId,
}: EventPayload<'workspace.members.ownerTransferred'>) {
// send role changed mail
await this.workspaceService.sendOwnerTransferred(email, {
await this.workspaceService.sendOwnerTransferredEmail(email, {
id: workspaceId,
});
}

View File

@@ -433,7 +433,7 @@ export class WorkspaceResolver {
);
if (sendInviteMail) {
try {
await this.workspaceService.sendInviteMail(inviteId);
await this.workspaceService.sendInviteEmail(inviteId);
} catch (e) {
const ret = await this.permissions.revokeWorkspace(
workspaceId,