@mark01/express-utils
Version:
npm package that contains utilities for express.js
63 lines (62 loc) • 2.02 kB
JavaScript
import { AppError } from '../error';
export const resultAsyncController = (schemas, cb, successStatusCode = 200) => async (req, res, next) => {
const requestErrors = [];
const requestData = {
params: {},
body: {},
query: {},
};
if (schemas.params) {
const parsedParams = schemas.params.safeParse(req.params);
if (parsedParams.success) {
requestData.params = parsedParams.data;
}
else {
requestErrors.push({
type: 'Params',
errors: parsedParams.error.format(),
});
}
}
if (schemas.body) {
const parsedBody = schemas.body.safeParse(req.body);
if (parsedBody.success) {
requestData.body = parsedBody.data;
}
else {
requestErrors.push({ type: 'Body', errors: parsedBody.error.format() });
}
}
if (schemas.query) {
const parsedQuery = schemas.query.safeParse(req.query);
if (parsedQuery.success) {
requestData.query = parsedQuery.data;
}
else {
requestErrors.push({
type: 'Query',
errors: parsedQuery.error.format(),
});
}
}
if (requestErrors.length > 0) {
return next(new AppError('Bad request', 400, requestErrors));
}
try {
const result = await cb(requestData, req, res);
result.match((value) => {
if (schemas.response) {
const parsedResponse = schemas.response.safeParse(value);
if (!parsedResponse.success) {
return next(new AppError('Bad response', 500, parsedResponse.error));
}
}
res
.status(successStatusCode)
.json({ data: value, status: 'success' });
}, (error) => next(error));
}
catch (error) {
next(new AppError('Unknown error! Please try again later!', 500, error));
}
};