mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-13 21:05:19 +00:00
@@ -460,6 +460,10 @@ export class PermissionService {
|
||||
workspaceId,
|
||||
count,
|
||||
});
|
||||
this.event.emit('workspace.members.removed', {
|
||||
workspaceId,
|
||||
userId: user,
|
||||
});
|
||||
|
||||
if (
|
||||
permission.status === 'UnderReview' ||
|
||||
|
||||
@@ -38,6 +38,7 @@ import {
|
||||
WorkspaceBlobResolver,
|
||||
WorkspaceService,
|
||||
],
|
||||
exports: [WorkspaceService],
|
||||
})
|
||||
export class WorkspaceModule {}
|
||||
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user