38 lines
1023 B
TypeScript
38 lines
1023 B
TypeScript
import { Next } from "koa";
|
|
import { bytesToHumanReadable } from "@shared/utils/files";
|
|
import { InvalidRequestError } from "@server/errors";
|
|
import { APIContext } from "@server/types";
|
|
import { getFileFromRequest } from "@server/utils/koa";
|
|
|
|
export default function multipart({
|
|
maximumFileSize,
|
|
}: {
|
|
maximumFileSize: number;
|
|
}) {
|
|
return async function multipartMiddleware(ctx: APIContext, next: Next) {
|
|
if (!ctx.is("multipart/form-data")) {
|
|
ctx.throw(
|
|
InvalidRequestError("Request type must be multipart/form-data")
|
|
);
|
|
}
|
|
|
|
const file = getFileFromRequest(ctx.request);
|
|
if (!file) {
|
|
ctx.throw(InvalidRequestError("Request must include a file parameter"));
|
|
}
|
|
|
|
if (file.size > maximumFileSize) {
|
|
ctx.throw(
|
|
InvalidRequestError(
|
|
`The selected file was larger than the ${bytesToHumanReadable(
|
|
maximumFileSize
|
|
)} maximum size`
|
|
)
|
|
);
|
|
}
|
|
|
|
ctx.input = { ...(ctx.input ?? {}), file };
|
|
return next();
|
|
};
|
|
}
|