summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/RoleService.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/core/RoleService.ts')
-rw-r--r--packages/backend/src/core/RoleService.ts46
1 files changed, 44 insertions, 2 deletions
diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts
index 518f283695..39f21ecec4 100644
--- a/packages/backend/src/core/RoleService.ts
+++ b/packages/backend/src/core/RoleService.ts
@@ -18,6 +18,7 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { StreamMessages } from '@/server/api/stream/types.js';
import { IdService } from '@/core/IdService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
+import { ModerationLogService } from '@/core/ModerationLogService.js';
import type { Packed } from '@/misc/json-schema.js';
import type { OnApplicationShutdown } from '@nestjs/common';
@@ -98,6 +99,7 @@ export class RoleService implements OnApplicationShutdown {
private userEntityService: UserEntityService,
private globalEventService: GlobalEventService,
private idService: IdService,
+ private moderationLogService: ModerationLogService,
) {
//this.onMessage = this.onMessage.bind(this);
@@ -374,9 +376,11 @@ export class RoleService implements OnApplicationShutdown {
}
@bindThis
- public async assign(userId: MiUser['id'], roleId: MiRole['id'], expiresAt: Date | null = null): Promise<void> {
+ public async assign(userId: MiUser['id'], roleId: MiRole['id'], expiresAt: Date | null = null, moderator?: MiUser): Promise<void> {
const now = new Date();
+ const role = await this.rolesRepository.findOneByOrFail({ id: roleId });
+
const existing = await this.roleAssignmentsRepository.findOneBy({
roleId: roleId,
userId: userId,
@@ -406,10 +410,19 @@ export class RoleService implements OnApplicationShutdown {
});
this.globalEventService.publishInternalEvent('userRoleAssigned', created);
+
+ if (moderator) {
+ this.moderationLogService.log(moderator, 'assignRole', {
+ roleId: roleId,
+ roleName: role.name,
+ userId: userId,
+ expiresAt: expiresAt ? expiresAt.toISOString() : null,
+ });
+ }
}
@bindThis
- public async unassign(userId: MiUser['id'], roleId: MiRole['id']): Promise<void> {
+ public async unassign(userId: MiUser['id'], roleId: MiRole['id'], moderator?: MiUser): Promise<void> {
const now = new Date();
const existing = await this.roleAssignmentsRepository.findOneBy({ roleId, userId });
@@ -430,6 +443,15 @@ export class RoleService implements OnApplicationShutdown {
});
this.globalEventService.publishInternalEvent('userRoleUnassigned', existing);
+
+ if (moderator) {
+ const role = await this.rolesRepository.findOneByOrFail({ id: roleId });
+ this.moderationLogService.log(moderator, 'unassignRole', {
+ roleId: roleId,
+ roleName: role.name,
+ userId: userId,
+ });
+ }
}
@bindThis
@@ -452,6 +474,26 @@ export class RoleService implements OnApplicationShutdown {
}
@bindThis
+ public async update(role: MiRole, params: Partial<MiRole>, moderator?: MiUser): Promise<void> {
+ const date = new Date();
+ await this.rolesRepository.update(role.id, {
+ updatedAt: date,
+ ...params,
+ });
+
+ const updated = await this.rolesRepository.findOneByOrFail({ id: role.id });
+ this.globalEventService.publishInternalEvent('roleUpdated', updated);
+
+ if (moderator) {
+ this.moderationLogService.log(moderator, 'updateRole', {
+ roleId: role.id,
+ before: role,
+ after: updated,
+ });
+ }
+ }
+
+ @bindThis
public dispose(): void {
this.redisForSub.off('message', this.onMessage);
this.roleAssignmentByUserIdCache.dispose();