@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
176 lines (175 loc) • 7.29 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.assignUsersAndRoles = assignUsersAndRoles;
const parse_1 = require("parse");
const openinc_openservice_save_ticket_data_1 = require("../../../functions/openinc-openservice-save-ticket-data");
const openinc_openservice_ticket_data_1 = require("../../../functions/openinc-openservice-ticket-data");
const types_1 = require("../../../types");
async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUser) {
const assignedUsers = (await ticket
.relation("assignedusers")
.query()
.find(fetchOptions));
const assignedroles = (await ticket
.relation("assignedroles")
.query()
.find(fetchOptions));
if (!hasChanged(assignedTo, assignedUsers, assignedroles))
return;
ticket.relation("assignedusers").remove(assignedUsers);
ticket.relation("assignedroles").remove(assignedroles);
const assignments = [];
const batchTime = new Date();
const ids = assignedTo.map((a) => a.id);
const newUsers = await new Parse.Query(parse_1.User)
.containedIn("objectId", ids)
.find(fetchOptions);
const newRoles = await new Parse.Query(parse_1.Role)
.containedIn("objectId", ids)
.find(fetchOptions);
ticket.relation("assignedusers").add(newUsers);
ticket.relation("assignedroles").add(newRoles);
await ticket.save(null, fetchOptions);
if (newRoles.length === 0 && newUsers.length === 0) {
assignments.push(new types_1.Maintenance_Ticket_Assignment({
ticket,
assignedUser: undefined,
assignedRole: undefined,
user: ticket.user,
tenant: ticket.tenant,
batchStamp: batchTime,
}));
}
const userNotifiedIds = [];
for (const assignedTo of newUsers) {
assignments.push(new types_1.Maintenance_Ticket_Assignment({
ticket,
assignedUser: assignedTo,
tenant: ticket.get("tenant"),
user: ticket.get("user"),
batchStamp: batchTime,
}));
if (assignedTo.id === assigningUser?.id)
continue;
await new types_1.Notification({
data: {
ticketId: ticket.id,
translation: {
ticketName: ticket.get("title"),
ticketId: ticket.id,
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(assigningUser) ?? "System",
},
},
isSent: false,
title: "maintenance:ticket.assignuser.notification.title",
user: assignedTo,
description: "maintenance:ticket.assignuser.notification.description",
}).save(null, fetchOptions);
userNotifiedIds.push(assignedTo.id);
}
for (const assignedTo of newRoles) {
assignments.push(new types_1.Maintenance_Ticket_Assignment({
ticket,
assignedRole: assignedTo,
tenant: ticket.get("tenant"),
user: ticket.get("user"),
batchStamp: batchTime,
}));
const roleUsers = await assignedTo
.relation("users")
.query()
.find(fetchOptions);
for (const roleUser of roleUsers) {
if (userNotifiedIds.includes(roleUser.id) ||
roleUser.id === assigningUser?.id)
continue;
await new types_1.Notification({
data: {
ticketId: ticket.id,
translation: {
ticketName: ticket.get("title"),
ticketId: ticket.id,
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(assigningUser) ?? "System",
role: assignedTo.get("label"),
},
},
isSent: false,
title: "maintenance:ticket.assignrole.notification.title",
user: roleUser,
description: "maintenance:ticket.assignrole.notification.description",
}).save(null, fetchOptions);
}
}
await types_1.Maintenance_Ticket_Assignment.saveAll(assignments, fetchOptions);
//Set ACLs for assigned users and roles on ticket
const acl = new Parse.ACL();
for (const assignedUser of newUsers) {
acl.setReadAccess(assignedUser, true);
acl.setWriteAccess(assignedUser, true);
}
// get the parent roles of the assigned roles
const rolesWithParents = await addParentRoles(newRoles);
// remove duplicates from the array
const distinctRolesWithParents = (0, openinc_openservice_ticket_data_1.arrayToDistinct)(rolesWithParents, (obj) => obj.id);
for (const assignedRole of distinctRolesWithParents) {
acl.setRoleReadAccess(assignedRole, true);
acl.setRoleWriteAccess(assignedRole, true);
}
ticket.setACL(acl);
await ticket.save(null, fetchOptions);
// SAVE ASSIGNMENT MESSAGE
// set the content for the message
let content = "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.none";
if (newUsers.length > 0 && newRoles.length > 0)
content =
"maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.both";
else if (newUsers.length > 0)
content =
"maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.user";
else if (newRoles.length > 0)
content =
"maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.role";
await new types_1.Maintenance_Message({
referencedObjectId: ticket.id,
classname: types_1.Maintenance_Ticket.className,
title: "maintenance:ticket.message.assignment.changed.title",
content,
user: ticket.get("user"),
tenant: ticket.get("tenant"),
data: {
type: "system",
translation: {
username: (0, openinc_openservice_save_ticket_data_1.getUsername)(assigningUser),
userList: newUsers.map((u) => `'${u.get("username")}'`).join(", "),
roleList: newRoles.map((r) => `'${r.get("label")}'`).join(", "),
ticketName: ticket.get("title"),
},
origin: {
id: ticket.id,
classname: ticket.className,
},
},
}).save(null, fetchOptions);
await ticket.save(null, fetchOptions);
}
async function addParentRoles(roles) {
for (const role of roles) {
const roleQuery = new Parse.Query(parse_1.Role).equalTo("objectId", role.id);
const parentRoles = await new Parse.Query(parse_1.Role)
.matchesQuery("roles", roleQuery)
.find();
if (parentRoles.length > 0) {
roles.push(...(await addParentRoles(parentRoles)));
}
}
return roles;
}
function hasChanged(assignedTo, assignedUsers, assignedRoles) {
const assignedIds = [
...assignedUsers.map((u) => u.id),
...assignedRoles.map((r) => r.id),
];
const newIds = assignedTo.map((a) => a.id);
return (assignedIds.length !== newIds.length ||
!newIds.every((id) => assignedIds.includes(id)));
}