UNPKG

@openinc/parse-server-opendash

Version:
90 lines (89 loc) 3.3 kB
"use strict"; 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 }); }