const _find = require('./find'); const httpStatus = require('http-status'); const { extractParamsFromRequest, handleErrorResponse, handleResultResponse } = require('../../helpers/controller.helper'); function buildContext(req, res) { return { user: req.user } } const defaultOptions = { MODULE_NAME: 'default', params: { find: { includeAll: true }, findOne: { includeAll: true, paginate: { limit: 1, page: 1 } }, count: {}, } } const generateControllers = (service, extraControllers = {}, options = {}) => { const _options = { ...defaultOptions, ...options }; const defaultControllers = { find: async (req, res, next) => { const params = extractParamsFromRequest(req, res, _options.params.find); try { const result = await service.fetchAll(params, buildContext(req, res)); return handleResultResponse(result.rows, result.count, params, res); } catch (error) { handleErrorResponse(_options.MODULE_NAME, 'find', error, res) } }, findOne: async (req, res, next) => { const params = extractParamsFromRequest(req, res, _options.params.findOne); try { const result = await service.fetchOne(params, buildContext(req, res)); return handleResultResponse(result, null, params, res, (result === null) ? httpStatus.NOT_FOUND : httpStatus.OK); } catch (error) { handleErrorResponse(_options.MODULE_NAME, 'findOne', error, res) } }, count: async(req, res, next) => { const params = extractParamsFromRequest(req, res, _options.params.count); try { const result = await service.count(params, buildContext(req, res)); return handleResultResponse(result, null, params, res); } catch (error) { handleErrorResponse(_options.MODULE_NAME, 'count', error, res) } }, create: async (req, res, next) => { try { const result = await service.create(req.body, buildContext(req, res)); return handleResultResponse(result, null, null, res, httpStatus.CREATED) } catch (error) { handleErrorResponse(_options.MODULE_NAME, 'create', error, res) } }, update: async (req, res, next) => { try { const result = await service.update(req.params, req.body, buildContext(req, res)); return handleResultResponse(result, null, req.params, res, httpStatus.OK) } catch (error) { handleErrorResponse(_options.MODULE_NAME, 'update', error, res) } }, delete: async (req, res, next) => { try { const result = await service.delete(req.params, buildContext(req, res)); return handleResultResponse(result, null, req.params, res, httpStatus.NO_CONTENT); } catch (error) { handleErrorResponse(_options.MODULE_NAME, 'delete', error, res) } }, } //const associationControllers = generateAssociationControllers(model, options); //console.log(associationControllers); return { ...defaultControllers, //...associationControllers ...extraControllers } } module.exports = generateControllers;