@plusscommunities/pluss-maintenance-aws 2.1.44 → 2.1.46
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/createJob.js +201 -114
- package/createJobType.js +49 -49
- package/db/maintenance/addMaintenanceJob.js +100 -90
- package/db/maintenance/editMaintenanceJob.js +22 -12
- package/db/maintenance/getJobEmail.js +22 -22
- package/deleteJob.js +58 -58
- package/deleteJobType.js +40 -40
- package/editJob.js +126 -65
- package/editJobStatus.js +57 -57
- package/editJobType.js +61 -61
- package/editNote.js +117 -117
- package/feature.config.js +279 -262
- package/getData.js +48 -41
- package/getJob.js +4 -4
- package/getJobType.js +35 -35
- package/getJobTypes.js +66 -66
- package/getJobs.js +48 -48
- package/integration/IntegrationStrategy.js +52 -52
- package/integration/archibus/ArchibusStrategy.js +42 -28
- package/integration/index.js +19 -19
- package/jobChanged.js +88 -89
- package/jobTypesChanged.js +52 -39
- package/package.json +3 -3
- package/requests/assignRequest.js +81 -81
- package/requests/getAssignees.js +27 -27
- package/requests/getExternalSync.js +100 -100
- package/requests/getPropertyRequests.js +89 -0
- package/requests/getRequest.js +77 -77
- package/requests/getRequests.js +210 -144
- package/requests/helper/hasRequestPermission.js +12 -12
- package/requests/helper/isValidAssignee.js +10 -10
- package/requests/retrySync.js +90 -90
- package/requests/setExternalJobId.js +113 -113
- package/requests/updatePriority.js +33 -33
- package/scheduleJobImport.js +63 -63
- package/sendJobEmail.js +105 -104
- package/updateData.js +34 -34
- package/values.config.a.js +26 -25
- package/values.config.default.js +30 -28
- package/values.config.enquiry.js +222 -221
- package/values.config.feedback.js +194 -193
- package/values.config.food.js +29 -28
- package/values.config.forms.js +29 -28
- package/values.config.js +30 -28
- package/watchJobs.js +154 -154
package/jobChanged.js
CHANGED
|
@@ -12,27 +12,27 @@ const { values } = require("./values.config");
|
|
|
12
12
|
const marshaller = new Marshaller();
|
|
13
13
|
|
|
14
14
|
const pushRequestToIntegration = async (request) => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
const integrationStrategy = await getStrategy(request.site);
|
|
16
|
+
// const mockRes = {
|
|
17
|
+
// data: { wrId: moment().valueOf() },
|
|
18
|
+
// };
|
|
19
|
+
// await integrationStrategy.createRequest(request, mockRes);
|
|
20
|
+
await integrationStrategy.createRequest(request);
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
const onStatusChanged = async (request) => {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
const integrationStrategy = await getStrategy(request.site);
|
|
25
|
+
await integrationStrategy.onStatusChanged(request);
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
const onCommentAdded = async (request) => {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const integrationStrategy = await getStrategy(request.site);
|
|
30
|
+
await integrationStrategy.onCommentAdded(request);
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
const onNotesAdded = async (request) => {
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
const integrationStrategy = await getStrategy(request.site);
|
|
35
|
+
await integrationStrategy.onNotesAdded(request);
|
|
36
36
|
};
|
|
37
37
|
|
|
38
38
|
/**
|
|
@@ -41,87 +41,86 @@ const onNotesAdded = async (request) => {
|
|
|
41
41
|
* @param {Object} prevRequest The previous request data
|
|
42
42
|
*/
|
|
43
43
|
const checkIntegrationActions = async (request, prevRequest) => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
});
|
|
73
|
-
await onNotesAdded(request);
|
|
74
|
-
}
|
|
44
|
+
if ((request.ExtCreateRetry ?? 0) > (prevRequest.ExtCreateRetry ?? 0)) {
|
|
45
|
+
log("checkIntegrationActions", "Retrying", true);
|
|
46
|
+
await pushRequestToIntegration(request);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (request.status !== prevRequest.status) {
|
|
50
|
+
log("checkIntegrationActions", "StatusChanaged", {
|
|
51
|
+
new: request.status,
|
|
52
|
+
old: prevRequest.status,
|
|
53
|
+
});
|
|
54
|
+
await onStatusChanged(request);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (request.commentCount > prevRequest.commentCount) {
|
|
58
|
+
log("checkIntegrationActions", "CommentCountChanged", {
|
|
59
|
+
new: request.commentCount,
|
|
60
|
+
old: prevRequest.commentCount,
|
|
61
|
+
});
|
|
62
|
+
await onCommentAdded(request);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if ((request.Notes ?? []).length > (prevRequest.Notes ?? []).length) {
|
|
66
|
+
log("checkIntegrationActions", "NotesAdded", {
|
|
67
|
+
new: (request.Notes ?? []).length,
|
|
68
|
+
old: (prevRequest.Notes ?? []).length,
|
|
69
|
+
});
|
|
70
|
+
await onNotesAdded(request);
|
|
71
|
+
}
|
|
75
72
|
};
|
|
76
73
|
|
|
77
74
|
const checkAutomatedActions = async (request, prevRequest) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
75
|
+
if (request.status !== prevRequest.status) {
|
|
76
|
+
log("checkAutomatedActions", "StatusChanaged", {
|
|
77
|
+
new: request.status,
|
|
78
|
+
old: prevRequest.status,
|
|
79
|
+
});
|
|
80
|
+
await triggerAutomatedAction(
|
|
81
|
+
request.site,
|
|
82
|
+
values.triggerMaintenanceStatusChanged,
|
|
83
|
+
{
|
|
84
|
+
JobNumber: request.jobNo,
|
|
85
|
+
status: request.status,
|
|
86
|
+
},
|
|
87
|
+
);
|
|
88
|
+
}
|
|
92
89
|
};
|
|
93
90
|
|
|
91
|
+
module.exports.checkIntegrationActions = checkIntegrationActions;
|
|
92
|
+
|
|
94
93
|
module.exports.jobChanged = (event, context, callback) => {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
94
|
+
init(config);
|
|
95
|
+
|
|
96
|
+
event.Records.forEach((record) => {
|
|
97
|
+
let site;
|
|
98
|
+
if (record.eventName === "INSERT") {
|
|
99
|
+
console.log("INSERT");
|
|
100
|
+
const data = marshaller.unmarshallItem(record.dynamodb.NewImage);
|
|
101
|
+
console.log("Record: ", JSON.stringify(data));
|
|
102
|
+
|
|
103
|
+
site = data.site;
|
|
104
|
+
|
|
105
|
+
pushRequestToIntegration(data);
|
|
106
|
+
} else if (record.eventName === "MODIFY") {
|
|
107
|
+
console.log("MODIFY");
|
|
108
|
+
const data = marshaller.unmarshallItem(record.dynamodb.NewImage);
|
|
109
|
+
const previousData = marshaller.unmarshallItem(record.dynamodb.OldImage);
|
|
110
|
+
console.log("New record: ", JSON.stringify(data));
|
|
111
|
+
console.log("Old record: ", JSON.stringify(previousData));
|
|
112
|
+
|
|
113
|
+
checkIntegrationActions(data, previousData);
|
|
114
|
+
checkAutomatedActions(data, previousData);
|
|
115
|
+
|
|
116
|
+
site = data.site;
|
|
117
|
+
} else if (record.eventName === "REMOVE") {
|
|
118
|
+
console.log("REMOVE");
|
|
119
|
+
const previousData = marshaller.unmarshallItem(record.dynamodb.OldImage);
|
|
120
|
+
console.log("Old record: ", JSON.stringify(previousData));
|
|
121
|
+
|
|
122
|
+
site = previousData.site;
|
|
123
|
+
}
|
|
124
|
+
logUpdate(site, values.updateKey);
|
|
125
|
+
});
|
|
127
126
|
};
|
package/jobTypesChanged.js
CHANGED
|
@@ -13,43 +13,56 @@ const notifySiteConfigs = require("@plusscommunities/pluss-core-aws/helper/notif
|
|
|
13
13
|
const { values } = require("./values.config");
|
|
14
14
|
|
|
15
15
|
module.exports.jobTypesChanged = async (event, context, callback) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
16
|
+
const logId = log("jobTypesChanged", "Start", {
|
|
17
|
+
recordCount: event.Records.length,
|
|
18
|
+
serviceKey: values.serviceKey,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Check if this variant supports siteConfigs propagation
|
|
22
|
+
if (!values.enableSiteConfigsPropagation) {
|
|
23
|
+
log(
|
|
24
|
+
"jobTypesChanged",
|
|
25
|
+
"SkipPropagation",
|
|
26
|
+
{ serviceKey: values.serviceKey },
|
|
27
|
+
logId,
|
|
28
|
+
);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const promises = [];
|
|
33
|
+
|
|
34
|
+
event.Records.forEach((record) => {
|
|
35
|
+
log("jobTypesChanged", "Record", { eventName: record.eventName }, logId);
|
|
36
|
+
|
|
37
|
+
if (record.eventName === "INSERT") {
|
|
38
|
+
const data = marshaller.unmarshallItem(record.dynamodb.NewImage);
|
|
39
|
+
log("jobTypesChanged", "Insert", { id: data.id, site: data.site }, logId);
|
|
40
|
+
|
|
41
|
+
if (data.site) {
|
|
42
|
+
promises.push(notifySiteConfigs(data.site, logId));
|
|
43
|
+
}
|
|
44
|
+
} else if (record.eventName === "MODIFY") {
|
|
45
|
+
const data = marshaller.unmarshallItem(record.dynamodb.NewImage);
|
|
46
|
+
log("jobTypesChanged", "Modify", { id: data.id, site: data.site }, logId);
|
|
47
|
+
|
|
48
|
+
if (data.site) {
|
|
49
|
+
promises.push(notifySiteConfigs(data.site, logId));
|
|
50
|
+
}
|
|
51
|
+
} else if (record.eventName === "REMOVE") {
|
|
52
|
+
const previousData = marshaller.unmarshallItem(record.dynamodb.OldImage);
|
|
53
|
+
log(
|
|
54
|
+
"jobTypesChanged",
|
|
55
|
+
"Remove",
|
|
56
|
+
{ id: previousData.id, site: previousData.site },
|
|
57
|
+
logId,
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
if (previousData.site) {
|
|
61
|
+
promises.push(notifySiteConfigs(previousData.site, logId));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await Promise.all(promises);
|
|
67
|
+
log("jobTypesChanged", "Complete", { promiseCount: promises.length }, logId);
|
|
55
68
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plusscommunities/pluss-maintenance-aws",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.46",
|
|
4
4
|
"description": "Extension package to enable maintenance on Pluss Communities Platform",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"gc": "node ../../tools/gc ./",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"license": "ISC",
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@aws/dynamodb-auto-marshaller": "^0.7.1",
|
|
27
|
-
"@plusscommunities/pluss-core-aws": "2.0.
|
|
27
|
+
"@plusscommunities/pluss-core-aws": "2.0.27",
|
|
28
28
|
"amazon-cognito-identity-js": "^2.0.19",
|
|
29
29
|
"aws-sdk": "^2.1591.0",
|
|
30
30
|
"axios": "^1.6.8",
|
|
@@ -61,4 +61,4 @@
|
|
|
61
61
|
"^./testing/(.*)$": "<rootDir>/testing/$1"
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
}
|
|
64
|
+
}
|
|
@@ -10,97 +10,97 @@ const publishNotifications = require("@plusscommunities/pluss-core-aws/db/notifi
|
|
|
10
10
|
const { values } = require("../values.config");
|
|
11
11
|
|
|
12
12
|
module.exports = async (event, data) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
const logId = log("assignRequest", "data", data);
|
|
14
|
+
// check required data
|
|
15
|
+
const requiredKeys = ["id", "userId"];
|
|
16
|
+
if (!data || requiredKeys.some((prop) => !data.hasOwnProperty(prop))) {
|
|
17
|
+
log("assignRequest", "InsufficientInput", 422, logId);
|
|
18
|
+
return { status: 422, data: { error: "Insufficient input" } };
|
|
19
|
+
}
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
const request = await getRef(values.tableNameMaintenance, "id", data.id);
|
|
22
|
+
log("assignRequest", "request", request, logId);
|
|
23
|
+
log("assignRequest", "site", request.site, logId);
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
25
|
+
// validate authorisation
|
|
26
|
+
const valid = await validateMasterAuth(
|
|
27
|
+
event,
|
|
28
|
+
values.permissionMaintenanceTracking,
|
|
29
|
+
request.site,
|
|
30
|
+
);
|
|
31
|
+
log("assignRequest", "valid", valid, logId);
|
|
32
|
+
if (!valid) {
|
|
33
|
+
const validAssignee = await isValidAssignee(
|
|
34
|
+
event,
|
|
35
|
+
request.site,
|
|
36
|
+
request.AssigneeId,
|
|
37
|
+
);
|
|
38
|
+
log("assignRequest", "validAssignee", validAssignee, logId);
|
|
39
|
+
if (!validAssignee) {
|
|
40
|
+
log("assignRequest", "NotAuthorised", 403, logId);
|
|
41
|
+
return { status: 403, data: { error: "Not authorised" } };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
const user = await getUserPreviewFromReq(event);
|
|
46
|
+
log("assignRequest", "user", user, logId);
|
|
47
|
+
const assignedUser = await getUserPreview(data.userId);
|
|
48
|
+
log("assignRequest", "assignedUser", assignedUser, logId);
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
const changes = {
|
|
51
|
+
history: request.history || [],
|
|
52
|
+
};
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
54
|
+
// Update history
|
|
55
|
+
changes.history.push({
|
|
56
|
+
timestamp: moment.utc().valueOf(),
|
|
57
|
+
EntryType: "assignment",
|
|
58
|
+
user,
|
|
59
|
+
assignedUser,
|
|
60
|
+
});
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
changes.AssigneeId = data.userId;
|
|
63
|
+
changes.Assignee = assignedUser;
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
log("assignRequest", "changes", changes, logId);
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
67
|
+
const result = await editRef(
|
|
68
|
+
values.tableNameMaintenance,
|
|
69
|
+
"id",
|
|
70
|
+
data.id,
|
|
71
|
+
changes,
|
|
72
|
+
);
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
log("assignRequest", "result", result, logId);
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
76
|
+
// send notification to assigned user
|
|
77
|
+
if (user.id !== assignedUser.id) {
|
|
78
|
+
await publishNotifications(
|
|
79
|
+
[assignedUser.id],
|
|
80
|
+
values.notificationMaintenanceJobAssigned,
|
|
81
|
+
result.site,
|
|
82
|
+
result.id,
|
|
83
|
+
result,
|
|
84
|
+
true,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
87
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
88
|
+
// send notification to previous assignee
|
|
89
|
+
if (request.AssigneeId && result.AssigneeId !== request.AssigneeId) {
|
|
90
|
+
await publishNotifications(
|
|
91
|
+
[request.AssigneeId],
|
|
92
|
+
values.notificationMaintenanceJobUnassigned,
|
|
93
|
+
result.site,
|
|
94
|
+
result.id,
|
|
95
|
+
result,
|
|
96
|
+
true,
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
return {
|
|
101
|
+
status: 200,
|
|
102
|
+
data: {
|
|
103
|
+
job: result,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
106
|
};
|
package/requests/getAssignees.js
CHANGED
|
@@ -5,36 +5,36 @@ const { values } = require("../values.config");
|
|
|
5
5
|
|
|
6
6
|
// Define the new function to get assignees
|
|
7
7
|
module.exports = async (event) => {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
const qParams = event.queryStringParameters || {};
|
|
9
|
+
const logId = log("getAssignees", "Input", qParams);
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
const isAdmin = await validateMasterAuth(
|
|
12
|
+
event,
|
|
13
|
+
values.permissionMaintenanceTracking,
|
|
14
|
+
qParams.site,
|
|
15
|
+
);
|
|
16
|
+
const isAssignee = await validateMasterAuth(
|
|
17
|
+
event,
|
|
18
|
+
values.permissionMaintenanceAssignment,
|
|
19
|
+
qParams.site,
|
|
20
|
+
);
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
const valid = isAdmin || isAssignee;
|
|
23
|
+
log("getRequests", "valid", valid, logId);
|
|
24
|
+
if (!valid) {
|
|
25
|
+
return { status: 403, data: { error: "Not authorised" } };
|
|
26
|
+
}
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
// get assignees
|
|
29
|
+
const assignees = await getUsersByPermission(qParams.site, [
|
|
30
|
+
values.permissionMaintenanceTracking,
|
|
31
|
+
values.permissionMaintenanceAssignment,
|
|
32
|
+
]);
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
log("getAssignees", "AssigneesLength", assignees.length, logId);
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
// compile results
|
|
37
|
+
const results = { Users: assignees };
|
|
38
|
+
log("getAssignees", "Done", true, logId);
|
|
39
|
+
return { status: 200, data: results };
|
|
40
40
|
};
|