app2-api/core/controllers/index.js

142 lines
5.3 KiB
JavaScript
Raw Normal View History

2019-05-09 16:23:54 +00:00
const _find = require('./find');
const httpStatus = require('http-status');
const { extractParamsFromRequest, handleErrorResponse, handleResultResponse } = require('../../helpers/controller.helper');
2019-08-07 18:32:13 +00:00
function buildContext(req, config ) {
2019-05-09 16:23:54 +00:00
return {
2019-07-17 12:07:35 +00:00
user: req.user,
2019-07-21 09:27:08 +00:00
scopes: [],
2019-07-17 12:07:35 +00:00
...config,
2019-05-09 16:23:54 +00:00
}
}
const defaultOptions = {
2019-05-23 09:40:50 +00:00
MODULE_NAME: 'default',
params: {
2019-07-17 12:07:35 +00:00
find: { includeAll: false },
2019-07-18 18:13:07 +00:00
findOne: { includeAll: false, paginate: { limit: 1, page: 1 } },
2019-05-23 09:40:50 +00:00
count: {},
2019-08-05 17:44:16 +00:00
create: {},
update: {},
delete: {},
2019-05-23 09:40:50 +00:00
}
2019-05-09 16:23:54 +00:00
}
2019-05-23 09:40:50 +00:00
const generateControllers = (service, extraControllers = {}, options = {}) => {
const _options = {
...defaultOptions,
...options
};
2019-05-09 16:23:54 +00:00
const defaultControllers = {
2019-07-19 10:17:52 +00:00
2019-07-17 12:07:35 +00:00
find: (config) => {
2019-07-19 10:17:52 +00:00
2019-07-17 12:07:35 +00:00
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) {
2019-08-05 17:44:16 +00:00
return handleErrorResponse(_options.MODULE_NAME, 'find', error, res)
2019-07-17 12:07:35 +00:00
}
2019-05-09 16:23:54 +00:00
}
},
2019-07-17 12:07:35 +00:00
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) {
2019-07-21 09:27:08 +00:00
console.log(error);
2019-08-05 17:44:16 +00:00
return handleErrorResponse(_options.MODULE_NAME, 'findOne', error, res)
2019-07-17 12:07:35 +00:00
}
2019-05-09 16:23:54 +00:00
}
},
2019-07-17 12:07:35 +00:00
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) {
2019-08-05 17:44:16 +00:00
return handleErrorResponse(_options.MODULE_NAME, 'count', error, res)
2019-07-17 12:07:35 +00:00
}
2019-05-09 16:23:54 +00:00
}
},
2019-07-17 12:07:35 +00:00
create: (config) => {
return async (req, res, next) => {
try {
2019-08-18 21:15:34 +00:00
console.log('SERVICE CREATE ->', req.body);
2019-07-17 12:07:35 +00:00
const result = await service.create(req.body, buildContext(req, config));
return handleResultResponse(result, null, null, res, httpStatus.CREATED)
} catch (error) {
2019-08-05 17:44:16 +00:00
return handleErrorResponse(_options.MODULE_NAME, 'create', error, res)
2019-07-17 12:07:35 +00:00
}
2019-08-14 17:49:38 +00:00
};
2019-05-09 16:23:54 +00:00
},
2019-07-17 12:07:35 +00:00
update: (config) => {
return async (req, res, next) => {
2019-08-05 17:44:16 +00:00
try {
const params = extractParamsFromRequest(req, res, _options.params.update);
2019-08-18 21:15:34 +00:00
console.log('SERVICE UPDATE ->', params, req.body);
2019-08-16 17:49:25 +00:00
2019-08-05 17:44:16 +00:00
const response = await service.update(params, req.body, buildContext(req, config));
// https://sequelize.org/master/class/lib/model.js~Model.html#static-method-update
// Update devuelve un array de un elemento con el número de filas afectadas
// por la operación. Por comodidad, devuelvo el valor, no el array.
let result = response[0];
let status = httpStatus.OK;
if (result < 1) {
status = httpStatus.NOT_FOUND;
}
// Express no puede devolver números porque los confunde con el 'status'.
// Convertimos a cadena.
result = result.toString();
return handleResultResponse(result, null, req.params, res, status)
2019-07-17 12:07:35 +00:00
} catch (error) {
2019-08-05 17:44:16 +00:00
return handleErrorResponse(_options.MODULE_NAME, 'update', error, res)
2019-07-17 12:07:35 +00:00
}
2019-05-09 16:23:54 +00:00
}
},
2019-07-17 12:07:35 +00:00
delete: (config) => {
return async (req, res, next) => {
try {
2019-08-16 21:27:18 +00:00
const params = extractParamsFromRequest(req, res, _options.params.delete);
2019-08-18 21:15:34 +00:00
console.log('SERVICE DELETE ->', params);
2019-08-16 21:27:18 +00:00
const result = await service.delete(params, buildContext(req, config));
2019-07-17 12:07:35 +00:00
return handleResultResponse(result, null, req.params, res, httpStatus.NO_CONTENT);
} catch (error) {
2019-08-05 17:44:16 +00:00
return handleErrorResponse(_options.MODULE_NAME, 'delete', error, res)
2019-07-17 12:07:35 +00:00
}
2019-05-09 16:23:54 +00:00
}
},
}
//const associationControllers = generateAssociationControllers(model, options);
//console.log(associationControllers);
return {
...defaultControllers,
//...associationControllers
...extraControllers
}
}
2019-08-09 11:00:42 +00:00
module.exports = generateControllers;
module.exports.buildContext = buildContext;