39 lines
1.3 KiB
JavaScript
39 lines
1.3 KiB
JavaScript
import * as fs from "node:fs";
|
|
import Ajv from "ajv";
|
|
import { ApiError } from "./error.js";
|
|
const ajv = new Ajv({
|
|
useDefaults: true
|
|
});
|
|
ajv.addFormat("misskey:id", /^[a-zA-Z0-9]+$/);
|
|
export default function(meta, paramDef, cb) {
|
|
const validate = ajv.compile(paramDef);
|
|
return (params, user, token, file, ip, headers)=>{
|
|
let cleanup = undefined;
|
|
if (meta.requireFile) {
|
|
cleanup = ()=>{
|
|
fs.unlink(file.path, ()=>{});
|
|
};
|
|
if (file == null) return Promise.reject(new ApiError({
|
|
message: "File required.",
|
|
code: "FILE_REQUIRED",
|
|
id: "4267801e-70d1-416a-b011-4ee502885d8b"
|
|
}));
|
|
}
|
|
const valid = validate(params);
|
|
if (!valid) {
|
|
if (file) cleanup();
|
|
const errors = validate.errors;
|
|
const err = new ApiError({
|
|
message: "Invalid param.",
|
|
code: "INVALID_PARAM",
|
|
id: "3d81ceae-475f-4600-b2a8-2bc116157532"
|
|
}, {
|
|
param: errors[0].schemaPath,
|
|
reason: errors[0].message
|
|
});
|
|
return Promise.reject(err);
|
|
}
|
|
return cb(params, user, token, file, cleanup, ip, headers);
|
|
};
|
|
}
|