This commit is contained in:
David Arranz 2019-08-05 19:44:16 +02:00
parent 20372c839b
commit 6ff351a07c
6 changed files with 59 additions and 37 deletions

View File

@ -16,6 +16,9 @@ const defaultOptions = {
find: { includeAll: false },
findOne: { includeAll: false, paginate: { limit: 1, page: 1 } },
count: {},
create: {},
update: {},
delete: {},
}
}
@ -39,7 +42,7 @@ const generateControllers = (service, extraControllers = {}, options = {}) => {
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)
return handleErrorResponse(_options.MODULE_NAME, 'find', error, res)
}
}
},
@ -52,7 +55,7 @@ const generateControllers = (service, extraControllers = {}, options = {}) => {
return handleResultResponse(result, null, params, res, (result === null) ? httpStatus.NOT_FOUND : httpStatus.OK);
} catch (error) {
console.log(error);
handleErrorResponse(_options.MODULE_NAME, 'findOne', error, res)
return handleErrorResponse(_options.MODULE_NAME, 'findOne', error, res)
}
}
},
@ -64,7 +67,7 @@ const generateControllers = (service, extraControllers = {}, options = {}) => {
const result = await service.count(params, buildContext(req, config));
return handleResultResponse(result, null, params, res);
} catch (error) {
handleErrorResponse(_options.MODULE_NAME, 'count', error, res)
return handleErrorResponse(_options.MODULE_NAME, 'count', error, res)
}
}
},
@ -75,18 +78,33 @@ const generateControllers = (service, extraControllers = {}, options = {}) => {
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)
return 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)
try {
const params = extractParamsFromRequest(req, res, _options.params.update);
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)
} catch (error) {
handleErrorResponse(_options.MODULE_NAME, 'update', error, res)
return handleErrorResponse(_options.MODULE_NAME, 'update', error, res)
}
}
},
@ -97,7 +115,7 @@ const generateControllers = (service, extraControllers = {}, options = {}) => {
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)
return handleErrorResponse(_options.MODULE_NAME, 'delete', error, res)
}
}
},

View File

@ -70,18 +70,17 @@ function foundModelAssociation(model, associationName) {
const parseParamsToFindOptions = (params) => {
const result = {};
// Include All
result.include = (params.includeAll) ? [{ all: true }] : [];
// Query
if (params.query) {
result.query = params.query
}
// Params
// Query & params
result.where = {};
if (params.query) {
result.where = params.query;
}
if (params.params) {
result.where = params.params
result.where = Object.assign(result.where, params.params);
}
// Paginate
@ -166,7 +165,8 @@ const generateService = (model, extraMethods = {}, options = defaultOptions) =>
// Necesario para el cálculo del count
// https://github.com/sequelize/sequelize/issues/10557
findOptions.distinct = true;
console.log('findOptions');
console.log(findOptions);
const result = await model.scope(context.scopes).findAndCountAll(findOptions);
if (extraMethods.afterFetchAll) {
@ -196,8 +196,7 @@ const generateService = (model, extraMethods = {}, options = defaultOptions) =>
return extraMethods.afterCount(result, params, context);
} else {
return result;
}
}
},
create: async (values, context) => {
@ -206,6 +205,7 @@ const generateService = (model, extraMethods = {}, options = defaultOptions) =>
update: async (params, values, context) => {
const findOptions = parseParamsToFindOptions(params);
console.log(findOptions);
return await model.scope(context.scopes).update(values, findOptions)
},

View File

@ -108,6 +108,10 @@ const middleware = (limit = 10, maxLimit = 50) => {
res.locals.paginate.hasPreviousPages = req.query.page > 1;
res.locals.paginate.hasNextPages = hasNextPages(req);
res.locals.paginate.getArrayPages = getArrayPages(req);
// Todo lo relativo a paginación va ahora a res.locals.paginate
delete req.query.page;
delete req.query.limit;
next();
};

View File

@ -14,6 +14,7 @@ const multimediaController = require('./multimedia.controller');
routes.get('/multimedias', //cacheSuccesses('24 hours'),
isLoggedUser,
PaginateMiddleware.middleware(),
//SortMiddleware.middleware({ default: "init_available_date" }),
multimediaController.find({
@ -22,6 +23,7 @@ routes.get('/multimedias', //cacheSuccesses('24 hours'),
);
routes.get('/multimedias/:id', //cacheSuccesses('24 hours'),
isLoggedUser,
//PaginateMiddleware.middleware(),
//SortMiddleware.middleware({ default: "init_available_date" }),
multimediaController.findOne({
@ -30,16 +32,6 @@ routes.get('/multimedias/:id', //cacheSuccesses('24 hours'),
);
routes.get('/multimedias/:entityId',
//PaginateMiddleware.middleware(),
//SortMiddleware.middleware({ default: "init_available_date" }),
multimediaController.find({})
);
//routes.get('/venues', true, SortMiddleware.middleware({ default: "name" }), venueController.find);
//routes.get('/venues', isLoggedUser, SortMiddleware.middleware({ default: "name" }), venueController.find);
//routes.get('/venues/:id', isLoggedUser, venueController.findOne);

View File

@ -84,7 +84,7 @@ module.exports = function (sequelize, DataTypes) {
// OJO GENERA UN FOREIGN KEY Con eventos y habrá ID de otras entidades que no exitan en la tabla eventos, porque son post o speakers
Speaker.Multimedias = Speaker.hasMany(models.Multimedia, {
foreignKey: 'entityId',
as: { singular: 'multimedia', plural: 'multimedias' }
as: { singular: 'multimedia', plural: 'multimedias' },
});
Speaker.Comments = Speaker.hasMany(models.Comment, {

View File

@ -97,6 +97,7 @@ routes.get('/speakers/:id/:association',
// Todos los ponentes
routes.get('/admin/speakers',
isAdministratorUser,
SortMiddleware.middleware({ default: "name" }),
speakerController.find({
scopes: ['defaultScope', 'includeValues', 'includeMultimedias'],
})
@ -120,7 +121,7 @@ routes.get('/admin/speakers/:id/comments',
speakerController.find()
);
/*routes.get('/speakers/:id/values',
routes.get('/admin/speakers/:id/values',
isAdministratorUser,
(req, res, next) => {
req.params.association = 'values';
@ -129,31 +130,38 @@ routes.get('/admin/speakers/:id/comments',
speakerController.find()
);
routes.get('/speakers/:id/questions',
routes.get('/admin/speakers/:id/questions',
isAdministratorUser,
(req, res, next) => {
req.params.association = 'questions';
next();
},
speakerController.find()
);*/
);
routes.get('/admin/speakers/:id/multimedias',
isAdministratorUser,
(req, res, next) => {
req.params.association = 'multimedias';
next();
},
speakerController.find()
);
// Nuevo ponente
routes.post('/speakers/:id',
routes.post('/admin/speakers/:id',
isAdministratorUser,
speakerController.create()
);
// Modificar ponente
routes.put('/speakers/:id',
routes.put('/admin/speakers/:id',
isAdministratorUser,
speakerController.update()
);
// Borrar ponente
routes.delete('/speakers/:id',
routes.delete('/admin/speakers/:id',
isAdministratorUser,
speakerController.delete()
);