@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
90 lines (89 loc) • 3.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.saveProject = saveProject;
const types_1 = require("../../../types");
async function saveProject(ticket, project, fetchOptions) {
const current = await getCurrent(ticket);
const changed = current?.get("project")?.id !== project;
if (!changed)
return current;
// attempt to fetch previous project pointer (if any)
let prevProject = null;
try {
prevProject = (await ticket.get("project")?.fetch(fetchOptions)) || null;
}
catch (error) {
console.warn(`Referenced project not found for ticket ${ticket.id}, clearing reference:`, error);
ticket.unset("project");
try {
await ticket.save(null, fetchOptions);
}
catch (err) {
console.error("Failed to save ticket after clearing missing project reference:", err);
}
prevProject = null;
}
if (prevProject && prevProject.id !== project) {
try {
prevProject.relation("tickets").remove(ticket);
await prevProject.save(null, { useMasterKey: true });
}
catch (err) {
console.warn(`Failed to remove ticket from previous project ${prevProject.id}:`, err);
}
}
// Fetch new project by id (use .first to avoid throwing). If not found, abort cleanly.
const projectObj = await new Parse.Query(types_1.Maintenance_Project)
.equalTo("objectId", project)
.first(fetchOptions);
if (!projectObj) {
console.warn(`Project ${project} not found. Aborting ticket->project association.`);
// optional: ensure ticket.project is unset to avoid dangling pointer
ticket.unset("project");
try {
await ticket.save(null, fetchOptions);
}
catch (err) {
console.error("Failed to save ticket after unsetting missing target project:", err);
}
return null;
}
// create the relation record and save guarded by try/catch
const ticketProjectObject = new types_1.Maintenance_Ticket_Project({
ticket,
project: projectObj,
tenant: ticket.get("tenant"),
user: ticket.get("user"),
});
try {
await ticketProjectObject.save(null, fetchOptions);
}
catch (err) {
console.error("Failed to save Maintenance_Ticket_Project:", err);
throw err;
}
try {
ticket.set("project", projectObj);
await ticket.save(null, fetchOptions);
}
catch (err) {
console.error("Failed to save ticket with new project pointer:", err);
// Consider rollback of ticketProjectObject if needed
throw err;
}
// update project's tickets relation with master key to avoid permission issues
try {
projectObj.relation("tickets").add(ticket);
await projectObj.save(null, { useMasterKey: true });
}
catch (err) {
console.warn(`Failed to add ticket to project ${projectObj.id} relation:`, err);
}
return ticketProjectObject;
}
async function getCurrent(ticket) {
return await new Parse.Query(types_1.Maintenance_Ticket_Project)
.descending("createdAt")
.equalTo("ticket", ticket)
.first({ useMasterKey: true });
}