refactor: use ajv instead of cafy (#8324)

* wip

* wip

* Update abuse-user-reports.ts

* Update files.ts

* Update list-remote.ts

* Update list.ts

* Update show-users.ts

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update update.ts

* Update search.ts

* Update reactions.ts

* Update search.ts

* wip

* wip

* wip

* wip

* Update update.ts

* Update relation.ts

* Update available.ts

* wip

* wip

* wip

* Update packages/backend/src/server/api/define.ts

Co-authored-by: Johann150 <johann.galle@protonmail.com>

* Update define.ts

* Update define.ts

* typo

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update update.ts

* wip

* Update signup.ts

* Update call.ts

* minimum for limit

* type

* remove needless annotation

* wip

* Update signup.ts

* wip

* wip

* fix

* Update create.ts

Co-authored-by: Johann150 <johann.galle@protonmail.com>
This commit is contained in:
syuilo
2022-02-19 14:05:32 +09:00
committed by GitHub
parent 59785ea04c
commit 510de87607
320 changed files with 4395 additions and 5939 deletions

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../define';
import { DriveFiles } from '@/models/index';
import { makePaginationQuery } from '../../common/make-pagination-query';
@@ -11,30 +9,6 @@ export const meta = {
kind: 'read:drive',
params: {
limit: {
validator: $.optional.num.range(1, 100),
default: 10,
},
sinceId: {
validator: $.optional.type(ID),
},
untilId: {
validator: $.optional.type(ID),
},
folderId: {
validator: $.optional.nullable.type(ID),
default: null,
},
type: {
validator: $.optional.nullable.str.match(/^[a-zA-Z\/\-*]+$/),
},
},
res: {
type: 'array',
optional: false, nullable: false,
@@ -46,8 +20,20 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
sinceId: { type: 'string', format: 'misskey:id' },
untilId: { type: 'string', format: 'misskey:id' },
folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
type: { type: 'string', nullable: true, pattern: /^[a-zA-Z\/\-*]+$/.toString().slice(1, -1) },
},
required: [],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId)
.andWhere('file.userId = :userId', { userId: user.id });
@@ -65,7 +51,7 @@ export default define(meta, async (ps, user) => {
}
}
const files = await query.take(ps.limit!).getMany();
const files = await query.take(ps.limit).getMany();
return await DriveFiles.packMany(files, { detail: false, self: true });
});

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../../define';
import { ApiError } from '../../../error';
import { DriveFiles, Notes } from '@/models/index';
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:drive',
params: {
fileId: {
validator: $.type(ID),
},
},
res: {
type: 'array',
optional: false, nullable: false,
@@ -36,8 +28,16 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
fileId: { type: 'string', format: 'misskey:id' },
},
required: ['fileId'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
// Fetch file
const file = await DriveFiles.findOne({
id: ps.fileId,

View File

@@ -1,4 +1,3 @@
import $ from 'cafy';
import define from '../../../define';
import { DriveFiles } from '@/models/index';
@@ -9,20 +8,22 @@ export const meta = {
kind: 'read:drive',
params: {
md5: {
validator: $.str,
},
},
res: {
type: 'boolean',
optional: false, nullable: false,
},
} as const;
const paramDef = {
type: 'object',
properties: {
md5: { type: 'string' },
},
required: ['md5'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne({
md5: ps.md5,
userId: user.id,

View File

@@ -1,6 +1,4 @@
import ms from 'ms';
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import { addFile } from '@/services/drive/add-file';
import define from '../../../define';
import { apiLogger } from '../../../logger';
@@ -22,33 +20,6 @@ export const meta = {
kind: 'write:drive',
params: {
folderId: {
validator: $.optional.nullable.type(ID),
default: null,
},
name: {
validator: $.optional.nullable.str,
default: null,
},
comment: {
validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
default: null,
},
isSensitive: {
validator: $.optional.bool,
default: false,
},
force: {
validator: $.optional.bool,
default: false,
},
},
res: {
type: 'object',
optional: false, nullable: false,
@@ -64,8 +35,20 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
name: { type: 'string', nullable: true, default: null },
comment: { type: 'string', nullable: true, maxLength: DB_MAX_IMAGE_COMMENT_LENGTH, default: null },
isSensitive: { type: 'boolean', default: false },
force: { type: 'boolean', default: false },
},
required: [],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user, _, file, cleanup) => {
export default define(meta, paramDef, async (ps, user, _, file, cleanup) => {
// Get 'name' parameter
let name = ps.name || file.originalname;
if (name !== undefined && name !== null) {

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import { deleteFile } from '@/services/drive/delete-file';
import { publishDriveStream } from '@/services/stream';
import define from '../../../define';
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:drive',
params: {
fileId: {
validator: $.type(ID),
},
},
errors: {
noSuchFile: {
message: 'No such file.',
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
fileId: { type: 'string', format: 'misskey:id' },
},
required: ['fileId'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) {

View File

@@ -1,4 +1,3 @@
import $ from 'cafy';
import define from '../../../define';
import { DriveFiles } from '@/models/index';
@@ -9,12 +8,6 @@ export const meta = {
kind: 'read:drive',
params: {
md5: {
validator: $.str,
},
},
res: {
type: 'array',
optional: false, nullable: false,
@@ -26,8 +19,16 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
md5: { type: 'string' },
},
required: ['md5'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const files = await DriveFiles.find({
md5: ps.md5,
userId: user.id,

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../../define';
import { DriveFiles } from '@/models/index';
@@ -10,17 +8,6 @@ export const meta = {
kind: 'read:drive',
params: {
name: {
validator: $.str,
},
folderId: {
validator: $.optional.nullable.type(ID),
default: null,
},
},
res: {
type: 'array',
optional: false, nullable: false,
@@ -32,8 +19,17 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
name: { type: 'string' },
folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
},
required: ['name'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const files = await DriveFiles.find({
name: ps.name,
userId: user.id,

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../../define';
import { ApiError } from '../../../error';
import { DriveFile } from '@/models/entities/drive-file';
@@ -12,16 +10,6 @@ export const meta = {
kind: 'read:drive',
params: {
fileId: {
validator: $.optional.type(ID),
},
url: {
validator: $.optional.str,
},
},
res: {
type: 'object',
optional: false, nullable: false,
@@ -49,8 +37,17 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
fileId: { type: 'string', format: 'misskey:id' },
url: { type: 'string' },
},
required: [],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
let file: DriveFile | undefined;
if (ps.fileId) {

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import { publishDriveStream } from '@/services/stream';
import define from '../../../define';
import { ApiError } from '../../../error';
@@ -13,33 +11,13 @@ export const meta = {
kind: 'write:drive',
params: {
fileId: {
validator: $.type(ID),
},
folderId: {
validator: $.optional.nullable.type(ID),
default: undefined as any,
},
name: {
validator: $.optional.str.pipe(DriveFiles.validateFileName),
default: undefined as any,
},
isSensitive: {
validator: $.optional.bool,
default: undefined as any,
},
comment: {
validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
default: undefined as any,
},
},
errors: {
invalidFileName: {
message: 'Invalid file name.',
code: 'INVALID_FILE_NAME',
id: '395e7156-f9f0-475e-af89-53c3c23080c2',
},
noSuchFile: {
message: 'No such file.',
code: 'NO_SUCH_FILE',
@@ -66,8 +44,20 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
fileId: { type: 'string', format: 'misskey:id' },
folderId: { type: 'string', format: 'misskey:id', nullable: true },
name: { type: 'string' },
isSensitive: { type: 'boolean' },
comment: { type: 'string', nullable: true, maxLength: 512 },
},
required: ['fileId'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) {
@@ -79,6 +69,9 @@ export default define(meta, async (ps, user) => {
}
if (ps.name) file.name = ps.name;
if (!DriveFiles.validateFileName(file.name)) {
throw new ApiError(meta.errors.invalidFileName);
}
if (ps.comment !== undefined) file.comment = ps.comment;

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import ms from 'ms';
import { uploadFromUrl } from '@/services/drive/upload-from-url';
import define from '../../../define';
@@ -18,42 +16,23 @@ export const meta = {
requireCredential: true,
kind: 'write:drive',
} as const;
params: {
url: {
// TODO: Validate this url
validator: $.str,
},
folderId: {
validator: $.optional.nullable.type(ID),
default: null,
},
isSensitive: {
validator: $.optional.bool,
default: false,
},
comment: {
validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
default: null,
},
marker: {
validator: $.optional.nullable.str,
default: null,
},
force: {
validator: $.optional.bool,
default: false,
},
const paramDef = {
type: 'object',
properties: {
url: { type: 'string' },
folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
isSensitive: { type: 'boolean', default: false },
comment: { type: 'string', nullable: true, maxLength: 512, default: null },
marker: { type: 'string', nullable: true, default: null },
force: { type: 'boolean', default: false },
},
required: ['url'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
uploadFromUrl({ url: ps.url, user, folderId: ps.folderId, sensitive: ps.isSensitive, force: ps.force, comment: ps.comment }).then(file => {
DriveFiles.pack(file, { self: true }).then(packedFile => {
publishMainStream(user.id, 'urlUploadFinished', {

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../define';
import { DriveFolders } from '@/models/index';
import { makePaginationQuery } from '../../common/make-pagination-query';
@@ -11,26 +9,6 @@ export const meta = {
kind: 'read:drive',
params: {
limit: {
validator: $.optional.num.range(1, 100),
default: 10,
},
sinceId: {
validator: $.optional.type(ID),
},
untilId: {
validator: $.optional.type(ID),
},
folderId: {
validator: $.optional.nullable.type(ID),
default: null,
},
},
res: {
type: 'array',
optional: false, nullable: false,
@@ -42,8 +20,19 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
sinceId: { type: 'string', format: 'misskey:id' },
untilId: { type: 'string', format: 'misskey:id' },
folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
},
required: [],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFolders.createQueryBuilder('folder'), ps.sinceId, ps.untilId)
.andWhere('folder.userId = :userId', { userId: user.id });
@@ -53,7 +42,7 @@ export default define(meta, async (ps, user) => {
query.andWhere('folder.parentId IS NULL');
}
const folders = await query.take(ps.limit!).getMany();
const folders = await query.take(ps.limit).getMany();
return await Promise.all(folders.map(folder => DriveFolders.pack(folder)));
});

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import { publishDriveStream } from '@/services/stream';
import define from '../../../define';
import { ApiError } from '../../../error';
@@ -13,17 +11,6 @@ export const meta = {
kind: 'write:drive',
params: {
name: {
validator: $.optional.str.pipe(DriveFolders.validateFolderName),
default: 'Untitled',
},
parentId: {
validator: $.optional.nullable.type(ID),
},
},
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -39,8 +26,17 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
name: { type: 'string', default: "Untitled", maxLength: 200 },
parentId: { type: 'string', format: 'misskey:id', nullable: true },
},
required: [],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
// If the parent folder is specified
let parent = null;
if (ps.parentId) {

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../../define';
import { publishDriveStream } from '@/services/stream';
import { ApiError } from '../../../error';
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:drive',
params: {
folderId: {
validator: $.type(ID),
},
},
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -33,8 +25,16 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
folderId: { type: 'string', format: 'misskey:id' },
},
required: ['folderId'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
// Get folder
const folder = await DriveFolders.findOne({
id: ps.folderId,

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../../define';
import { DriveFolders } from '@/models/index';
@@ -10,17 +8,6 @@ export const meta = {
kind: 'read:drive',
params: {
name: {
validator: $.str,
},
parentId: {
validator: $.optional.nullable.type(ID),
default: null,
},
},
res: {
type: 'array',
optional: false, nullable: false,
@@ -32,8 +19,17 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
name: { type: 'string' },
parentId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
},
required: ['name'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const folders = await DriveFolders.find({
name: ps.name,
userId: user.id,

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../../define';
import { ApiError } from '../../../error';
import { DriveFolders } from '@/models/index';
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:drive',
params: {
folderId: {
validator: $.type(ID),
},
},
res: {
type: 'object',
optional: false, nullable: false,
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
folderId: { type: 'string', format: 'misskey:id' },
},
required: ['folderId'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
// Get folder
const folder = await DriveFolders.findOne({
id: ps.folderId,

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import { publishDriveStream } from '@/services/stream';
import define from '../../../define';
import { ApiError } from '../../../error';
@@ -12,20 +10,6 @@ export const meta = {
kind: 'write:drive',
params: {
folderId: {
validator: $.type(ID),
},
name: {
validator: $.optional.str.pipe(DriveFolders.validateFolderName),
},
parentId: {
validator: $.optional.nullable.type(ID),
},
},
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -53,8 +37,18 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
folderId: { type: 'string', format: 'misskey:id' },
name: { type: 'string', maxLength: 200 },
parentId: { type: 'string', format: 'misskey:id', nullable: true },
},
required: ['folderId'],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
// Fetch folder
const folder = await DriveFolders.findOne({
id: ps.folderId,

View File

@@ -1,5 +1,3 @@
import $ from 'cafy';
import { ID } from '@/misc/cafy-id';
import define from '../../define';
import { DriveFiles } from '@/models/index';
import { makePaginationQuery } from '../../common/make-pagination-query';
@@ -11,25 +9,6 @@ export const meta = {
kind: 'read:drive',
params: {
limit: {
validator: $.optional.num.range(1, 100),
default: 10,
},
sinceId: {
validator: $.optional.type(ID),
},
untilId: {
validator: $.optional.type(ID),
},
type: {
validator: $.optional.str.match(/^[a-zA-Z\/\-*]+$/),
},
},
res: {
type: 'array',
optional: false, nullable: false,
@@ -41,8 +20,19 @@ export const meta = {
},
} as const;
const paramDef = {
type: 'object',
properties: {
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
sinceId: { type: 'string', format: 'misskey:id' },
untilId: { type: 'string', format: 'misskey:id' },
type: { type: 'string', pattern: /^[a-zA-Z\/\-*]+$/.toString().slice(1, -1) },
},
required: [],
} as const;
// eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => {
export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId)
.andWhere('file.userId = :userId', { userId: user.id });
@@ -54,7 +44,7 @@ export default define(meta, async (ps, user) => {
}
}
const files = await query.take(ps.limit!).getMany();
const files = await query.take(ps.limit).getMany();
return await DriveFiles.packMany(files, { detail: false, self: true });
});