app2-api/core/controllers/index.js
2019-07-17 14:07:35 +02:00

117 lines
4.0 KiB
JavaScript

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