summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-01-28 01:47:03 -0500
committerHazelnoot <acomputerdog@gmail.com>2025-02-16 19:20:37 -0500
commitea89348b62706c4f6fbeaf603fc73d1b9874e7d0 (patch)
tree3e0e3264b7612183adc568ce6104dc2cbe55ed1c /packages/backend/src/server/api
parentrefresh cache when marking a user as NSFW (diff)
downloadsharkey-ea89348b62706c4f6fbeaf603fc73d1b9874e7d0.tar.gz
sharkey-ea89348b62706c4f6fbeaf603fc73d1b9874e7d0.tar.bz2
sharkey-ea89348b62706c4f6fbeaf603fc73d1b9874e7d0.zip
add user-level "force content warning" moderation feature
Diffstat (limited to 'packages/backend/src/server/api')
-rw-r--r--packages/backend/src/server/api/endpoints/admin/cw-user.ts53
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-user.ts5
2 files changed, 58 insertions, 0 deletions
diff --git a/packages/backend/src/server/api/endpoints/admin/cw-user.ts b/packages/backend/src/server/api/endpoints/admin/cw-user.ts
new file mode 100644
index 0000000000..d48ca565a4
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/admin/cw-user.ts
@@ -0,0 +1,53 @@
+/*
+ * SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Inject, Injectable } from '@nestjs/common';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import type { UsersRepository } from '@/models/_.js';
+import { DI } from '@/di-symbols.js';
+import { CacheService } from '@/core/CacheService.js';
+import { GlobalEventService } from '@/core/GlobalEventService.js';
+
+export const meta = {
+ tags: ['admin'],
+
+ requireCredential: true,
+ requireModerator: true,
+ kind: 'write:admin:cw-user',
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ cw: { type: 'string', nullable: true },
+ },
+ required: ['userId', 'cw'],
+} as const;
+
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
+ constructor(
+ @Inject(DI.usersRepository)
+ private readonly usersRepository: UsersRepository,
+
+ private readonly globalEventService: GlobalEventService,
+ ) {
+ super(meta, paramDef, async ps => {
+ const result = await this.usersRepository.update(ps.userId, {
+ // Collapse empty strings to null
+ // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
+ mandatoryCW: ps.cw || null,
+ });
+
+ if (result.affected && result.affected < 1) {
+ throw new Error('No such user');
+ }
+
+ // Synchronize caches and other processes
+ this.globalEventService.publishInternalEvent('localUserUpdated', { id: ps.userId });
+ });
+ }
+}
diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts
index 669bffe2dc..0f0b0f8e7a 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts
@@ -144,6 +144,10 @@ export const meta = {
type: 'string',
optional: false, nullable: false,
},
+ mandatoryCW: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
signins: {
type: 'array',
optional: false, nullable: false,
@@ -260,6 +264,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
isHibernated: user.isHibernated,
lastActiveDate: user.lastActiveDate ? user.lastActiveDate.toISOString() : null,
moderationNote: profile.moderationNote ?? '',
+ mandatoryCW: user.mandatoryCW,
signins,
policies: await this.roleService.getUserPolicies(user.id),
roles: await this.roleEntityService.packMany(roles, me),