UNPKG

@openinc/parse-server-opendash

Version:
176 lines (175 loc) 7.29 kB
"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))); }