UNPKG

@tiledesk/tiledesk-server

Version:
1,240 lines (1,003 loc) 48.4 kB
var express = require('express'); var router = express.Router(); var Project = require("../models/project"); var projectEvent = require("../event/projectEvent"); var projectService = require("../services/projectService"); var projectUserService = require("../services/projectUserService"); var Project_user = require("../models/project_user"); var operatingHoursService = require("../services/operatingHoursService"); var Department = require('../models/department'); var Group = require('../models/group'); var winston = require('../config/winston'); var roleChecker = require('../middleware/has-role'); var config = require('../config/database'); // THE THREE FOLLOWS IMPORTS ARE USED FOR AUTHENTICATION IN THE ROUTE var passport = require('passport'); require('../middleware/passport')(passport); var validtoken = require('../middleware/valid-token') var RoleConstants = require("../models/roleConstants"); var cacheUtil = require('../utils/cacheUtil'); var orgUtil = require("../utils/orgUtil"); var cacheEnabler = require("../services/cacheEnabler"); var mongoose = require('mongoose'); var jwt = require('jsonwebtoken'); // CHECK IT ASAP!!!! let configSecret = process.env.GLOBAL_SECRET || config.secret; var pKey = process.env.GLOBAL_SECRET_OR_PRIVATE_KEY; // console.log("pKey",pKey); if (pKey) { configSecret = pKey.replace(/\\n/g, '\n'); } let pubConfigSecret = process.env.GLOBAL_SECRET || config.secret; var pubKey = process.env.GLOBAL_SECRET_OR_PUB_KEY; if (pubKey) { pubConfigSecret = pubKey.replace(/\\n/g, '\n'); } // CHECK IT ASAP!!!! router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], async (req, res) => { // create(name, createdBy, settings) return projectService.create(req.body.name, req.user.id, undefined, req.body.defaultLanguage).then(function(savedProject) { res.json(savedProject); }); }); // DOWNGRADE PLAN. UNUSED router.put('/:projectid/downgradeplan', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], function (req, res) { winston.debug('downgradeplan - UPDATE PROJECT REQ BODY ', req.body); Project.findByIdAndUpdate(req.params.projectid, req.body, { new: true, upsert: true }, function (err, updatedProject) { if (err) { winston.error('Error putting project ', err); return res.status(500).send({ success: false, msg: 'Error updating object.' }); } projectEvent.emit('project.downgrade', updatedProject ); res.json(updatedProject); }); }); router.delete('/:projectid/physical', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], function (req, res) { winston.debug(req.body); // TODO delete also department, faq_kb, faq, group, label, lead, message, project_users, requests, subscription // TODO use findByIdAndRemove otherwise project don't contains label object Project.remove({ _id: req.params.projectid }, function (err, project) { if (err) { winston.error('Error deleting project ', err); return res.status(500).send({ success: false, msg: 'Error deleting object.' }); } projectEvent.emit('project.delete', project ); res.json(project); }); }); router.delete('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('owner')], function (req, res) { winston.debug(req.body); // TODO delete also department, faq_kb, faq, group, label, lead, message, project_users, requests, subscription Project.findByIdAndUpdate(req.params.projectid, {status:0}, { new: true, upsert: true }, function (err, project) { if (err) { winston.error('Error deleting project ', err); return res.status(500).send({ success: false, msg: 'Error deleting object.' }); } projectEvent.emit('project.delete', project ); res.json(project); }); }); // router.put('/:projectid/update', function (req, res) { // // router.put('/:projectid/profile', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], function (req, res) { // // Get token from header authorization // let token = req.headers.authorization; // token = token.split(" ")[1]; // try { // let decoded = jwt.verify(token, configSecret) // winston.debug("user decode: ", decoded); // if (!process.env.ADMIN_EMAIL) { // winston.warn("Missing admin email parameter in environment"); // return res.status(401).send({ success: false, error: "Missing admin email parameter"}); // } // if (decoded.email !== process.env.ADMIN_EMAIL) { // winston.warn("Profile modification: permission denied."); // return res.status(403).send({ success: false, error: "You don't have the permission required to modify the project profile"}); // } // /** // * modify the project profile here // */ // var update = {}; // if (req.body.name!=undefined) { // update.name = req.body.name; // } // if (req.body.activeOperatingHours!=undefined) { // update.activeOperatingHours = req.body.activeOperatingHours; // } // if (req.body.operatingHours!=undefined) { // update.operatingHours = req.body.operatingHours; // } // if (req.body.settings!=undefined) { // update.settings = req.body.settings; // } // if (req.body["settings.email.autoSendTranscriptToRequester"]!=undefined) { // update["settings.email.autoSendTranscriptToRequester"] = req.body["settings.email.autoSendTranscriptToRequester"]; // } // if (req.body["settings.email.notification.conversation.assigned"]!=undefined) { // update["settings.email.notification.conversation.assigned"] = req.body["settings.email.notification.conversation.assigned"]; // } // if (req.body["settings.email.notification.conversation.pooled"]!=undefined) { // update["settings.email.notification.conversation.pooled"] = req.body["settings.email.notification.conversation.pooled"]; // } // if (req.body["settings.email.templates.assignedRequest"]!=undefined) { // update["settings.email.templates.assignedRequest"] = req.body["settings.email.templates.assignedRequest"]; // } // if (req.body["settings.email.templates.assignedEmailMessage"]!=undefined) { // update["settings.email.templates.assignedEmailMessage"] = req.body["settings.email.templates.assignedEmailMessage"]; // } // if (req.body["settings.email.templates.pooledRequest"]!=undefined) { // update["settings.email.templates.pooledRequest"] = req.body["settings.email.templates.pooledRequest"]; // } // if (req.body["settings.email.templates.pooledEmailMessage"]!=undefined) { // update["settings.email.templates.pooledEmailMessage"] = req.body["settings.email.templates.pooledEmailMessage"]; // } // if (req.body["settings.email.templates.newMessage"]!=undefined) { // update["settings.email.templates.newMessage"] = req.body["settings.email.templates.newMessage"]; // } // if (req.body["settings.email.templates.newMessageFollower"]!=undefined) { // update["settings.email.templates.newMessageFollower"] = req.body["settings.email.templates.newMessageFollower"]; // } // if (req.body["settings.email.templates.ticket"]!=undefined) { // update["settings.email.templates.ticket"] = req.body["settings.email.templates.ticket"]; // } // if (req.body["settings.email.templates.sendTranscript"]!=undefined) { // update["settings.email.templates.sendTranscript"] = req.body["settings.email.templates.sendTranscript"]; // } // if (req.body["settings.email.templates.emailDirect"]!=undefined) { // update["settings.email.templates.emailDirect"] = req.body["settings.email.templates.emailDirect"]; // } // if (req.body["settings.email.from"]!=undefined) { // update["settings.email.from"] = req.body["settings.email.from"]; // } // if (req.body["settings.email.config.host"]!=undefined) { // update["settings.email.config.host"] = req.body["settings.email.config.host"]; // } // if (req.body["settings.email.config.port"]!=undefined) { // update["settings.email.config.port"] = req.body["settings.email.config.port"]; // } // if (req.body["settings.email.config.secure"]!=undefined) { // update["settings.email.config.secure"] = req.body["settings.email.config.secure"]; // } // if (req.body["settings.email.config.user"]!=undefined) { // update["settings.email.config.user"] = req.body["settings.email.config.user"]; // } // if (req.body["settings.email.config.pass"]!=undefined) { // update["settings.email.config.pass"] = req.body["settings.email.config.pass"]; // } // if (req.body["settings.chat_limit_on"]!=undefined) { // update["settings.chat_limit_on"] = req.body["settings.chat_limit_on"]; // } // if (req.body["settings.max_agent_assigned_chat"]!=undefined) { // update["settings.max_agent_assigned_chat"] = req.body["settings.max_agent_assigned_chat"]; // } // if (req.body["settings.reassignment_on"]!=undefined) { // update["settings.reassignment_on"] = req.body["settings.reassignment_on"]; // } // if (req.body["settings.reassignment_delay"]!=undefined) { // update["settings.reassignment_delay"] = req.body["settings.reassignment_delay"]; // } // if (req.body["settings.automatic_unavailable_status_on"]!=undefined) { // update["settings.automatic_unavailable_status_on"] = req.body["settings.automatic_unavailable_status_on"]; // } // if (req.body["settings.automatic_idle_chats"]!=undefined) { // update["settings.automatic_idle_chats"] = req.body["settings.automatic_idle_chats"]; // } // if (req.body.widget!=undefined) { // update.widget = req.body.widget; // } // if (req.body.versions!=undefined) { // update.versions = req.body.versions; // } // if (req.body.channels!=undefined) { // update.channels = req.body.channels; // } // if (req.body.ipFilterEnabled!=undefined) { // update.ipFilterEnabled = req.body.ipFilterEnabled; // } // if (req.body.ipFilter!=undefined) { // update.ipFilter = req.body.ipFilter; // } // if (req.body.ipFilterDenyEnabled!=undefined) { // update.ipFilterDenyEnabled = req.body.ipFilterDenyEnabled; // } // if (req.body.ipFilterDeny!=undefined) { // update.ipFilterDeny = req.body.ipFilterDeny; // } // if (req.body.bannedUsers!=undefined) { // update.bannedUsers = req.body.bannedUsers; // } // if (req.body.profile!=undefined) { // update.profile = req.body.profile; // } // winston.debug('UPDATE PROJECT REQ BODY ', update); // Project.findByIdAndUpdate(req.params.projectid, update, { new: true, upsert: true }, function (err, updatedProject) { // if (err) { // winston.error('Error putting project ', err); // return res.status(500).send({ success: false, msg: 'Error updating object.' }); // } // projectEvent.emit('project.update', updatedProject ); // res.json(updatedProject); // }); // } catch (err) { // winston.warn("Profile modification: permission denied."); // res.status(403).send({ success: false, error: "You don't have the permission required to modify the project profile"}); // } // }) router.put('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) { winston.debug('UPDATE PROJECT REQ BODY ', req.body); var update = {}; let updating_quotes = false; if (req.body.profile) { if (req.user && req.user.attributes && req.user.attributes.isSuperadmin === true) { winston.debug("Superadmin can modify the project profile") update.profile = req.body.profile; if (req.body.profile.quotes) { updating_quotes = true; } /** * Possibile Miglioramento * Eliminare solo le chiavi di redis di notify solo per le quote che si stanno modificando. * Per farlo è necessario permettere la modifica puntuale del project profile, attualmente non disponibile. */ delete req.user.attributes.isSuperadmin; } else { winston.verbose("Project profile can't be modified by the current user " + req.user._id); return res.status(403).send({ success: false, error: "You don't have the permission required to modify the project profile"}); } // check if super admin // let token = req.headers.authorization // token = token.split(" ")[1]; // let decoded = jwt.verify(token, configSecret); // winston.debug("user decoded: ", decoded); // console.log("user decoded: ", decoded); // if (!process.env.ADMIN_EMAIL) { // winston.warn("Missing admin email parameter in environment"); // return res.status(401).send({ success: false, error: "Missing admin email parameter"}); // } // if (!decoded) { // winston.warn("Profile modification: permission denied."); // return res.status(403).send({ success: false, error: "You don't have the permission required to modify the project profile. Can't decode user."}); // } // if (decoded.email !== process.env.ADMIN_EMAIL) { // winston.warn("Profile modification: permission denied."); // return res.status(403).send({ success: false, error: "You don't have the permission required to modify the project profile"}); // } // console.log("You can modify the project profile"); // winston.info("Illegal field profile detected. Deny project profile update."); // return res.status(403).send({ success: false, error: "You cannot edit the project profile."}); } //like patch if (req.body.name!=undefined) { update.name = req.body.name; } if (req.body.activeOperatingHours!=undefined) { update.activeOperatingHours = req.body.activeOperatingHours; } if (req.body.operatingHours!=undefined) { update.operatingHours = req.body.operatingHours; } if (req.body.timeSlots!=undefined) { update.timeSlots = req.body.timeSlots; } if (req.body.settings!=undefined) { update.settings = req.body.settings; } if (req.body["settings.email.autoSendTranscriptToRequester"]!=undefined) { update["settings.email.autoSendTranscriptToRequester"] = req.body["settings.email.autoSendTranscriptToRequester"]; } if (req.body["settings.email.notification.conversation.assigned"]!=undefined) { update["settings.email.notification.conversation.assigned"] = req.body["settings.email.notification.conversation.assigned"]; } if (req.body["settings.email.notification.conversation.pooled"]!=undefined) { update["settings.email.notification.conversation.pooled"] = req.body["settings.email.notification.conversation.pooled"]; } if (req.body["settings.email.templates.assignedRequest"]!=undefined) { update["settings.email.templates.assignedRequest"] = req.body["settings.email.templates.assignedRequest"]; } if (req.body["settings.email.templates.assignedEmailMessage"]!=undefined) { update["settings.email.templates.assignedEmailMessage"] = req.body["settings.email.templates.assignedEmailMessage"]; } if (req.body["settings.email.templates.pooledRequest"]!=undefined) { update["settings.email.templates.pooledRequest"] = req.body["settings.email.templates.pooledRequest"]; } if (req.body["settings.email.templates.pooledEmailMessage"]!=undefined) { update["settings.email.templates.pooledEmailMessage"] = req.body["settings.email.templates.pooledEmailMessage"]; } if (req.body["settings.email.templates.newMessage"]!=undefined) { update["settings.email.templates.newMessage"] = req.body["settings.email.templates.newMessage"]; } if (req.body["settings.email.templates.newMessageFollower"]!=undefined) { update["settings.email.templates.newMessageFollower"] = req.body["settings.email.templates.newMessageFollower"]; } if (req.body["settings.email.templates.ticket"]!=undefined) { update["settings.email.templates.ticket"] = req.body["settings.email.templates.ticket"]; } if (req.body["settings.email.templates.sendTranscript"]!=undefined) { update["settings.email.templates.sendTranscript"] = req.body["settings.email.templates.sendTranscript"]; } if (req.body["settings.email.templates.emailDirect"]!=undefined) { update["settings.email.templates.emailDirect"] = req.body["settings.email.templates.emailDirect"]; } if (req.body["settings.email.from"]!=undefined) { update["settings.email.from"] = req.body["settings.email.from"]; } if (req.body["settings.email.config.host"]!=undefined) { update["settings.email.config.host"] = req.body["settings.email.config.host"]; } if (req.body["settings.email.config.port"]!=undefined) { update["settings.email.config.port"] = req.body["settings.email.config.port"]; } if (req.body["settings.email.config.secure"]!=undefined) { update["settings.email.config.secure"] = req.body["settings.email.config.secure"]; } if (req.body["settings.email.config.user"]!=undefined) { update["settings.email.config.user"] = req.body["settings.email.config.user"]; } if (req.body["settings.email.config.pass"]!=undefined) { update["settings.email.config.pass"] = req.body["settings.email.config.pass"]; } /* if (req.body.settings.email.templates.assignedRequest!=undefined) { // if (req.body["settings.email.templates.assignedRequest.html"]!=undefined) { console.log("assignedRequest"); update["settings.email.templates.assignedRequest"] = req.body.settings.email.templates.assignedRequest; } if (req.body["settings.email.templates.assignedEmailMessage.html"]!=undefined) { update["settings.email.templates.assignedEmailMessage.html"] = req.body["settings.email.templates.assignedEmailMessage.html"]; } if (req.body.settings.email.templates.pooledRequest!=undefined) { console.log("pooledRequest"); update["settings.email.templates.pooledRequest"] = req.body.settings.email.templates.pooledRequest; } */ if (req.body["settings.chat_limit_on"]!=undefined) { update["settings.chat_limit_on"] = req.body["settings.chat_limit_on"]; } if (req.body["settings.max_agent_assigned_chat"]!=undefined) { update["settings.max_agent_assigned_chat"] = req.body["settings.max_agent_assigned_chat"]; } if (req.body["settings.reassignment_on"]!=undefined) { update["settings.reassignment_on"] = req.body["settings.reassignment_on"]; } if (req.body["settings.reassignment_delay"]!=undefined) { update["settings.reassignment_delay"] = req.body["settings.reassignment_delay"]; } if (req.body["settings.automatic_unavailable_status_on"]!=undefined) { update["settings.automatic_unavailable_status_on"] = req.body["settings.automatic_unavailable_status_on"]; } if (req.body["settings.automatic_idle_chats"]!=undefined) { update["settings.automatic_idle_chats"] = req.body["settings.automatic_idle_chats"]; } if (req.body["settings.current_agent_my_chats_only"]!=undefined) { update["settings.current_agent_my_chats_only"] = req.body["settings.current_agent_my_chats_only"]; } if (req.body["settings.chatbots_attributes_hidden"]!=undefined) { update["settings.chatbots_attributes_hidden"] = req.body["settings.chatbots_attributes_hidden"]; } if (req.body["settings.allow_send_emoji"]!=undefined) { update["settings.allow_send_emoji"] = req.body["settings.allow_send_emoji"]; } if (req.body["settings.allowed_urls"]!=undefined) { update["settings.allowed_urls"] = req.body["settings.allowed_urls"]; } if (req.body["settings.allowed_urls_list"]!=undefined) { update["settings.allowed_urls_list"] = req.body["settings.allowed_urls_list"]; } if (req.body["settings.allowed_upload_extentions"]!=undefined) { update["settings.allowed_upload_extentions"] = req.body["settings.allowed_upload_extentions"]; } if (req.body.widget!=undefined) { update.widget = req.body.widget; } if (req.body.versions!=undefined) { update.versions = req.body.versions; } if (req.body.channels!=undefined) { update.channels = req.body.channels; } if (req.body.ipFilterEnabled!=undefined) { update.ipFilterEnabled = req.body.ipFilterEnabled; } if (req.body.ipFilter!=undefined) { update.ipFilter = req.body.ipFilter; } if (req.body.ipFilterDenyEnabled!=undefined) { update.ipFilterDenyEnabled = req.body.ipFilterDenyEnabled; } if (req.body.ipFilterDeny!=undefined) { update.ipFilterDeny = req.body.ipFilterDeny; } if (req.body.bannedUsers!=undefined) { update.bannedUsers = req.body.bannedUsers; } // if (req.body.defaultLanguage!=undefined) { // update.defaultLanguage = req.body.defaultLanguage; // } winston.debug('UPDATE PROJECT REQ BODY ', update); // console.log("update",JSON.stringify(update)); Project.findByIdAndUpdate(req.params.projectid, update, { new: true, upsert: true }, function (err, updatedProject) { if (err) { winston.error('Error putting project ', err); return res.status(500).send({ success: false, msg: 'Error updating object.' }); } projectEvent.emit('project.update', updatedProject ); if (updating_quotes == true) { let obj = { createdAt: new Date() }; let quoteManager = req.app.get('quote_manager'); quoteManager.invalidateCheckpointKeys(updatedProject, obj); } res.json(updatedProject); }); }); router.patch('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) { winston.debug('PATCH PROJECT REQ BODY ', req.body); var update = {}; if (req.body.name!=undefined) { update.name = req.body.name; } if (req.body.activeOperatingHours!=undefined) { update.activeOperatingHours = req.body.activeOperatingHours; } if (req.body.operatingHours!=undefined) { update.operatingHours = req.body.operatingHours; } if (req.body.settings!=undefined) { update.settings = req.body.settings; } if (req.body["settings.email.autoSendTranscriptToRequester"]!=undefined) { update["settings.email.autoSendTranscriptToRequester"] = req.body["settings.email.autoSendTranscriptToRequester"]; } if (req.body["settings.email.notification.conversation.assigned"]!=undefined) { update["settings.email.notification.conversation.assigned"] = req.body["settings.email.notification.conversation.assigned"]; } if (req.body["settings.email.notification.conversation.pooled"]!=undefined) { update["settings.email.notification.conversation.pooled"] = req.body["settings.email.notification.conversation.pooled"]; } if (req.body["settings.email.templates.assignedRequest"]!=undefined) { update["settings.email.templates.assignedRequest"] = req.body["settings.email.templates.assignedRequest"]; } if (req.body["settings.email.templates.assignedEmailMessage"]!=undefined) { update["settings.email.templates.assignedEmailMessage"] = req.body["settings.email.templates.assignedEmailMessage"]; } if (req.body["settings.email.templates.pooledRequest"]!=undefined) { update["settings.email.templates.pooledRequest"] = req.body["settings.email.templates.pooledRequest"]; } if (req.body["settings.email.templates.pooledEmailMessage"]!=undefined) { update["settings.email.templates.pooledEmailMessage"] = req.body["settings.email.templates.pooledEmailMessage"]; } if (req.body["settings.email.templates.newMessage"]!=undefined) { update["settings.email.templates.newMessage"] = req.body["settings.email.templates.newMessage"]; } if (req.body["settings.email.templates.ticket"]!=undefined) { update["settings.email.templates.ticket"] = req.body["settings.email.templates.ticket"]; } if (req.body["settings.email.templates.sendTranscript"]!=undefined) { update["settings.email.templates.sendTranscript"] = req.body["settings.email.templates.sendTranscript"]; } if (req.body["settings.email.from"]!=undefined) { update["settings.email.from"] = req.body["settings.email.from"]; } if (req.body["settings.email.config.host"]!=undefined) { update["settings.email.config.host"] = req.body["settings.email.config.host"]; } if (req.body["settings.email.config.port"]!=undefined) { update["settings.email.config.port"] = req.body["settings.email.config.port"]; } if (req.body["settings.email.config.secure"]!=undefined) { update["settings.email.config.secure"] = req.body["settings.email.config.secure"]; } if (req.body["settings.email.config.user"]!=undefined) { update["settings.email.config.user"] = req.body["settings.email.config.user"]; } if (req.body["settings.email.config.pass"]!=undefined) { update["settings.email.config.pass"] = req.body["settings.email.config.pass"]; } if (req.body["settings.chat_limit_on"]!=undefined) { update["settings.chat_limit_on"] = req.body["settings.chat_limit_on"]; } if (req.body["settings.max_agent_assigned_chat"]!=undefined) { update["settings.max_agent_assigned_chat"] = req.body["settings.max_agent_assigned_chat"]; } if (req.body["settings.reassignment_on"]!=undefined) { update["settings.reassignment_on"] = req.body["settings.reassignment_on"]; } if (req.body["settings.reassignment_delay"]!=undefined) { update["settings.reassignment_delay"] = req.body["settings.reassignment_delay"]; } if (req.body["settings.automatic_unavailable_status_on"]!=undefined) { update["settings.automatic_unavailable_status_on"] = req.body["settings.automatic_unavailable_status_on"]; } if (req.body["settings.automatic_idle_chats"]!=undefined) { update["settings.automatic_idle_chats"] = req.body["settings.automatic_idle_chats"]; } if (req.body.widget!=undefined) { update.widget = req.body.widget; } if (req.body.versions!=undefined) { update.versions = req.body.versions; } if (req.body.channels!=undefined) { update.channels = req.body.channels; } if (req.body.ipFilterEnabled!=undefined) { update.ipFilterEnabled = req.body.ipFilterEnabled; } if (req.body.ipFilter!=undefined) { update.ipFilter = req.body.ipFilter; } if (req.body.ipFilterDenyEnabled!=undefined) { update.ipFilterDenyEnabled = req.body.ipFilterDenyEnabled; } if (req.body.ipFilterDeny!=undefined) { update.ipFilterDeny = req.body.ipFilterDeny; } if (req.body.bannedUsers!=undefined) { update.bannedUsers = req.body.bannedUsers; } // if (req.body.defaultLanguage!=undefined) { // update.defaultLanguage = req.body.defaultLanguage; // } winston.debug('UPDATE PROJECT REQ BODY ', update); Project.findByIdAndUpdate(req.params.projectid, update, { new: true, upsert: true }, function (err, updatedProject) { if (err) { winston.error('Error putting project ', err); return res.status(500).send({ success: false, msg: 'Error patching object.' }); } projectEvent.emit('project.update', updatedProject ); res.json(updatedProject); }); }); router.patch('/:projectid/attributes', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) { var data = req.body; // TODO use service method Project.findById(req.params.projectid, function (err, updatedProject) { if (err) { winston.error('--- > ERROR ', err); return res.status(500).send({ success: false, msg: 'Error updating object.' }); } if (!updatedProject) { return res.status(404).send({ success: false, msg: 'Object not found.' }); } if (!updatedProject.attributes) { winston.debug("empty attributes") updatedProject.attributes = {}; } winston.debug(" updatedProject attributes", updatedProject.attributes) Object.keys(data).forEach(function(key) { var val = data[key]; winston.debug("data attributes "+key+" " +val) updatedProject.attributes[key] = val; }); winston.debug(" updatedProject attributes", updatedProject.attributes) // https://stackoverflow.com/questions/24054552/mongoose-not-saving-nested-object updatedProject.markModified('attributes'); //cacheinvalidation updatedProject.save(function (err, savedProject) { if (err) { winston.error("error saving project attributes",err) return res.status(500).send({ success: false, msg: 'Error getting object.' }); } winston.verbose(" saved project attributes",savedProject.toObject()) projectEvent.emit('project.update', savedProject); res.json(savedProject); }); }); }); router.post('/:projectid/ban', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) { winston.debug('PATCH PROJECT REQ BODY ', req.body); var ban = {}; ban.id = req.body.id; ban.ip = req.body.ip; Project.findByIdAndUpdate(req.params.projectid, { $push: { bannedUsers: ban } }, { new: true, upsert: false }, function (err, updatedProject) { if (err) { winston.error('Error putting project ', err); return res.status(500).send({ success: false, msg: 'Error patching object.' }); } projectEvent.emit('project.update', updatedProject ); projectEvent.emit('project.update.user.ban', {banInfo: ban, project: updatedProject }); res.json(updatedProject); }); }); router.delete('/:projectid/ban/:banid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('admin')], function (req, res) { // winston.info('quiiiiii'); //cacheinvalidation // devi prendere id utente prima di eliminarlo Project.findByIdAndUpdate(req.params.projectid, { $pull: { bannedUsers: { "_id": req.params.banid }}}, { new: true, upsert: false }, function (err, updatedProject) { if (err) { winston.error('Error putting project ', err); return res.status(500).send({ success: false, msg: 'Error patching object.' }); } projectEvent.emit('project.update', updatedProject ); projectEvent.emit('project.update.user.unban', {banInfo: req.params.banid, project: updatedProject}); res.json(updatedProject); }); }); router.get('/all', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], function (req, res) { if (req.headers.authorization) { let token = req.headers.authorization.split(" ")[1]; let decode = jwt.verify(token, pubConfigSecret) if (decode && (decode.email === process.env.ADMIN_EMAIL)) { Project.aggregate([ // { // $match: { // status: 100, // //createdAt: { $gte: startDate} // }, // }, { $sort: { createdAt: -1 }, }, { $lookup: { from: 'project_users', localField: '_id', foreignField: 'id_project', as: 'project_user', pipeline: [ { $match: { role: 'owner' } } ] } }, { $addFields: { project_user: { $arrayElemAt: ['$project_user', 0] } } }, { $lookup: { from: 'users', localField: 'project_user.id_user', foreignField: '_id', as: 'user' }, }, { $addFields: { user: { $arrayElemAt: ['$user', 0] } } } ]) .then((projects) => { winston.verbose("Projects found " + projects.length) // const fieldsToKeep = ['_id', 'name', 'createdBy', 'createdAt', 'user.email' ]; const filteredProjects = projects.map(project => { const filteredProject = {}; filteredProject._id = project._id; filteredProject.name = project.name; filteredProject.owner = project.user?.email; filteredProject.createdAt = project.createdAt; filteredProject.profile_name = project.profile?.name; // ... add other fields here // fieldsToKeep.forEach(field => { // if (project[field] !== undefined) { // filteredProject[field] = project[field]; // } // }); return filteredProject; }); return res.status(200).send(filteredProjects); }) .catch((err) => { console.error(err); return res.status(500).send({ success: false, error: err}); }); // let updatedUser = await User.findByIdAndUpdate(savedUser._id, { emailverified: true }, { new: true }).exec(); // winston.debug("updatedUser: ", updatedUser); // skipVerificationEmail = true; // winston.verbose("skip sending verification email") } else { return res.status(403).send({ success: false, error: "You don't have the permission required to perform the operation"}); } } }); //roleChecker.hasRole('agent') works because req.params.projectid is valid using :projectid of this method router.get('/:projectid', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRoleOrTypes('agent', ['subscription'])], function (req, res) { winston.debug(req.body); let q = Project.findOne({_id: req.params.projectid, status:100}); if (cacheEnabler.project) { q.cache(cacheUtil.longTTL, "projects:id:"+req.params.projectid) //project_cache winston.debug('project cache enabled for /project detail'); } q.exec(function (err, project) { if (err) { winston.error('Error getting project ', err); return res.status(500).send({ success: false, msg: 'Error getting object.' }); } if (!project) { winston.warn('Project not found '); return res.status(404).send({ success: false, msg: 'Object not found.' }); } //TODO REMOVE settings from project res.json(project); }); }); // GET ALL PROJECTS BY CURRENT USER ID // router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken, roleChecker.hasRole('agent')], function (req, res) { // altrimenti 403 router.get('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], function (req, res) { winston.debug('REQ USER ID ', req.user._id); var direction = -1; //-1 descending , 1 ascending if (req.query.direction) { direction = req.query.direction; } winston.debug("direction",direction); var sortField = "updatedAt"; if (req.query.sort) { sortField = req.query.sort; } winston.debug("sortField",sortField); var sortQuery={}; sortQuery[sortField] = direction; // rolequery Project_user.find({ id_user: req.user._id , roleType: RoleConstants.TYPE_AGENTS, status: "active"}). // Project_user.find({ id_user: req.user._id , role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}, status: "active"}). // populate('id_project'). populate({ path: 'id_project', // match: { status: 100 }, //not filter only not populate }). sort(sortQuery). exec(function (err, project_users) { if (err) { winston.error('Error getting project_users: ', err); return res.status(500).send({ success: false, msg: 'Error getting object.' }); } //organization: if third sub domain iterate and put only project with organization==subdomain otherwise remove projects with org winston.debug("orgUtil.ORGANIZATION_ENABLED: " + orgUtil.ORGANIZATION_ENABLED); if (orgUtil.ORGANIZATION_ENABLED == true ) { // winston.info("project_users", project_users); winston.debug("project_users.length:"+ project_users.length); let org = orgUtil.getOrg(req); winston.debug("org:"+ org); if (org!=undefined) { winston.debug("org!=undefined"); var project_users = project_users.filter(function (projectUser) { if (projectUser.id_project.organization && projectUser.id_project.organization === org ) { winston.debug("keep"); return true; } }); /* for (var i = 0; i < project_users.length; i++) { winston.info("project_users[i].id_project.organization: " + project_users[i].id_project.organization); if (project_users[i].id_project.organization && project_users[i].id_project.organization === org ) { //keep winston.info("keep"); } else { // project_users.splice(i, 1); // 2nd parameter means remove one item only winston.info("splice"); } }*/ } else { var project_users = project_users.filter(function (projectUser) { if (projectUser.id_project.organization == undefined ) { // winston.info("keep"); return true; } }); /* for (var i = 0; i < project_users.length; i++) { winston.info("project_users[i].id_project.organization: " + project_users[i].id_project.organization); if (project_users[i].id_project.organization) { project_users.splice(i, 1); // 2nd parameter means remove one item only } }*/ } } else { winston.debug("no") } project_users.sort((a, b) => (a.id_project && b.id_project && a.id_project.updatedAt > b.id_project.updatedAt) ? 1 : -1) project_users.reverse(); //TODO REMOVE settings from project res.json(project_users); }); }); // GET ALL PROJECTS BY CURRENT USER ID. usaed by unisalento to know if a project is open router.get('/:projectid/isopen', function (req, res) { let project_id = req.params.projectid; // Check if a timeSlot is passed if (req.query.timeSlot) { let slot_id = req.query.timeSlot; operatingHoursService.slotIsOpenNow(project_id, slot_id, (isOpen, err) => { if (err) { winston.error("Error getting slotIsOpenNow ", err); return res.status(500).send({ success: false, error: err }); } return res.status(200).send({ isopen: isOpen}) }) } else { operatingHoursService.projectIsOpenNow(project_id, function (isOpen, err) { winston.debug('project', project_id, 'isopen: ', isOpen); if (err) { winston.error('Error getting projectIsOpenNow', err); return res.status(500).send({ success: false, msg: err }); } return res.status(200).send({ isopen: isOpen}) }); } }); router.get('/:projectid/users/availables', async (req, res) => { let projectid = req.params.projectid; let raw_option = req.query.raw; let dep_id = req.query.department; let isOpen = true; winston.debug("(Users Availables) raw_option: " + raw_option); winston.debug("(Users Availables) dep_id: " + dep_id); let available_agents_array = []; if (!raw_option || raw_option === false) { try { isOpen = await new Promise((resolve, reject) => { operatingHoursService.projectIsOpenNow(projectid, (isOpen, err) => { if (err) reject(err); else resolve(isOpen); }); }); } catch (err) { winston.error("(Users Availables) check operating hours error: ", err); return res.status(500).send({ success: false, msg: err }); } } if (isOpen === false) { return res.json(available_agents_array); } // rolequery let query = { id_project: projectid, user_available: true, roleType: RoleConstants.TYPE_AGENTS }; // let query = { id_project: projectid, user_available: true, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]} }; if (dep_id) { let department = await Department.findById(dep_id).catch((err) => { winston.error("(Users Availables) find department error: ", err) return res.status(500).send({ success: false, error: err }) }) if (!department) { winston.error("(Users Availables) department not found") return res.status(404).send({ success: false, error: "Department " + dep_id + " not found" }) } let group_id = department.id_group; let groups = department.groups; if (groups && Array.isArray(groups) && groups.length > 0) { // Converti i group_id in ObjectId per la query const groupIds = groups .map(g => g.group_id) .filter(id => !!id) .map(id => mongoose.Types.ObjectId(id)); if (groupIds.length > 0) { const dbGroups = await Group.find({ _id: { $in: groupIds } }).catch((err) => { winston.error("(Users Availables) find groups error: ", err); return res.status(500).send({ success: false, error: err }); }); if (!dbGroups || dbGroups.length === 0) { winston.error("(Users Availables) no valid groups found"); return res.status(404).send({ success: false, error: "No valid groups found" }); } // Filtra i gruppi abilitati const enabledGroups = dbGroups.filter(g => g.enabled !== false); if (enabledGroups.length === 0) { winston.error("(Users Availables) all groups are disabled"); return res.status(403).send({ success: false, error: "All groups are currently disabled" }); } // Raccogli tutti i membri (stringhe) e rimuovi duplicati const members = [...new Set(enabledGroups.flatMap(g => g.members))]; query.id_user = { $in: members }; } } else if (group_id) { let group = await Group.findById(group_id).catch((err) => { winston.error("(Users Availables) find group error: ", err) return res.status(500).send({ success: false, error: err }) }) if (!group) { winston.error("(Users Availables) group not found") return res.status(404).send({ success: false, error: "Group " + group_id + " not found" }) } if (group.enabled === false) { winston.error("(Users Availables) group disabled") return res.status(403).send({ success: false, error: "Group " + group_id + " is currently disabled" }) } query.id_user = { $in: group.members.map(id => mongoose.Types.ObjectId(id) )} } } winston.debug("(Users Availables) project_users query ", query) Project_user.find(query) .populate('id_user') .exec( async (err, project_users) => { if (err) { winston.debug('PROJECT ROUTES - FINDS AVAILABLES project_users - ERROR: ', err); return res.status(500).send({ success: false, msg: 'Error getting object.' + err}); } let project = await Project.findById(projectid).catch((err) => { winston.error("find project error: ", err) res.status(500).send({ success: false, error: err }) }) // check on SMART ASSIGNMENT let available_agents = projectUserService.checkAgentsAvailablesWithSmartAssignment(project, project_users); winston.verbose("(Users Availables) available agents after smart assignment check", available_agents); if (available_agents) { available_agents_array = []; available_agents.forEach(agent => { //console.log("agent: ", agent); if (agent.id_user) { available_agents_array.push({ "id": agent.id_user._id, "pu_id": agent._id, "fullname": agent.id_user.firstname + " " + agent.id_user.lastname, "email": agent.id_user.email, "assigned_request": agent.number_assigned_requests }); } else { winston.warn("(Users Availables) agent.id_user is undefined"); } }); winston.debug("(Users Availables) return following available_agents_array", available_agents_array); res.json(available_agents_array); } }) }) // OLD ENDPOINT for /users/availables //togli questo route da qui e mettilo in altra route // NEW - RETURN THE USER NAME AND THE USER ID OF THE AVAILABLE PROJECT-USER FOR THE PROJECT ID PASSED // router.get('/:projectid/users/availables', function (req, res) { // //winston.debug("PROJECT ROUTES FINDS AVAILABLES project_users: projectid", req.params.projectid); // if (req.query.raw && (req.query.raw === true || req.query.raw === 'true')) { // Project_user.find({ id_project: req.params.projectid, user_available: true, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}}). // populate('id_user'). // exec(function (err, project_users) { // if (err) { // winston.debug('PROJECT ROUTES - FINDS AVAILABLES project_users - ERROR: ', err); // return res.status(500).send({ success: false, msg: 'Error getting object.' }); // } // if (project_users) { // user_available_array = []; // project_users.forEach(project_user => { // if (project_user.id_user) { // // winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER: ', project_user) // user_available_array.push({ "id": project_user.id_user._id, "firstname": project_user.id_user.firstname }); // } else { // // winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER (else): ', project_user) // } // }); // //winston.debug('ARRAY OF THE AVAILABLE USER ', user_available_array); // res.json(user_available_array); // } // }); // } else { // operatingHoursService.projectIsOpenNow(req.params.projectid, function (isOpen, err) { // //winston.debug('P ---> [ OHS ] -> [ PROJECT ROUTES ] -> IS OPEN THE PROJECT: ', isOpen); // if (err) { // winston.debug('P ---> [ OHS ] -> [ PROJECT ROUTES ] -> IS OPEN THE PROJECT - EROR: ', err) // // sendError(err, res); // return res.status(500).send({ success: false, msg: err }); // } else if (isOpen) { // Project_user.find({ id_project: req.params.projectid, user_available: true, role: { $in : [RoleConstants.OWNER, RoleConstants.ADMIN, RoleConstants.SUPERVISOR, RoleConstants.AGENT]}}). // populate('id_user'). // exec(function (err, project_users) { // if (err) { // winston.debug('PROJECT ROUTES - FINDS AVAILABLES project_users - ERROR: ', err); // return res.status(500).send({ success: false, msg: 'Error getting object.' }); // } // if (project_users) { // user_available_array = []; // project_users.forEach(project_user => { // if (project_user.id_user) { // // winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER: ', project_user) // user_available_array.push({ "id": project_user.id_user._id, "firstname": project_user.id_user.firstname }); // } else { // // winston.debug('PROJECT ROUTES - AVAILABLES PROJECT-USER (else): ', project_user) // } // }); // //winston.debug('ARRAY OF THE AVAILABLE USER ', user_available_array); // res.json(user_available_array); // } // }); // } else { // // winston.debug('P ---> [ OHS ] -> [ PROJECT ROUTES ] -> IS OPEN THE PRJCT: ', isOpen, ' -> AVAILABLE EMPTY'); // // closed // user_available_array = []; // res.json(user_available_array); // } // }); // } // }); module.exports = router;