import { Middleware, Body } from "@mtranter/router-core";
import mimeMatch from "mime-match";
const DEFAULT_MIME_TYPE = "application/json";
// eslint-disable-next-line @typescript-eslint/ban-types
export const JsonParserMiddlerware = () =>
Middleware.of(
async (req, handler) => {
const contentType = req.headers["content-type"];
if (!mimeMatch(DEFAULT_MIME_TYPE, contentType as string)) {
return {
statusCode: 415,
body: `Unsupported media type: ${contentType as string}`,
};
}
let result: object = {};
try {
result = req.body && req.body.length ? JSON.parse(req.body.toString()) : undefined;
} catch (e) {
console.log(e);
return Promise.resolve({
statusCode: 400,
body: "Invalid JSON",
});
}
const resp = await handler({ ...req, jsonBody: result });
return {
statusCode: resp.statusCode,
body: JSON.stringify(resp.body),
headers: {
...resp.headers,
"content-type": "application/json; charset=utf-8",
},
};
}
);