Gestión de notificaciones

This commit is contained in:
David Arranz 2019-10-17 18:59:18 +02:00
parent dbd615086a
commit 68a2f7fc52
9 changed files with 90 additions and 73 deletions

View File

@ -1,14 +1,15 @@
'use strict'; 'use strict';
const httpStatus = require('http-status'); const httpStatus = require('http-status');
const Sequelize = require('sequelize');
const generateControllers = require('../../core/controllers'); const generateControllers = require('../../core/controllers');
const { buildContext } = require('../../core/controllers'); const { buildContext } = require('../../core/controllers');
const pushService = require('./push.service'); const notificationService = require('./notification.service');
const userService = require('../auth/auth.service'); const userDeviceService = require('./user_device.service');
const { extractParamsFromRequest, handleErrorResponse, handleResultResponse } = require('../../helpers/controller.helper'); const { extractParamsFromRequest, handleErrorResponse, handleResultResponse } = require('../../helpers/controller.helper');
// Module Name // Module Name
const MODULE_NAME = '[push.controller]'; const MODULE_NAME = '[notification.controller]';
const controllerOptions = { MODULE_NAME }; const controllerOptions = { MODULE_NAME };
const extraControllers = { const extraControllers = {
@ -32,13 +33,13 @@ const extraControllers = {
} }
try { try {
let getUserDevicesPromise = (userId) => pushService.fetchAll({ params: { userId: userId }}, context); let getUserDevicesPromise = (userId) => userDeviceService.fetchAll({ params: { userId: userId }}, context);
let sendNotificationsPromise = (messages) => pushService.sendNotification(messages); let sendNotificationsPromise = (messages) => notificationService.sendNotification(messages);
let buildMessagePromise = (userDevices) => { let buildMessagePromise = (userDevices) => {
let message = undefined; let message = undefined;
userDevices.rows.forEach(function (userDevice) { userDevices.rows.forEach(function (userDevice) {
if (pushService.isValidPushToken(userDevice.token)) { if (notificationService.isValidPushToken(userDevice.token)) {
message = { message = {
userId: userDevice.userId, userId: userDevice.userId,
to: userDevice.token, to: userDevice.token,
@ -95,15 +96,15 @@ const extraControllers = {
// Buscamos el token y el usuario // Buscamos el token y el usuario
console.log('>> Busco el usuario y el token', params.params); console.log('>> Busco el usuario y el token', params.params);
let result = await pushService.fetchOne(params, context); let result = await notificationService.fetchOne(params, context);
if (!result) { if (!result) {
// Dar de alta el token // Dar de alta el token
console.log('>> Dar de alta el token', data); console.log('>> Dar de alta el token', data);
result = await pushService.create(data, context); result = await notificationService.create(data, context);
} else { } else {
// Actualizar el token // Actualizar el token
console.log('>> Actualizar el token', params.params, data, context); console.log('>> Actualizar el token', params.params, data, context);
result = await pushService.update(params.params, data, context); result = await notificationService.update(params.params, data, context);
} }
} catch(error) { } catch(error) {
console.error(error); console.error(error);
@ -115,4 +116,4 @@ const extraControllers = {
}, },
}; };
module.exports = generateControllers(pushService, extraControllers, controllerOptions); module.exports = generateControllers(notificationService, extraControllers, controllerOptions);

View File

@ -0,0 +1,56 @@
const routes = require('express').Router();
const { isAdministratorUser, isLoggedUser } = require('../../middlewares/accessValidator');
const SchemaValidator = require('../../middlewares/schemaValidator');
const PaginateMiddleware = require('../../middlewares/paginate');
const FieldMiddleware = require('../../middlewares/fields');
const notificationController = require('./notification.controller');
const { deviceTokenInputType, notificationSendType } = require('./notification.validations');
const generalInvalidFields = [
'createdAt', 'updatedAt',
];
routes.get('/notifications',
isAdministratorUser,
FieldMiddleware.middleware({
invalidFields: generalInvalidFields
}),
PaginateMiddleware.middleware(),
notificationController.find({
scopes: ['defaultScope']
})
);
routes.get('/notifications/:id',
isAdministratorUser,
FieldMiddleware.middleware({
invalidFields: generalInvalidFields
}),
notificationController.findOne({
scopes: ['defaultScope']
})
);
routes.post('/notifications',
isAdministratorUser,
SchemaValidator(notificationSendType, true),
notificationController.sendNotification({
scopes: ['defaultScope']
})
);
/* Borrar cuando ya no aparezca la versión 1.0.10 */
routes.post('/notifications/register',
isLoggedUser,
SchemaValidator(deviceTokenInputType, true),
notificationController.registerUser()
);
routes.post('/notifications/devices',
isLoggedUser,
SchemaValidator(deviceTokenInputType, true),
notificationController.registerUser()
);
module.exports = routes;

View File

@ -12,12 +12,6 @@ const extraMethods = {
return Expo.isExpoPushToken(token); return Expo.isExpoPushToken(token);
}, },
getPushToken: (params) => {
return models.UserDevice.findOne({
where: params,
});
},
sendNotification: async (messages) => { sendNotification: async (messages) => {
// The Expo push notification service accepts batches of notifications so // The Expo push notification service accepts batches of notifications so
@ -83,7 +77,7 @@ const extraMethods = {
} }
}; };
module.exports = generateService(models.UserDevice, extraMethods); module.exports = generateService(models.Notification, extraMethods);
const _sendPushNotificationsAsync = async function (chunks) { const _sendPushNotificationsAsync = async function (chunks) {
@ -149,7 +143,7 @@ const _getPushNotificationsResultAsync = async function (receiptIdChunks) {
const _saveNotifications = async function (messages, tickets) { const _saveNotifications = async function (messages, tickets) {
let notifications = []; let notifications = [];
messages.forEach(function (message, index) { messages.forEach(function (message, index) {
let notification = models.Notification.build({ let notification = models.NotificationDetail.build({
...message, ...message,
ticket: tickets[index].id, ticket: tickets[index].id,
status: tickets[index].status, status: tickets[index].status,

View File

@ -1,6 +1,6 @@
const Joi = require('joi'); const Joi = require('joi');
const pushInputType = Joi.object().keys({ const deviceTokenInputType = Joi.object().keys({
token: Joi.string().required(), token: Joi.string().required(),
}); });
@ -12,5 +12,5 @@ const pushSendType = Joi.object().keys({
}); });
module.exports = { module.exports = {
pushInputType, deviceTokenInputType, pushSendType
}; };

View File

@ -0,0 +1,18 @@
const moment = require('moment');
const { Expo } = require('expo-server-sdk');
const { generateService, parseParamsToFindOptions } = require('../../helpers/service.helper');
const models = require('../../core/models');
// Create a new Expo SDK client
const expo = new Expo();
const extraMethods = {
getPushToken: (params) => {
return models.UserDevice.findOne({
where: params,
});
},
};
module.exports = generateService(models.UserDevice, extraMethods);

View File

@ -1,52 +0,0 @@
const routes = require('express').Router();
const { isAdministratorUser, isLoggedUser } = require('../../middlewares/accessValidator');
const SchemaValidator = require('../../middlewares/schemaValidator');
const FieldMiddleware = require('../../middlewares/fields');
const pushTokenController = require('./push.controller');
const { pushInputType, pushSendType } = require('./push.validations');
const generalInvalidFields = [
'createdAt', 'updatedAt',
];
routes.get('/notifications',
/*isAdministratorUser,
SchemaValidator(pushSendType, true),
pushTokenController.sendNotification({
scopes: ['defaultScope']
})*/
);
routes.get('/notifications/:id',
/*isAdministratorUser,
SchemaValidator(pushSendType, true),
pushTokenController.sendNotification({
scopes: ['defaultScope']
})*/
);
routes.post('/notifications',
isAdministratorUser,
SchemaValidator(pushSendType, true),
pushTokenController.sendNotification({
scopes: ['defaultScope']
})
);
/* Borrar cuando ya no aparezca la versión 1.0.10 */
routes.post('/notifications/register',
isLoggedUser,
SchemaValidator(pushInputType, true),
pushTokenController.registerUser()
);
routes.post('/notifications/devices',
isLoggedUser,
SchemaValidator(pushInputType, true),
pushTokenController.registerUser()
);
module.exports = routes;