UNPKG

@mark01/express-utils

Version:

npm package that contains utilities for express.js

63 lines (62 loc) 2.02 kB
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)); } };