@tiledesk/tiledesk-server 2.9.31 → 2.9.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/package.json +2 -2
- package/routes/project.js +108 -1
- package/routes/request.js +85 -94
- package/test/projectRoute.js +41 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
🚀 IN PRODUCTION 🚀
|
|
6
6
|
(https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
|
|
7
7
|
|
|
8
|
+
# 2.9.32
|
|
9
|
+
- Added voice filters in get requests
|
|
10
|
+
- Added endpoint to get all projects
|
|
11
|
+
- Updated vxml-connector to 0.1.49
|
|
12
|
+
|
|
8
13
|
# 2.9.31
|
|
9
14
|
- Improved conversations queues management
|
|
10
15
|
- Added conversation status 150 (ABANDONED)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiledesk/tiledesk-server",
|
|
3
3
|
"description": "The Tiledesk server module",
|
|
4
|
-
"version": "2.9.
|
|
4
|
+
"version": "2.9.32",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"start": "node ./bin/www",
|
|
7
7
|
"pretest": "mongodb-runner start",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"@tiledesk/tiledesk-whatsapp-connector": "^0.1.73",
|
|
53
53
|
"@tiledesk/tiledesk-whatsapp-jobworker": "^0.0.8",
|
|
54
54
|
"@tiledesk/tiledesk-sms-connector": "^0.1.10",
|
|
55
|
-
"@tiledesk/tiledesk-vxml-connector": "^0.1.
|
|
55
|
+
"@tiledesk/tiledesk-vxml-connector": "^0.1.49",
|
|
56
56
|
"amqplib": "^0.5.5",
|
|
57
57
|
"app-root-path": "^3.0.0",
|
|
58
58
|
"bcrypt-nodejs": "0.0.3",
|
package/routes/project.js
CHANGED
|
@@ -13,7 +13,7 @@ var Group = require('../models/group');
|
|
|
13
13
|
|
|
14
14
|
var winston = require('../config/winston');
|
|
15
15
|
var roleChecker = require('../middleware/has-role');
|
|
16
|
-
|
|
16
|
+
var config = require('../config/database');
|
|
17
17
|
|
|
18
18
|
// THE THREE FOLLOWS IMPORTS ARE USED FOR AUTHENTICATION IN THE ROUTE
|
|
19
19
|
var passport = require('passport');
|
|
@@ -25,6 +25,24 @@ var orgUtil = require("../utils/orgUtil");
|
|
|
25
25
|
var cacheEnabler = require("../services/cacheEnabler");
|
|
26
26
|
var mongoose = require('mongoose');
|
|
27
27
|
|
|
28
|
+
var jwt = require('jsonwebtoken');
|
|
29
|
+
// CHECK IT ASAP!!!!
|
|
30
|
+
let configSecret = process.env.GLOBAL_SECRET || config.secret;
|
|
31
|
+
var pKey = process.env.GLOBAL_SECRET_OR_PRIVATE_KEY;
|
|
32
|
+
// console.log("pKey",pKey);
|
|
33
|
+
|
|
34
|
+
if (pKey) {
|
|
35
|
+
configSecret = pKey.replace(/\\n/g, '\n');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let pubConfigSecret = process.env.GLOBAL_SECRET || config.secret;
|
|
39
|
+
var pubKey = process.env.GLOBAL_SECRET_OR_PUB_KEY;
|
|
40
|
+
if (pubKey) {
|
|
41
|
+
pubConfigSecret = pubKey.replace(/\\n/g, '\n');
|
|
42
|
+
}
|
|
43
|
+
// CHECK IT ASAP!!!!
|
|
44
|
+
|
|
45
|
+
|
|
28
46
|
router.post('/', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], async (req, res) => {
|
|
29
47
|
|
|
30
48
|
// create(name, createdBy, settings)
|
|
@@ -735,6 +753,95 @@ Project.findByIdAndUpdate(req.params.projectid, { $pull: { bannedUsers: { "_id":
|
|
|
735
753
|
|
|
736
754
|
});
|
|
737
755
|
|
|
756
|
+
router.get('/all', [passport.authenticate(['basic', 'jwt'], { session: false }), validtoken], function (req, res) {
|
|
757
|
+
|
|
758
|
+
if (req.headers.authorization) {
|
|
759
|
+
|
|
760
|
+
let token = req.headers.authorization.split(" ")[1];
|
|
761
|
+
let decode = jwt.verify(token, pubConfigSecret)
|
|
762
|
+
if (decode && (decode.email === process.env.ADMIN_EMAIL)) {
|
|
763
|
+
|
|
764
|
+
Project.aggregate([
|
|
765
|
+
// {
|
|
766
|
+
// $match: {
|
|
767
|
+
// status: 100,
|
|
768
|
+
// //createdAt: { $gte: startDate}
|
|
769
|
+
// },
|
|
770
|
+
// },
|
|
771
|
+
{
|
|
772
|
+
$sort: {
|
|
773
|
+
createdAt: -1
|
|
774
|
+
},
|
|
775
|
+
},
|
|
776
|
+
{
|
|
777
|
+
$lookup: {
|
|
778
|
+
from: 'project_users',
|
|
779
|
+
localField: '_id',
|
|
780
|
+
foreignField: 'id_project',
|
|
781
|
+
as: 'project_user',
|
|
782
|
+
pipeline: [
|
|
783
|
+
{ $match: { role: 'owner' } }
|
|
784
|
+
]
|
|
785
|
+
}
|
|
786
|
+
},
|
|
787
|
+
{
|
|
788
|
+
$addFields: {
|
|
789
|
+
project_user: { $arrayElemAt: ['$project_user', 0] }
|
|
790
|
+
}
|
|
791
|
+
},
|
|
792
|
+
{
|
|
793
|
+
$lookup: {
|
|
794
|
+
from: 'users',
|
|
795
|
+
localField: 'project_user.id_user',
|
|
796
|
+
foreignField: '_id',
|
|
797
|
+
as: 'user'
|
|
798
|
+
},
|
|
799
|
+
},
|
|
800
|
+
{
|
|
801
|
+
$addFields: {
|
|
802
|
+
user: { $arrayElemAt: ['$user', 0] }
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
])
|
|
806
|
+
.then((projects) => {
|
|
807
|
+
winston.verbose("Projects found " + projects.length)
|
|
808
|
+
// const fieldsToKeep = ['_id', 'name', 'createdBy', 'createdAt', 'user.email' ];
|
|
809
|
+
|
|
810
|
+
const filteredProjects = projects.map(project => {
|
|
811
|
+
const filteredProject = {};
|
|
812
|
+
filteredProject._id = project._id;
|
|
813
|
+
filteredProject.name = project.name;
|
|
814
|
+
filteredProject.owner = project.user?.email;
|
|
815
|
+
filteredProject.createdAt = project.createdAt;
|
|
816
|
+
filteredProject.profile_name = project.profile?.name;
|
|
817
|
+
// ... add other fields here
|
|
818
|
+
|
|
819
|
+
// fieldsToKeep.forEach(field => {
|
|
820
|
+
// if (project[field] !== undefined) {
|
|
821
|
+
// filteredProject[field] = project[field];
|
|
822
|
+
// }
|
|
823
|
+
// });
|
|
824
|
+
return filteredProject;
|
|
825
|
+
});
|
|
826
|
+
|
|
827
|
+
return res.status(200).send(filteredProjects);
|
|
828
|
+
})
|
|
829
|
+
.catch((err) => {
|
|
830
|
+
console.error(err);
|
|
831
|
+
return res.status(500).send({ success: false, error: err});
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
// let updatedUser = await User.findByIdAndUpdate(savedUser._id, { emailverified: true }, { new: true }).exec();
|
|
835
|
+
// winston.debug("updatedUser: ", updatedUser);
|
|
836
|
+
// skipVerificationEmail = true;
|
|
837
|
+
// winston.verbose("skip sending verification email")
|
|
838
|
+
} else {
|
|
839
|
+
return res.status(403).send({ success: false, error: "You don't have the permission required to perform the operation"});
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
});
|
|
738
845
|
|
|
739
846
|
|
|
740
847
|
//roleChecker.hasRole('agent') works because req.params.projectid is valid using :projectid of this method
|
package/routes/request.js
CHANGED
|
@@ -884,7 +884,10 @@ router.get('/', function (req, res, next) {
|
|
|
884
884
|
|
|
885
885
|
var page = 0;
|
|
886
886
|
var limit = DEFAULT_LIMIT; // Number of request per page
|
|
887
|
+
var page = 0;
|
|
888
|
+
var skip = 0;
|
|
887
889
|
let statusArray = [];
|
|
890
|
+
var projectuser = req.projectuser;
|
|
888
891
|
|
|
889
892
|
if (req.query.limit) {
|
|
890
893
|
limit = parseInt(req.query.limit);
|
|
@@ -897,19 +900,16 @@ router.get('/', function (req, res, next) {
|
|
|
897
900
|
page = req.query.page;
|
|
898
901
|
}
|
|
899
902
|
|
|
900
|
-
|
|
901
|
-
winston.debug('REQUEST ROUTE - SKIP PAGE ', skip);
|
|
903
|
+
skip = page * limit;
|
|
902
904
|
|
|
903
|
-
// Default
|
|
905
|
+
// Default query
|
|
904
906
|
var query = { "id_project": req.projectid, "status": { $lt: 1000, $ne: 150 }, preflight: false };
|
|
905
907
|
|
|
906
|
-
var projectuser = req.projectuser;
|
|
907
|
-
|
|
908
908
|
if (req.user instanceof Subscription) {
|
|
909
|
-
//
|
|
909
|
+
// All request
|
|
910
910
|
} else if (projectuser && (projectuser.role == "owner" || projectuser.role == "admin")) {
|
|
911
|
-
//
|
|
912
|
-
//
|
|
911
|
+
// All request
|
|
912
|
+
// Per uni mostrare solo quelle proprie quindi solo participants
|
|
913
913
|
if (req.query.mine) {
|
|
914
914
|
query["$or"] = [{ "snapshot.agents.id_user": req.user.id }, { "participants": req.user.id }];
|
|
915
915
|
}
|
|
@@ -919,7 +919,6 @@ router.get('/', function (req, res, next) {
|
|
|
919
919
|
|
|
920
920
|
if (req.query.dept_id) {
|
|
921
921
|
query.department = req.query.dept_id;
|
|
922
|
-
winston.debug('REQUEST ROUTE - QUERY DEPT ID', query.department);
|
|
923
922
|
}
|
|
924
923
|
|
|
925
924
|
if (req.query.requester_email) {
|
|
@@ -927,27 +926,13 @@ router.get('/', function (req, res, next) {
|
|
|
927
926
|
}
|
|
928
927
|
|
|
929
928
|
if (req.query.full_text) {
|
|
930
|
-
winston.debug('req.query.fulltext', req.query.full_text);
|
|
931
929
|
query.$text = { "$search": req.query.full_text };
|
|
932
930
|
}
|
|
933
931
|
|
|
934
|
-
var history_search = false;
|
|
935
|
-
|
|
936
|
-
// if (req.query.status) {
|
|
937
|
-
// winston.debug('req.query.status', req.query.status);
|
|
938
|
-
// query.status = req.query.status;
|
|
939
|
-
|
|
940
|
-
// if (req.query.status == 1000 || req.query.status == "1000") {
|
|
941
|
-
// history_search = true;
|
|
942
|
-
// }
|
|
943
|
-
// if (req.query.status === "all") {
|
|
944
|
-
// history_search = true;
|
|
945
|
-
// delete query.status;
|
|
946
|
-
// }
|
|
947
|
-
// }
|
|
932
|
+
var history_search = false;
|
|
948
933
|
|
|
934
|
+
// Multiple status management
|
|
949
935
|
if (req.query.status) {
|
|
950
|
-
|
|
951
936
|
if (req.query.status === 'all') {
|
|
952
937
|
delete query.status;
|
|
953
938
|
} else {
|
|
@@ -961,40 +946,27 @@ router.get('/', function (req, res, next) {
|
|
|
961
946
|
delete query.status;
|
|
962
947
|
}
|
|
963
948
|
}
|
|
964
|
-
|
|
965
949
|
if (statusArray.length > 0) {
|
|
966
950
|
query.status = {
|
|
967
951
|
$in: statusArray
|
|
968
952
|
}
|
|
969
953
|
}
|
|
970
|
-
|
|
971
954
|
}
|
|
972
955
|
|
|
973
956
|
if (req.query.lead) {
|
|
974
|
-
winston.debug('req.query.lead', req.query.lead);
|
|
975
957
|
query.lead = req.query.lead;
|
|
976
958
|
}
|
|
977
959
|
|
|
978
960
|
// USERS & BOTS
|
|
979
961
|
if (req.query.participant) {
|
|
980
|
-
winston.debug('req.query.participant', req.query.participant);
|
|
981
962
|
query.participants = req.query.participant;
|
|
982
963
|
}
|
|
983
964
|
|
|
984
|
-
winston.debug('req.query.hasbot', req.query.hasbot);
|
|
985
965
|
if (req.query.hasbot != undefined) {
|
|
986
|
-
winston.debug('req.query.hasbot', req.query.hasbot);
|
|
987
966
|
query.hasBot = req.query.hasbot;
|
|
988
967
|
}
|
|
989
968
|
|
|
990
|
-
// if (req.query.waiting_time_exists) { //non basta aggiungi anche che nn è null
|
|
991
|
-
// query.waiting_time = {"$exists": req.query.waiting_time_exists} //{$ne:null}
|
|
992
|
-
// winston.debug('REQUEST ROUTE - QUERY waiting_time_exists', query.waiting_time_exists);
|
|
993
|
-
// }
|
|
994
|
-
|
|
995
|
-
|
|
996
969
|
if (req.query.tags) {
|
|
997
|
-
winston.debug('req.query.tags', req.query.tags);
|
|
998
970
|
query["tags.tag"] = req.query.tags;
|
|
999
971
|
}
|
|
1000
972
|
|
|
@@ -1026,9 +998,7 @@ router.get('/', function (req, res, next) {
|
|
|
1026
998
|
//fixato. secondo me qui manca un parentesi tonda per gli or
|
|
1027
999
|
if (history_search === true && req.project && req.project.profile && ((req.project.profile.type === 'free' && req.project.trialExpired === true) || (req.project.profile.type === 'payment' && req.project.isActiveSubscription === false))) {
|
|
1028
1000
|
|
|
1029
|
-
|
|
1030
1001
|
var startdate = moment().subtract(14, "days").format("YYYY-MM-DD");
|
|
1031
|
-
|
|
1032
1002
|
var enddate = moment().format("YYYY-MM-DD");
|
|
1033
1003
|
|
|
1034
1004
|
winston.debug('»»» REQUEST ROUTE - startdate ', startdate);
|
|
@@ -1037,11 +1007,8 @@ router.get('/', function (req, res, next) {
|
|
|
1037
1007
|
var enddatePlusOneDay = moment(new Date()).add(1, 'days').toDate()
|
|
1038
1008
|
winston.debug('»»» REQUEST ROUTE - enddate + 1 days: ', enddatePlusOneDay);
|
|
1039
1009
|
|
|
1040
|
-
// var enddatePlusOneDay = "2019-09-17T00:00:00.000Z"
|
|
1041
|
-
|
|
1042
1010
|
query.createdAt = { $gte: new Date(Date.parse(startdate)).toISOString(), $lte: new Date(enddatePlusOneDay).toISOString() }
|
|
1043
1011
|
winston.debug('REQUEST ROUTE - QUERY CREATED AT ', query.createdAt);
|
|
1044
|
-
|
|
1045
1012
|
}
|
|
1046
1013
|
|
|
1047
1014
|
/**
|
|
@@ -1072,9 +1039,6 @@ router.get('/', function (req, res, next) {
|
|
|
1072
1039
|
var newdate = new Date(date);
|
|
1073
1040
|
var endDate_plusOneDay = newdate.setDate(newdate.getDate() + 1);
|
|
1074
1041
|
winston.debug('REQUEST ROUTE - REQ QUERY FORMATTED END DATE + 1 DAY ', endDate_plusOneDay);
|
|
1075
|
-
// var endDate_plusOneDay = moment('2018-09-03').add(1, 'd')
|
|
1076
|
-
// var endDate_plusOneDay = endDate.add(1).day();
|
|
1077
|
-
// var toDate = new Date(Date.parse(endDate_plusOneDay)).toISOString()
|
|
1078
1042
|
|
|
1079
1043
|
query.createdAt = { $gte: new Date(Date.parse(startDate)).toISOString(), $lte: new Date(endDate_plusOneDay).toISOString() }
|
|
1080
1044
|
winston.debug('REQUEST ROUTE - QUERY CREATED AT ', query.createdAt);
|
|
@@ -1092,44 +1056,34 @@ router.get('/', function (req, res, next) {
|
|
|
1092
1056
|
|
|
1093
1057
|
winston.debug('REQUEST ROUTE - QUERY CREATED AT (only for start date)', query.createdAt);
|
|
1094
1058
|
}
|
|
1095
|
-
// }
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
1059
|
|
|
1099
1060
|
if (req.query.snap_department_routing) {
|
|
1100
1061
|
query["snapshot.department.routing"] = req.query.snap_department_routing;
|
|
1101
|
-
winston.debug('REQUEST ROUTE - QUERY snap_department_routing', query.snap_department_routing);
|
|
1102
1062
|
}
|
|
1103
1063
|
|
|
1104
1064
|
if (req.query.snap_department_default) {
|
|
1105
1065
|
query["snapshot.department.default"] = req.query.snap_department_default;
|
|
1106
|
-
winston.debug('REQUEST ROUTE - QUERY snap_department_default', query.snap_department_default);
|
|
1107
1066
|
}
|
|
1108
1067
|
|
|
1109
1068
|
|
|
1110
1069
|
if (req.query.snap_department_id_bot) {
|
|
1111
1070
|
query["snapshot.department.id_bot"] = req.query.snap_department_id_bot;
|
|
1112
|
-
winston.debug('REQUEST ROUTE - QUERY snap_department_id_bot', query.snap_department_id_bot);
|
|
1113
1071
|
}
|
|
1114
1072
|
|
|
1115
1073
|
if (req.query.snap_department_id_bot_exists) {
|
|
1116
1074
|
query["snapshot.department.id_bot"] = { "$exists": req.query.snap_department_id_bot_exists }
|
|
1117
|
-
winston.debug('REQUEST ROUTE - QUERY snap_department_id_bot_exists', query.snap_department_id_bot_exists);
|
|
1118
1075
|
}
|
|
1119
1076
|
|
|
1120
1077
|
if (req.query.snap_lead_lead_id) {
|
|
1121
1078
|
query["snapshot.lead.lead_id"] = req.query.snap_lead_lead_id;
|
|
1122
|
-
winston.debug('REQUEST ROUTE - QUERY snap_lead_lead_id', query.snap_lead_lead_id);
|
|
1123
1079
|
}
|
|
1124
1080
|
|
|
1125
1081
|
if (req.query.snap_lead_email) {
|
|
1126
1082
|
query["snapshot.lead.email"] = req.query.snap_lead_email;
|
|
1127
|
-
winston.debug('REQUEST ROUTE - QUERY snap_lead_email', query.snap_lead_email);
|
|
1128
1083
|
}
|
|
1129
1084
|
|
|
1130
1085
|
if (req.query.smartAssignment) {
|
|
1131
1086
|
query.smartAssignment = req.query.smartAssignment;
|
|
1132
|
-
winston.debug('REQUEST ROUTE - QUERY smartAssignment', query.smartAssignment);
|
|
1133
1087
|
}
|
|
1134
1088
|
|
|
1135
1089
|
if (req.query.channel) {
|
|
@@ -1140,8 +1094,6 @@ router.get('/', function (req, res, next) {
|
|
|
1140
1094
|
} else {
|
|
1141
1095
|
query["channel.name"] = req.query.channel
|
|
1142
1096
|
}
|
|
1143
|
-
|
|
1144
|
-
winston.debug('REQUEST ROUTE - QUERY channel', query.channel);
|
|
1145
1097
|
}
|
|
1146
1098
|
|
|
1147
1099
|
if (req.query.priority) {
|
|
@@ -1153,17 +1105,37 @@ router.get('/', function (req, res, next) {
|
|
|
1153
1105
|
if (req.query.direction) {
|
|
1154
1106
|
direction = req.query.direction;
|
|
1155
1107
|
}
|
|
1156
|
-
winston.debug("direction", direction);
|
|
1157
1108
|
|
|
1158
1109
|
var sortField = "createdAt";
|
|
1159
1110
|
if (req.query.sort) {
|
|
1160
1111
|
sortField = req.query.sort;
|
|
1161
1112
|
}
|
|
1162
|
-
winston.debug("sortField", sortField);
|
|
1163
1113
|
|
|
1164
1114
|
var sortQuery = {};
|
|
1165
1115
|
sortQuery[sortField] = direction;
|
|
1166
|
-
|
|
1116
|
+
|
|
1117
|
+
// VOICE FILTERS - Start
|
|
1118
|
+
if (req.query.caller) {
|
|
1119
|
+
query["attributes.caller_phone"] = req.query.caller;
|
|
1120
|
+
}
|
|
1121
|
+
if (req.query.called) {
|
|
1122
|
+
query["attributes.called_phone"] = req.query.called;
|
|
1123
|
+
}
|
|
1124
|
+
if (req.query.call_id) {
|
|
1125
|
+
query["attributes.call_id"] = req.query.call_id;
|
|
1126
|
+
}
|
|
1127
|
+
// VOICE FILTERS - End
|
|
1128
|
+
|
|
1129
|
+
if (req.query.duration && req.query.duration_op) {
|
|
1130
|
+
let duration = Number(req.query.duration) * 60 * 1000;
|
|
1131
|
+
if (req.query.duration_op === 'gt') {
|
|
1132
|
+
query.duration = { $gte: duration }
|
|
1133
|
+
} else if (req.query.duration_op === 'lt') {
|
|
1134
|
+
query.duration = { $lte: duration }
|
|
1135
|
+
} else {
|
|
1136
|
+
winston.verbose("Duration operator can be 'gt' or 'lt'. Skip duration_op " + req.query.duration_op)
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1167
1139
|
|
|
1168
1140
|
if (req.query.abandonded && (req.query.abandoned === true || req.query.abandoned === 'true')) {
|
|
1169
1141
|
query["attributes.fully_abandoned"] = true
|
|
@@ -1173,26 +1145,21 @@ router.get('/', function (req, res, next) {
|
|
|
1173
1145
|
query.draft = { $in: [false, null] }
|
|
1174
1146
|
}
|
|
1175
1147
|
|
|
1176
|
-
winston.debug('REQUEST ROUTE - REQUEST FIND ', query);
|
|
1177
|
-
|
|
1178
1148
|
var projection = undefined;
|
|
1179
1149
|
|
|
1180
1150
|
if (req.query.full_text) {
|
|
1181
|
-
|
|
1182
1151
|
if (req.query.no_textscore != "true" && req.query.no_textscore != true) {
|
|
1183
|
-
winston.
|
|
1152
|
+
winston.verbose('fulltext projection on');
|
|
1184
1153
|
projection = { score: { $meta: "textScore" } };
|
|
1185
1154
|
}
|
|
1186
|
-
|
|
1187
1155
|
}
|
|
1188
|
-
|
|
1156
|
+
|
|
1157
|
+
winston.verbose('REQUEST ROUTE - REQUEST FIND QUERY ', query);
|
|
1158
|
+
|
|
1189
1159
|
var q1 = Request.find(query, projection).
|
|
1190
1160
|
skip(skip).limit(limit);
|
|
1191
1161
|
|
|
1192
|
-
winston.debug('REQUEST ROUTE no_populate:' + req.query.no_populate);
|
|
1193
|
-
|
|
1194
1162
|
if (req.query.no_populate != "true" && req.query.no_populate != true) {
|
|
1195
|
-
winston.verbose('REQUEST ROUTE - no_polutate false ', req.headers);
|
|
1196
1163
|
q1.populate('department').
|
|
1197
1164
|
populate('participatingBots'). //nico già nn gli usa
|
|
1198
1165
|
populate('participatingAgents'). //nico già nn gli usa
|
|
@@ -1200,17 +1167,7 @@ router.get('/', function (req, res, next) {
|
|
|
1200
1167
|
populate({ path: 'requester', populate: { path: 'id_user' } }); //toglilo perche nico lo prende già da snapshot
|
|
1201
1168
|
}
|
|
1202
1169
|
|
|
1203
|
-
// cache(cacheUtil.defaultTTL, "requests-"+projectId).
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
// if (req.query.select_snapshot) {
|
|
1207
|
-
// winston.info('select_snapshot');
|
|
1208
|
-
// q1.select("+snapshot");
|
|
1209
|
-
// // q1.select({ "snapshot": 1});
|
|
1210
|
-
// }
|
|
1211
|
-
|
|
1212
1170
|
if (req.query.full_text) {
|
|
1213
|
-
winston.debug('fulltext sort');
|
|
1214
1171
|
if (req.query.no_textscore != "true" && req.query.no_textscore != true) {
|
|
1215
1172
|
q1.sort({ score: { $meta: "textScore" } }) //https://docs.mongodb.com/manual/reference/operator/query/text/#sort-by-text-search-score
|
|
1216
1173
|
}
|
|
@@ -1218,10 +1175,6 @@ router.get('/', function (req, res, next) {
|
|
|
1218
1175
|
q1.sort(sortQuery);
|
|
1219
1176
|
}
|
|
1220
1177
|
|
|
1221
|
-
|
|
1222
|
-
// winston.info('q1',q1);
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
1178
|
q1.exec();
|
|
1226
1179
|
|
|
1227
1180
|
// TODO if ?onlycount=true do not perform find query but only
|
|
@@ -1234,10 +1187,7 @@ router.get('/', function (req, res, next) {
|
|
|
1234
1187
|
q2 = 0;
|
|
1235
1188
|
}
|
|
1236
1189
|
|
|
1237
|
-
var promises = [
|
|
1238
|
-
q1,
|
|
1239
|
-
q2
|
|
1240
|
-
];
|
|
1190
|
+
var promises = [ q1, q2 ];
|
|
1241
1191
|
|
|
1242
1192
|
Promise.all(promises).then(function (results) {
|
|
1243
1193
|
var objectToReturn = {
|
|
@@ -1664,11 +1614,6 @@ router.get('/csv', function (req, res, next) {
|
|
|
1664
1614
|
query.$text = { "$search": req.query.full_text };
|
|
1665
1615
|
}
|
|
1666
1616
|
|
|
1667
|
-
// if (req.query.status) {
|
|
1668
|
-
// winston.debug('req.query.status', req.query.status);
|
|
1669
|
-
// query.status = req.query.status;
|
|
1670
|
-
// }
|
|
1671
|
-
|
|
1672
1617
|
if (req.query.status) {
|
|
1673
1618
|
|
|
1674
1619
|
if (req.query.status === 'all') {
|
|
@@ -1776,6 +1721,27 @@ router.get('/csv', function (req, res, next) {
|
|
|
1776
1721
|
|
|
1777
1722
|
winston.debug("sort query", sortQuery);
|
|
1778
1723
|
|
|
1724
|
+
if (req.query.channel) {
|
|
1725
|
+
if (req.query.channel === "offline") {
|
|
1726
|
+
query["channel.name"] = { "$in": ["email", "form"] }
|
|
1727
|
+
} else if (req.query.channel === "online") {
|
|
1728
|
+
query["channel.name"] = { "$nin": ["email", "form"] }
|
|
1729
|
+
} else {
|
|
1730
|
+
query["channel.name"] = req.query.channel
|
|
1731
|
+
}
|
|
1732
|
+
}
|
|
1733
|
+
|
|
1734
|
+
// VOICE FILTERS - Start
|
|
1735
|
+
if (req.query.caller) {
|
|
1736
|
+
query["attributes.caller_phone"] = req.query.caller;
|
|
1737
|
+
}
|
|
1738
|
+
if (req.query.called) {
|
|
1739
|
+
query["attributes.called_phone"] = req.query.called;
|
|
1740
|
+
}
|
|
1741
|
+
if (req.query.call_id) {
|
|
1742
|
+
query["attributes.call_id"] = req.query.call_id;
|
|
1743
|
+
}
|
|
1744
|
+
// VOICE FILTERS - End
|
|
1779
1745
|
|
|
1780
1746
|
// TODO ORDER BY SCORE
|
|
1781
1747
|
// return Faq.find(query, {score: { $meta: "textScore" } })
|
|
@@ -1783,6 +1749,21 @@ router.get('/csv', function (req, res, next) {
|
|
|
1783
1749
|
|
|
1784
1750
|
// aggiungi filtro per data marco
|
|
1785
1751
|
|
|
1752
|
+
if (req.query.duration && req.query.duration_op) {
|
|
1753
|
+
let duration = Number(req.query.duration) * 60 * 1000;
|
|
1754
|
+
if (req.query.duration_op === 'gt') {
|
|
1755
|
+
query.duration = { $gte: duration }
|
|
1756
|
+
} else if (req.query.duration_op === 'lt') {
|
|
1757
|
+
query.duration = { $lte: duration }
|
|
1758
|
+
} else {
|
|
1759
|
+
winston.verbose("Duration operator can be 'gt' or 'lt'. Skip duration_op " + req.query.duration_op)
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
if (req.query.draft && (req.query.draft === 'false' || req.query.draft === false)) {
|
|
1764
|
+
query.draft = { $in: [false, null] }
|
|
1765
|
+
}
|
|
1766
|
+
|
|
1786
1767
|
winston.debug('REQUEST ROUTE - REQUEST FIND ', query)
|
|
1787
1768
|
return Request.find(query, '-transcript -status -__v').
|
|
1788
1769
|
skip(skip).limit(limit).
|
|
@@ -1860,7 +1841,17 @@ router.get('/csv', function (req, res, next) {
|
|
|
1860
1841
|
// // da terminare e testare. potrebbe essere troppo lenta la query per tanti record
|
|
1861
1842
|
// element.participatingAgents = participatingAgents;
|
|
1862
1843
|
|
|
1863
|
-
|
|
1844
|
+
if (element.attributes) {
|
|
1845
|
+
if (element.attributes.caller_phone) {
|
|
1846
|
+
element.caller_phone = element.attributes.caller_phone;
|
|
1847
|
+
}
|
|
1848
|
+
if (element.attributes.called_phone) {
|
|
1849
|
+
element.called_phone = element.attributes.called_phone;
|
|
1850
|
+
}
|
|
1851
|
+
if (element.attributes.caller_phone) {
|
|
1852
|
+
element.call_id = element.attributes.call_id;
|
|
1853
|
+
}
|
|
1854
|
+
}
|
|
1864
1855
|
|
|
1865
1856
|
delete element.lead;
|
|
1866
1857
|
|
package/test/projectRoute.js
CHANGED
|
@@ -50,6 +50,47 @@ describe('ProjectRoute', () => {
|
|
|
50
50
|
|
|
51
51
|
describe('/create', () => {
|
|
52
52
|
|
|
53
|
+
it('getAllProjectsWithSuperAdminCredential', (done) => {
|
|
54
|
+
|
|
55
|
+
var email = "test-signup-" + Date.now() + "@email.com";
|
|
56
|
+
var pwd = "pwd";
|
|
57
|
+
|
|
58
|
+
userService.signup(email, pwd, "Test Firstname", "Test Lastname").then((savedUser) => {
|
|
59
|
+
projectService.create("test-project-create-1", savedUser._id).then(() => {
|
|
60
|
+
projectService.create("test-project-create-2", savedUser._id).then((savedProject2) => {
|
|
61
|
+
|
|
62
|
+
chai.request(server)
|
|
63
|
+
.post('/auth/signin')
|
|
64
|
+
.send({ email: "admin@tiledesk.com", password: "adminadmin" })
|
|
65
|
+
// .send({ email: email, password: pwd }) // con queste credenziali non si può fare la richiesta /projects/all
|
|
66
|
+
.end((err, res) => {
|
|
67
|
+
|
|
68
|
+
if (log) { console.log("login with superadmin res.body: ", res.body) };
|
|
69
|
+
res.should.have.status(200);
|
|
70
|
+
res.body.should.be.a('object');
|
|
71
|
+
expect(res.body.success).to.equal(true);
|
|
72
|
+
expect(res.body.token).not.equal(null);
|
|
73
|
+
|
|
74
|
+
let superadmin_token = res.body.token;
|
|
75
|
+
|
|
76
|
+
chai.request(server)
|
|
77
|
+
.get('/projects/all')
|
|
78
|
+
.set('Authorization', superadmin_token)
|
|
79
|
+
.end((err, res) => {
|
|
80
|
+
|
|
81
|
+
console.log("res.body: ", res.body.length);
|
|
82
|
+
console.log("example: ", res.body[0]);
|
|
83
|
+
res.should.have.status(200);
|
|
84
|
+
res.body.should.be.a('array');
|
|
85
|
+
|
|
86
|
+
done()
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
}).timeout(10000)
|
|
93
|
+
|
|
53
94
|
it('updateProjectProfileWithSuperAdminCredential', (done) => {
|
|
54
95
|
|
|
55
96
|
var email = "test-signup-" + Date.now() + "@email.com";
|