misskey/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
Johann150 cbb7e95d82
enhance: Forward report (#8001)
* implement sending AP Flag object

Optionally allow a user to select to forward a report about a remote
user to the other instance. This is added in a backwards-compatible way.

* add locale string

* forward report only for moderators

* add switch to moderator UI to forward report

* fix report note url

* return forwarded status from API

apparently forgot to carry this over from my testing environment

* object in Flag activity has to be an array

For correct interoperability with Pleroma the "object" property of the Flag
activity has to be an array.

This array will in the future also hold the link to respective notes, so it
makes sense to correct this on our side.

* Update get-note-menu.ts

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2022-01-21 03:06:38 +09:00

141 lines
2.9 KiB
TypeScript

import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../define';
import { AbuseUserReports } from '@/models/index';
import { makePaginationQuery } from '../../common/make-pagination-query';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
params: {
limit: {
validator: $.optional.num.range(1, 100),
default: 10,
},
sinceId: {
validator: $.optional.type(ID),
},
untilId: {
validator: $.optional.type(ID),
},
state: {
validator: $.optional.nullable.str,
default: null,
},
reporterOrigin: {
validator: $.optional.str.or([
'combined',
'local',
'remote',
]),
default: 'combined',
},
targetUserOrigin: {
validator: $.optional.str.or([
'combined',
'local',
'remote',
]),
default: 'combined',
},
forwarded: {
validator: $.optional.bool,
default: false,
},
},
res: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'object',
optional: false, nullable: false,
properties: {
id: {
type: 'string',
nullable: false, optional: false,
format: 'id',
example: 'xxxxxxxxxx',
},
createdAt: {
type: 'string',
nullable: false, optional: false,
format: 'date-time',
},
comment: {
type: 'string',
nullable: false, optional: false,
},
resolved: {
type: 'boolean',
nullable: false, optional: false,
example: false,
},
reporterId: {
type: 'string',
nullable: false, optional: false,
format: 'id',
},
targetUserId: {
type: 'string',
nullable: false, optional: false,
format: 'id',
},
assigneeId: {
type: 'string',
nullable: true, optional: false,
format: 'id',
},
reporter: {
type: 'object',
nullable: false, optional: false,
ref: 'User',
},
targetUser: {
type: 'object',
nullable: false, optional: false,
ref: 'User',
},
assignee: {
type: 'object',
nullable: true, optional: true,
ref: 'User',
},
},
},
},
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps) => {
const query = makePaginationQuery(AbuseUserReports.createQueryBuilder('report'), ps.sinceId, ps.untilId);
switch (ps.state) {
case 'resolved': query.andWhere('report.resolved = TRUE'); break;
case 'unresolved': query.andWhere('report.resolved = FALSE'); break;
}
switch (ps.reporterOrigin) {
case 'local': query.andWhere('report.reporterHost IS NULL'); break;
case 'remote': query.andWhere('report.reporterHost IS NOT NULL'); break;
}
switch (ps.targetUserOrigin) {
case 'local': query.andWhere('report.targetUserHost IS NULL'); break;
case 'remote': query.andWhere('report.targetUserHost IS NOT NULL'); break;
}
const reports = await query.take(ps.limit!).getMany();
return await AbuseUserReports.packMany(reports);
});