@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
329 lines (328 loc) • 13.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getUsername = getUsername;
exports.init = init;
exports.saveTicketData = saveTicketData;
const openservice_1 = require("../features/openservice");
const openware_1 = require("../features/openware");
const catchError_1 = require("../helper/catchError");
const types_1 = require("../types");
function getUsername(user) {
if (!user)
return "System";
let username = "";
if (user?.get("firstname") && user?.get("lastname")) {
username = user?.get("firstname") + " " + user?.get("lastname");
}
else if (user?.get("name")) {
username = user.get("name");
}
else {
username = user?.getUsername();
}
return username ?? "System";
}
async function init(name) {
Parse.Cloud.define(name, handleRequest, {
requireUser: true,
});
}
async function handleRequest(request) {
const result = {
success: true,
};
try {
const session = request.user?.getSessionToken();
if (!session) {
throw new Error("No user session found");
}
const ticket = await saveTicketData(request.params, request.user);
result.success = true;
result.ticket = ticket;
return result;
}
catch (error) {
console.error(error);
result.success = false;
result.error = error;
return result;
}
}
async function saveTicketData(data, user) {
const fetchOptions = user
? { sessionToken: user.getSessionToken() }
: { useMasterKey: true };
const ticket = await (0, openservice_1.getTicketObject)(data, user, fetchOptions);
const owticketobj = {
ticket: ticket,
priority: 0,
downtime: 0,
restriction: 0,
frequency: 0,
issuecategory: "",
state: "",
source: new types_1.Maintenance_Ticket_Source(),
};
// needs to be the first save to save a message before data change messages are created on ticket creation
if (data.message)
await (0, openservice_1.saveMessage)(ticket, data.message, fetchOptions, data);
if (data.assignedTo !== undefined)
await (0, openservice_1.assignUsersAndRoles)(ticket, data.assignedTo, fetchOptions, user);
if (data.title)
await (0, openservice_1.saveTicketTitle)(ticket, fetchOptions);
if (data.description)
await (0, openservice_1.saveDescription)(ticket, data, fetchOptions);
if (data.meta)
await (0, openservice_1.saveTicketMeta)(ticket, data.meta, fetchOptions);
if (data.duedate)
await (0, openservice_1.saveDuedate)(ticket, data.duedate, fetchOptions);
if (data.priority !== undefined) {
const savedpriority = await (0, openservice_1.savePriority)(ticket, data.priority, fetchOptions);
owticketobj.priority = savedpriority;
}
else {
//Fetch last value so it won't publish a 0 value to openware and overwrite the last value with default 0
const [lastPriorityError, lastPriority] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Priority)
.equalTo("ticket", ticket)
.descending("createdAt")
.first(fetchOptions));
if (lastPriorityError) {
console.log("Error fetching last priority", lastPriorityError);
}
else {
owticketobj.priority = lastPriority?.get("value") ?? 0;
}
}
if (data.downtime !== undefined) {
const saveddowntime = await (0, openservice_1.saveDowntime)(ticket, data.downtime, fetchOptions);
owticketobj.downtime = saveddowntime;
}
else {
//Fetch last value so it won't publish a 0 value to openware and overwrite the last value with default 0
const [lastDowntimeError, lastDowntime] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Downtime)
.equalTo("ticket", ticket)
.descending("createdAt")
.first(fetchOptions));
if (lastDowntimeError) {
console.log("Error fetching last downtime", lastDowntimeError);
}
else {
owticketobj.downtime = lastDowntime?.get("value") ?? 0;
}
}
if (data.frequency !== undefined) {
const savedfrequency = await (0, openservice_1.saveFrequency)(ticket, data.frequency, fetchOptions);
owticketobj.frequency = savedfrequency;
}
else {
//Fetch last value so it won't publish a 0 value to openware and overwrite the last value with default 0
const [lastFrequencyError, lastFrequency] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Frequency)
.equalTo("ticket", ticket)
.descending("createdAt")
.first(fetchOptions));
if (lastFrequencyError) {
console.log("Error fetching last frequency", lastFrequencyError);
}
else {
owticketobj.frequency = lastFrequency?.get("value") ?? 0;
}
}
if (data.restriction !== undefined) {
const savedrestriction = await (0, openservice_1.saveRestriction)(ticket, data.restriction, fetchOptions);
owticketobj.restriction = savedrestriction;
}
else {
//Fetch last value so it won't publish a 0 value to openware and overwrite the last value with default 0
const [lastRestrictionError, lastRestriction] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Restriction)
.equalTo("ticket", ticket)
.descending("createdAt")
.first(fetchOptions));
if (lastRestrictionError) {
console.log("Error fetching last restriction", lastRestrictionError);
}
else {
owticketobj.restriction = lastRestriction?.get("value") ?? 0;
}
}
if (data.issuecategory) {
const savedissuecategory = await (0, openservice_1.saveIssueCategory)(ticket, data.issuecategory, fetchOptions);
const [fetchedSavedIssuecategoryError, fetchedSavedIssuecategory] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Issuecategory)
.include("issuecategory")
.get(savedissuecategory.id, fetchOptions));
if (fetchedSavedIssuecategoryError) {
console.log("Error fetching saved issue category", fetchedSavedIssuecategoryError);
}
else {
owticketobj.issuecategory = fetchedSavedIssuecategory;
}
}
if (data.state) {
const savedstate = await (0, openservice_1.saveState)(ticket, data.state, fetchOptions);
const [fetchedSavedStateError, fetchedSavedState] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Kanban_State)
.include("state")
.get(savedstate.id, fetchOptions));
if (fetchedSavedStateError) {
console.log("Error fetching saved state", fetchedSavedStateError);
}
else {
owticketobj.state = fetchedSavedState;
}
}
if (data.media && data.media.length > 0)
await (0, openservice_1.saveMedia)(ticket, data.media, fetchOptions);
if (data.material)
await (0, openservice_1.saveMaterial)(ticket, data.material, fetchOptions);
if (data.project)
await (0, openservice_1.saveProject)(ticket, data.project, fetchOptions);
// save defaults
if (!data.issuecategory && !data.existingTicketId)
await (0, openservice_1.saveDefaultIssueCategory)(ticket, fetchOptions);
if (!data.state && !data.existingTicketId)
await (0, openservice_1.saveDefaultState)(ticket, fetchOptions);
// save source last so the machinelog does not have the initialization messages of the ticket data
if (data.source) {
await (0, openservice_1.saveSource)(ticket, data.source, fetchOptions);
}
//Get source from ticket and save to openware
const [fetchedTicketSourceError, ticketsource] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Source)
.equalTo("ticket", new types_1.Maintenance_Ticket({ objectId: ticket.id }))
.descending("createdAt")
.include("source")
.first({ useMasterKey: true }));
if (fetchedTicketSourceError) {
console.log("Error fetching saved source", fetchedTicketSourceError);
}
else if (ticketsource && ticketsource.get("source")) {
owticketobj.source = ticketsource;
// publish to openware
await publishToOpenWare(owticketobj, ticket, ticketsource.get("source").get("tag")
? ticketsource.get("source").get("tag")
: "");
}
return ticket;
}
/**
* Publishes the ticket to open.WARE with all changed data
* @param owticketobj OpenWareTicketObject
* @param source OD3_Source
*/
async function publishToOpenWare(owticketobj, ticket, source) {
const time = new Date().getTime();
const values = {
date: time,
value: Object.entries(owticketobj).map(([key, value]) => {
if (key === "downtime") {
if (value instanceof types_1.Maintenance_Downtime) {
return value.get("value");
}
return value;
}
else if (key === "frequency") {
if (value instanceof types_1.Maintenance_Frequency) {
return value.get("value");
}
return value;
}
else if (key === "priority") {
if (value instanceof types_1.Maintenance_Priority) {
return value.get("value");
}
return value;
}
else if (key === "restriction") {
if (value instanceof types_1.Maintenance_Restriction) {
return value.get("value");
}
return value;
}
else if (key === "issuecategory") {
if (value instanceof types_1.Maintenance_Ticket_Issuecategory) {
return value.get("issuecategory").id;
}
return value;
}
else if (key === "state") {
if (value instanceof types_1.Maintenance_Ticket_Kanban_State) {
return value.get("state").id;
}
return value;
}
else if (key === "ticket") {
if (value instanceof types_1.Maintenance_Ticket) {
return value.id;
}
return value;
}
else if (key === "source") {
if (value instanceof types_1.Maintenance_Ticket_Source) {
return value.get("source").id;
}
return value;
}
return value;
}),
};
const valueTypes = Object.keys(owticketobj).map((key) => {
const tmpvaluetype = {
name: "",
unit: "",
type: "String",
};
if (key === "downtime") {
tmpvaluetype.name = types_1.Maintenance_Downtime.className.replace("OD3_Maintenance_", "");
tmpvaluetype.unit = "%";
tmpvaluetype.type = "Number";
}
else if (key === "frequency") {
tmpvaluetype.name = types_1.Maintenance_Frequency.className.replace("OD3_Maintenance_", "");
tmpvaluetype.unit = "%";
tmpvaluetype.type = "Number";
}
else if (key === "priority") {
tmpvaluetype.name = types_1.Maintenance_Priority.className.replace("OD3_Maintenance_", "");
tmpvaluetype.unit = "%";
tmpvaluetype.type = "Number";
}
else if (key === "restriction") {
tmpvaluetype.name = types_1.Maintenance_Restriction.className.replace("OD3_Maintenance_", "");
tmpvaluetype.unit = "%";
tmpvaluetype.type = "Number";
}
else if (key === "issuecategory") {
tmpvaluetype.name = types_1.Maintenance_Ticket_Issuecategory.className.replace("OD3_Maintenance_", "");
tmpvaluetype.unit = "";
tmpvaluetype.type = "String";
}
else if (key === "state") {
tmpvaluetype.name = types_1.Maintenance_Ticket_Kanban_State.className.replace("OD3_Maintenance_", "");
tmpvaluetype.unit = "";
tmpvaluetype.type = "String";
}
else if (key === "ticket") {
tmpvaluetype.name = types_1.Maintenance_Ticket.className.replace("OD3_Maintenance_", "");
tmpvaluetype.unit = "";
tmpvaluetype.type = "String";
}
else if (key === "source") {
tmpvaluetype.name = types_1.Maintenance_Ticket_Source.className.replace("OD3_Maintenance_", "");
tmpvaluetype.unit = "";
tmpvaluetype.type = "String";
}
return tmpvaluetype;
});
const dataitem = {
id: `openservice_ticket_${ticket.id}`,
name: `Ticket ${owticketobj.ticket.get("title")}`,
source: source,
values: [values],
valueTypes: valueTypes,
meta: {},
};
console.log("Publishing ticket to openware: ", dataitem, "with values", JSON.stringify(dataitem.values));
try {
await (0, openware_1.publishDataItem)(dataitem, ticket.get("user")?.get("email"), true);
}
catch (error) {
console.error("Error publishing ticket to openware", error);
}
}