spec(backend): 管理者が登録待ちのユーザーの一覧をみる・取り消すAPIを追加 (MisskeyIO#609)

This commit is contained in:
まっちゃとーにゅ 2024-04-14 00:51:49 +09:00 committed by GitHub
parent 6b7df2bd10
commit 8f331e142b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 352 additions and 0 deletions

View file

@ -11,6 +11,8 @@ import * as ep___admin_abuseUserReports from './endpoints/admin/abuse-user-repor
import * as ep___admin_accounts_create from './endpoints/admin/accounts/create.js';
import * as ep___admin_accounts_delete from './endpoints/admin/accounts/delete.js';
import * as ep___admin_accounts_findByEmail from './endpoints/admin/accounts/find-by-email.js';
import * as ep___admin_accounts_pending_list from './endpoints/admin/accounts/pending/list.js';
import * as ep___admin_accounts_pending_revoke from './endpoints/admin/accounts/pending/revoke.js';
import * as ep___admin_ad_create from './endpoints/admin/ad/create.js';
import * as ep___admin_ad_delete from './endpoints/admin/ad/delete.js';
import * as ep___admin_ad_list from './endpoints/admin/ad/list.js';
@ -398,6 +400,8 @@ const $admin_abuseUserReports: Provider = { provide: 'ep:admin/abuse-user-report
const $admin_accounts_create: Provider = { provide: 'ep:admin/accounts/create', useClass: ep___admin_accounts_create.default };
const $admin_accounts_delete: Provider = { provide: 'ep:admin/accounts/delete', useClass: ep___admin_accounts_delete.default };
const $admin_accounts_findByEmail: Provider = { provide: 'ep:admin/accounts/find-by-email', useClass: ep___admin_accounts_findByEmail.default };
const $admin_accounts_pending_list: Provider = { provide: 'ep:admin/accounts/pending/list', useClass: ep___admin_accounts_pending_list.default };
const $admin_accounts_pending_revoke: Provider = { provide: 'ep:admin/accounts/pending/revoke', useClass: ep___admin_accounts_pending_revoke.default };
const $admin_ad_create: Provider = { provide: 'ep:admin/ad/create', useClass: ep___admin_ad_create.default };
const $admin_ad_delete: Provider = { provide: 'ep:admin/ad/delete', useClass: ep___admin_ad_delete.default };
const $admin_ad_list: Provider = { provide: 'ep:admin/ad/list', useClass: ep___admin_ad_list.default };
@ -789,6 +793,8 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__
$admin_accounts_create,
$admin_accounts_delete,
$admin_accounts_findByEmail,
$admin_accounts_pending_list,
$admin_accounts_pending_revoke,
$admin_ad_create,
$admin_ad_delete,
$admin_ad_list,
@ -1174,6 +1180,8 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__
$admin_accounts_create,
$admin_accounts_delete,
$admin_accounts_findByEmail,
$admin_accounts_pending_list,
$admin_accounts_pending_revoke,
$admin_ad_create,
$admin_ad_delete,
$admin_ad_list,

View file

@ -11,6 +11,8 @@ import * as ep___admin_abuseUserReports from './endpoints/admin/abuse-user-repor
import * as ep___admin_accounts_create from './endpoints/admin/accounts/create.js';
import * as ep___admin_accounts_delete from './endpoints/admin/accounts/delete.js';
import * as ep___admin_accounts_findByEmail from './endpoints/admin/accounts/find-by-email.js';
import * as ep___admin_accounts_pending_list from './endpoints/admin/accounts/pending/list.js';
import * as ep___admin_accounts_pending_revoke from './endpoints/admin/accounts/pending/revoke.js';
import * as ep___admin_ad_create from './endpoints/admin/ad/create.js';
import * as ep___admin_ad_delete from './endpoints/admin/ad/delete.js';
import * as ep___admin_ad_list from './endpoints/admin/ad/list.js';
@ -396,6 +398,8 @@ const eps = [
['admin/accounts/create', ep___admin_accounts_create],
['admin/accounts/delete', ep___admin_accounts_delete],
['admin/accounts/find-by-email', ep___admin_accounts_findByEmail],
['admin/accounts/pending/list', ep___admin_accounts_pending_list],
['admin/accounts/pending/revoke', ep___admin_accounts_pending_revoke],
['admin/ad/create', ep___admin_ad_create],
['admin/ad/delete', ep___admin_ad_delete],
['admin/ad/list', ep___admin_ad_list],

View file

@ -0,0 +1,102 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
import type { UserPendingsRepository } from '@/models/_.js';
import { DI } from '@/di-symbols.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireAdmin: true,
kind: 'read:admin:account',
res: {
type: 'array',
nullable: false, optional: false,
items: {
type: 'object',
nullable: false, optional: false,
properties: {
id: {
type: 'string',
nullable: false, optional: false,
format: 'id',
example: 'xxxxxxxxxx',
},
createdAt: {
type: 'string',
nullable: false, optional: false,
format: 'date-time',
},
code: {
type: 'string',
nullable: false, optional: false,
},
username: {
type: 'string',
nullable: false, optional: false,
example: 'ai',
},
email: {
type: 'string',
nullable: true, optional: true,
},
},
},
},
} as const;
export const paramDef = {
type: 'object',
properties: {
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
offset: { type: 'integer', default: 0 },
sort: { type: 'string', enum: ['+createdAt', '-createdAt'] },
username: { type: 'string', nullable: true, default: null },
email: { type: 'string', nullable: true, default: null },
code: { type: 'string', nullable: true, default: null },
},
required: [],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
@Inject(DI.userPendingsRepository)
private userPendingsRepository: UserPendingsRepository,
) {
super(meta, paramDef, async (ps, me) => {
const query = this.userPendingsRepository.createQueryBuilder('pending');
if (ps.username != null) {
query.andWhere('pending.username = :username', { username: ps.username });
}
if (ps.email != null) {
query.andWhere('pending.email = :email', { email: ps.email });
}
if (ps.code != null) {
query.andWhere('pending.code = :code', { code: ps.code });
}
switch (ps.sort) {
case '+createdAt': query.orderBy('pending.id', 'DESC'); break;
case '-createdAt': query.orderBy('pending.id', 'ASC'); break;
default: query.orderBy('pending.id', 'DESC'); break;
}
query.limit(ps.limit);
query.offset(ps.offset);
const pendings = await query.getMany();
return pendings.map(pending => ({
id: pending.id,
createdAt: pending.createdAt.toISOString(),
code: pending.code,
username: pending.username,
email: pending.email,
}));
});
}
}

View file

@ -0,0 +1,49 @@
import { Inject, Injectable } from '@nestjs/common';
import { Endpoint } from '@/server/api/endpoint-base.js';
import { DI } from '@/di-symbols.js';
import type { UserPendingsRepository } from '@/models/_.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireAdmin: true,
kind: 'write:admin:account',
errors: {
pendingUserNotFound: {
message: 'Pending User not found.',
code: 'PENDING_USER_NOT_FOUND',
id: 'a04d6118-65e6-4508-9144-9900a331bbf3',
},
},
} as const;
export const paramDef = {
type: 'object',
properties: {
id: { type: 'string', format: 'misskey:id' },
code: { type: 'string' },
},
anyOf: [
{ required: ['id'] },
{ required: ['code'] },
],
} as const;
@Injectable()
export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
constructor(
@Inject(DI.userPendingsRepository)
private userPendingsRepository: UserPendingsRepository,
) {
super(meta, paramDef, async (ps, me) => {
const pendingUser = await this.userPendingsRepository.findOneBy({ id: ps.id, code: ps.code });
if (pendingUser == null) throw new ApiError(meta.errors.pendingUserNotFound);
await this.userPendingsRepository.delete(pendingUser.id);
});
}
}