feat(moderation): モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能を追加 (MisskeyIO#222)
Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
This commit is contained in:
		| @@ -24,6 +24,8 @@ import * as ep___admin_avatarDecorations_delete from './endpoints/admin/avatar-d | ||||
| import * as ep___admin_avatarDecorations_list from './endpoints/admin/avatar-decorations/list.js'; | ||||
| import * as ep___admin_avatarDecorations_update from './endpoints/admin/avatar-decorations/update.js'; | ||||
| import * as ep___admin_deleteAllFilesOfAUser from './endpoints/admin/delete-all-files-of-a-user.js'; | ||||
| import * as ep___admin_deleteUserAvatar from './endpoints/admin/delete-user-avatar.js'; | ||||
| import * as ep___admin_deleteUserBanner from './endpoints/admin/delete-user-banner.js'; | ||||
| import * as ep___admin_drive_cleanRemoteFiles from './endpoints/admin/drive/clean-remote-files.js'; | ||||
| import * as ep___admin_drive_cleanup from './endpoints/admin/drive/cleanup.js'; | ||||
| import * as ep___admin_drive_files from './endpoints/admin/drive/files.js'; | ||||
| @@ -383,6 +385,8 @@ const $admin_avatarDecorations_delete: Provider = { provide: 'ep:admin/avatar-de | ||||
| const $admin_avatarDecorations_list: Provider = { provide: 'ep:admin/avatar-decorations/list', useClass: ep___admin_avatarDecorations_list.default }; | ||||
| const $admin_avatarDecorations_update: Provider = { provide: 'ep:admin/avatar-decorations/update', useClass: ep___admin_avatarDecorations_update.default }; | ||||
| const $admin_deleteAllFilesOfAUser: Provider = { provide: 'ep:admin/delete-all-files-of-a-user', useClass: ep___admin_deleteAllFilesOfAUser.default }; | ||||
| const $admin_deleteUserAvatar: Provider = { provide: 'ep:admin/delete-user-avatar', useClass: ep___admin_deleteUserAvatar.default }; | ||||
| const $admin_deleteUserBanner: Provider = { provide: 'ep:admin/delete-user-banner', useClass: ep___admin_deleteUserBanner.default }; | ||||
| const $admin_drive_cleanRemoteFiles: Provider = { provide: 'ep:admin/drive/clean-remote-files', useClass: ep___admin_drive_cleanRemoteFiles.default }; | ||||
| const $admin_drive_cleanup: Provider = { provide: 'ep:admin/drive/cleanup', useClass: ep___admin_drive_cleanup.default }; | ||||
| const $admin_drive_files: Provider = { provide: 'ep:admin/drive/files', useClass: ep___admin_drive_files.default }; | ||||
| @@ -746,6 +750,8 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention | ||||
| 		$admin_avatarDecorations_list, | ||||
| 		$admin_avatarDecorations_update, | ||||
| 		$admin_deleteAllFilesOfAUser, | ||||
| 		$admin_deleteUserAvatar, | ||||
| 		$admin_deleteUserBanner, | ||||
| 		$admin_drive_cleanRemoteFiles, | ||||
| 		$admin_drive_cleanup, | ||||
| 		$admin_drive_files, | ||||
| @@ -1103,6 +1109,8 @@ const $retention: Provider = { provide: 'ep:retention', useClass: ep___retention | ||||
| 		$admin_avatarDecorations_list, | ||||
| 		$admin_avatarDecorations_update, | ||||
| 		$admin_deleteAllFilesOfAUser, | ||||
| 		$admin_deleteUserAvatar, | ||||
| 		$admin_deleteUserBanner, | ||||
| 		$admin_drive_cleanRemoteFiles, | ||||
| 		$admin_drive_cleanup, | ||||
| 		$admin_drive_files, | ||||
|   | ||||
| @@ -24,6 +24,8 @@ import * as ep___admin_avatarDecorations_delete from './endpoints/admin/avatar-d | ||||
| import * as ep___admin_avatarDecorations_list from './endpoints/admin/avatar-decorations/list.js'; | ||||
| import * as ep___admin_avatarDecorations_update from './endpoints/admin/avatar-decorations/update.js'; | ||||
| import * as ep___admin_deleteAllFilesOfAUser from './endpoints/admin/delete-all-files-of-a-user.js'; | ||||
| import * as ep___admin_deleteUserAvatar from './endpoints/admin/delete-user-avatar.js'; | ||||
| import * as ep___admin_deleteUserBanner from './endpoints/admin/delete-user-banner.js'; | ||||
| import * as ep___admin_drive_cleanRemoteFiles from './endpoints/admin/drive/clean-remote-files.js'; | ||||
| import * as ep___admin_drive_cleanup from './endpoints/admin/drive/cleanup.js'; | ||||
| import * as ep___admin_drive_files from './endpoints/admin/drive/files.js'; | ||||
| @@ -381,6 +383,8 @@ const eps = [ | ||||
| 	['admin/avatar-decorations/list', ep___admin_avatarDecorations_list], | ||||
| 	['admin/avatar-decorations/update', ep___admin_avatarDecorations_update], | ||||
| 	['admin/delete-all-files-of-a-user', ep___admin_deleteAllFilesOfAUser], | ||||
| 	['admin/delete-user-avatar', ep___admin_deleteUserAvatar], | ||||
| 	['admin/delete-user-banner', ep___admin_deleteUserBanner], | ||||
| 	['admin/drive/clean-remote-files', ep___admin_drive_cleanRemoteFiles], | ||||
| 	['admin/drive/cleanup', ep___admin_drive_cleanup], | ||||
| 	['admin/drive/files', ep___admin_drive_files], | ||||
|   | ||||
| @@ -0,0 +1,48 @@ | ||||
| /* | ||||
|  * SPDX-FileCopyrightText: syuilo and other misskey contributors | ||||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
|  | ||||
| import { Inject, Injectable } from '@nestjs/common'; | ||||
| import type { UsersRepository } from '@/models/_.js'; | ||||
| import { Endpoint } from '@/server/api/endpoint-base.js'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['admin'], | ||||
|  | ||||
| 	requireCredential: true, | ||||
| 	requireModerator: true, | ||||
| } as const; | ||||
|  | ||||
| export const paramDef = { | ||||
| 	type: 'object', | ||||
| 	properties: { | ||||
| 		userId: { type: 'string', format: 'misskey:id' }, | ||||
| 	}, | ||||
| 	required: ['userId'], | ||||
| } as const; | ||||
|  | ||||
| // eslint-disable-next-line import/no-default-export | ||||
| @Injectable() | ||||
| export default class extends Endpoint<typeof meta, typeof paramDef> { | ||||
| 	constructor( | ||||
| 		@Inject(DI.usersRepository) | ||||
| 		private usersRepository: UsersRepository, | ||||
| 	) { | ||||
| 		super(meta, paramDef, async (ps, me) => { | ||||
| 			const user = await this.usersRepository.findOneBy({ id: ps.userId }); | ||||
|  | ||||
| 			if (user == null) { | ||||
| 				throw new Error('user not found'); | ||||
| 			} | ||||
|  | ||||
| 			await this.usersRepository.update(user.id, { | ||||
| 				avatar: null, | ||||
| 				avatarId: null, | ||||
| 				avatarUrl: null, | ||||
| 				avatarBlurhash: null, | ||||
| 			}); | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
| @@ -0,0 +1,48 @@ | ||||
| /* | ||||
|  * SPDX-FileCopyrightText: syuilo and other misskey contributors | ||||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
|  | ||||
| import { Inject, Injectable } from '@nestjs/common'; | ||||
| import type { UsersRepository } from '@/models/_.js'; | ||||
| import { Endpoint } from '@/server/api/endpoint-base.js'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['admin'], | ||||
|  | ||||
| 	requireCredential: true, | ||||
| 	requireModerator: true, | ||||
| } as const; | ||||
|  | ||||
| export const paramDef = { | ||||
| 	type: 'object', | ||||
| 	properties: { | ||||
| 		userId: { type: 'string', format: 'misskey:id' }, | ||||
| 	}, | ||||
| 	required: ['userId'], | ||||
| } as const; | ||||
|  | ||||
| // eslint-disable-next-line import/no-default-export | ||||
| @Injectable() | ||||
| export default class extends Endpoint<typeof meta, typeof paramDef> { | ||||
| 	constructor( | ||||
| 		@Inject(DI.usersRepository) | ||||
| 		private usersRepository: UsersRepository, | ||||
| 	) { | ||||
| 		super(meta, paramDef, async (ps, me) => { | ||||
| 			const user = await this.usersRepository.findOneBy({ id: ps.userId }); | ||||
|  | ||||
| 			if (user == null) { | ||||
| 				throw new Error('user not found'); | ||||
| 			} | ||||
|  | ||||
| 			await this.usersRepository.update(user.id, { | ||||
| 				banner: null, | ||||
| 				bannerId: null, | ||||
| 				bannerUrl: null, | ||||
| 				bannerBlurhash: null, | ||||
| 			}); | ||||
| 		}); | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Nafu Satsuki
					Nafu Satsuki