@openinc/parse-server-opendash 3.24.3 → 3.24.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  import { Maintenance_Ticket, Maintenance_Ticket_Project } from "../../../types";
2
2
  import { FetchOptions } from "../types/FetchOptions";
3
- export declare function saveProject(ticket: Maintenance_Ticket, project: string, fetchOptions: FetchOptions): Promise<Maintenance_Ticket_Project | undefined>;
3
+ export declare function saveProject(ticket: Maintenance_Ticket, project: string, fetchOptions: FetchOptions): Promise<Maintenance_Ticket_Project | null>;
@@ -7,39 +7,79 @@ async function saveProject(ticket, project, fetchOptions) {
7
7
  const changed = current?.get("project")?.id !== project;
8
8
  if (!changed)
9
9
  return current;
10
- // check if ticket already has a project assigned
11
- // if so, remove the ticket from the old project
12
- let prevProject;
10
+ // attempt to fetch previous project pointer (if any)
11
+ let prevProject = null;
13
12
  try {
14
- prevProject = await ticket.get("project")?.fetch(fetchOptions);
13
+ prevProject = (await ticket.get("project")?.fetch(fetchOptions)) || null;
15
14
  }
16
15
  catch (error) {
17
- // Project reference exists but object was deleted - clear the reference
18
16
  console.warn(`Referenced project not found for ticket ${ticket.id}, clearing reference:`, error);
19
17
  ticket.unset("project");
20
- await ticket.save(null, fetchOptions);
18
+ try {
19
+ await ticket.save(null, fetchOptions);
20
+ }
21
+ catch (err) {
22
+ console.error("Failed to save ticket after clearing missing project reference:", err);
23
+ }
21
24
  prevProject = null;
22
25
  }
23
26
  if (prevProject && prevProject.id !== project) {
24
- prevProject.relation("tickets").remove(ticket);
25
- prevProject.save(null, fetchOptions);
27
+ try {
28
+ prevProject.relation("tickets").remove(ticket);
29
+ await prevProject.save(null, fetchOptions);
30
+ }
31
+ catch (err) {
32
+ console.warn(`Failed to remove ticket from previous project ${prevProject.id}:`, err);
33
+ }
26
34
  }
35
+ // Fetch new project by id (use .first to avoid throwing). If not found, abort cleanly.
27
36
  const projectObj = await new Parse.Query(types_1.Maintenance_Project)
28
37
  .equalTo("objectId", project)
29
38
  .first(fetchOptions);
39
+ if (!projectObj) {
40
+ console.warn(`Project ${project} not found. Aborting ticket->project association.`);
41
+ // optional: ensure ticket.project is unset to avoid dangling pointer
42
+ ticket.unset("project");
43
+ try {
44
+ await ticket.save(null, fetchOptions);
45
+ }
46
+ catch (err) {
47
+ console.error("Failed to save ticket after unsetting missing target project:", err);
48
+ }
49
+ return null;
50
+ }
51
+ // create the relation record and save guarded by try/catch
30
52
  const ticketProjectObject = new types_1.Maintenance_Ticket_Project({
31
53
  ticket,
32
54
  project: projectObj,
33
55
  tenant: ticket.get("tenant"),
34
56
  user: ticket.get("user"),
35
57
  });
36
- await ticketProjectObject.save(null, fetchOptions);
37
- ticket.set("project", projectObj);
38
- await ticket.save(null, fetchOptions);
39
- if (projectObj) {
58
+ try {
59
+ await ticketProjectObject.save(null, fetchOptions);
60
+ }
61
+ catch (err) {
62
+ console.error("Failed to save Maintenance_Ticket_Project:", err);
63
+ throw err;
64
+ }
65
+ try {
66
+ ticket.set("project", projectObj);
67
+ await ticket.save(null, fetchOptions);
68
+ }
69
+ catch (err) {
70
+ console.error("Failed to save ticket with new project pointer:", err);
71
+ // Consider rollback of ticketProjectObject if needed
72
+ throw err;
73
+ }
74
+ // update project's tickets relation with master key to avoid permission issues
75
+ try {
40
76
  projectObj.relation("tickets").add(ticket);
41
77
  await projectObj.save(null, { useMasterKey: true });
42
78
  }
79
+ catch (err) {
80
+ console.warn(`Failed to add ticket to project ${projectObj.id} relation:`, err);
81
+ }
82
+ return ticketProjectObject;
43
83
  }
44
84
  async function getCurrent(ticket) {
45
85
  return await new Parse.Query(types_1.Maintenance_Ticket_Project)
@@ -101,7 +101,7 @@ async function saveTicketData(data, user, overrideFetchOptions) {
101
101
  const [lastPriorityError, lastPriority] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Priority)
102
102
  .equalTo("ticket", ticket)
103
103
  .descending("createdAt")
104
- .first(fetchOptions));
104
+ .first(fetchOptions), [Error]);
105
105
  if (lastPriorityError) {
106
106
  console.log("Error fetching last priority", lastPriorityError);
107
107
  }
@@ -118,7 +118,7 @@ async function saveTicketData(data, user, overrideFetchOptions) {
118
118
  const [lastDowntimeError, lastDowntime] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Downtime)
119
119
  .equalTo("ticket", ticket)
120
120
  .descending("createdAt")
121
- .first(fetchOptions));
121
+ .first(fetchOptions), [Error]);
122
122
  if (lastDowntimeError) {
123
123
  console.log("Error fetching last downtime", lastDowntimeError);
124
124
  }
@@ -135,7 +135,7 @@ async function saveTicketData(data, user, overrideFetchOptions) {
135
135
  const [lastFrequencyError, lastFrequency] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Frequency)
136
136
  .equalTo("ticket", ticket)
137
137
  .descending("createdAt")
138
- .first(fetchOptions));
138
+ .first(fetchOptions), [Error]);
139
139
  if (lastFrequencyError) {
140
140
  console.log("Error fetching last frequency", lastFrequencyError);
141
141
  }
@@ -152,7 +152,7 @@ async function saveTicketData(data, user, overrideFetchOptions) {
152
152
  const [lastRestrictionError, lastRestriction] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Restriction)
153
153
  .equalTo("ticket", ticket)
154
154
  .descending("createdAt")
155
- .first(fetchOptions));
155
+ .first(fetchOptions), [Error]);
156
156
  if (lastRestrictionError) {
157
157
  console.log("Error fetching last restriction", lastRestrictionError);
158
158
  }
@@ -164,7 +164,7 @@ async function saveTicketData(data, user, overrideFetchOptions) {
164
164
  const savedissuecategory = await (0, openservice_1.saveIssueCategory)(ticket, data.issuecategory, fetchOptions);
165
165
  const [fetchedSavedIssuecategoryError, fetchedSavedIssuecategory] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Issuecategory)
166
166
  .include("issuecategory")
167
- .get(savedissuecategory.id, fetchOptions));
167
+ .get(savedissuecategory.id, fetchOptions), [Error]);
168
168
  if (fetchedSavedIssuecategoryError) {
169
169
  console.log("Error fetching saved issue category", fetchedSavedIssuecategoryError);
170
170
  }
@@ -176,7 +176,7 @@ async function saveTicketData(data, user, overrideFetchOptions) {
176
176
  const savedstate = await (0, openservice_1.saveState)(ticket, data.state, fetchOptions);
177
177
  const [fetchedSavedStateError, fetchedSavedState] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Kanban_State)
178
178
  .include("state")
179
- .get(savedstate.id, fetchOptions));
179
+ .get(savedstate.id, fetchOptions), [Error]);
180
180
  if (fetchedSavedStateError) {
181
181
  console.log("Error fetching saved state", fetchedSavedStateError);
182
182
  }
@@ -185,41 +185,53 @@ async function saveTicketData(data, user, overrideFetchOptions) {
185
185
  }
186
186
  }
187
187
  if (data.media && data.media.length > 0) {
188
- const [saveError] = await (0, catchError_1.catchError)((0, openservice_1.saveMedia)(ticket, data.media, fetchOptions));
189
- if (saveError) {
190
- console.error(`Error saving media for ticket ${ticket.id}:`, saveError);
188
+ try {
189
+ await (0, openservice_1.saveMedia)(ticket, data.media, fetchOptions);
190
+ }
191
+ catch (error) {
192
+ console.error(`Error saving media for ticket ${ticket.id}:`, error);
191
193
  }
192
194
  }
193
195
  if (data.material) {
194
- const [saveError] = await (0, catchError_1.catchError)((0, openservice_1.saveMaterial)(ticket, data.material, fetchOptions));
195
- if (saveError) {
196
- console.error(`Error saving material for ticket ${ticket.id}:`, saveError);
196
+ try {
197
+ await (0, openservice_1.saveMaterial)(ticket, data.material, fetchOptions);
198
+ }
199
+ catch (error) {
200
+ console.error(`Error saving material for ticket ${ticket.id}:`, error);
197
201
  }
198
202
  }
199
203
  if (data.project) {
200
- const [saveError] = await (0, catchError_1.catchError)((0, openservice_1.saveProject)(ticket, data.project, fetchOptions));
201
- if (saveError) {
202
- console.error(`Error saving project ${data.project} for ticket ${ticket.id}:`, saveError);
204
+ try {
205
+ await (0, openservice_1.saveProject)(ticket, data.project, fetchOptions);
206
+ }
207
+ catch (error) {
208
+ console.error(`Error saving project ${data.project} for ticket ${ticket.id}:`, error);
203
209
  }
204
210
  }
205
211
  // save defaults
206
212
  if (!data.issuecategory && !data.existingTicketId) {
207
- const [saveError] = await (0, catchError_1.catchError)((0, openservice_1.saveDefaultIssueCategory)(ticket, fetchOptions));
208
- if (saveError) {
209
- console.error(`Error saving default issue category for ticket ${ticket.id}:`, saveError);
213
+ try {
214
+ await (0, openservice_1.saveDefaultIssueCategory)(ticket, fetchOptions);
215
+ }
216
+ catch (error) {
217
+ console.error(`Error saving default issue category for ticket ${ticket.id}:`, error);
210
218
  }
211
219
  }
212
220
  if (!data.state && !data.existingTicketId) {
213
- const [saveError] = await (0, catchError_1.catchError)((0, openservice_1.saveDefaultState)(ticket, fetchOptions));
214
- if (saveError) {
215
- console.error(`Error saving default state for ticket ${ticket.id}:`, saveError);
221
+ try {
222
+ await (0, openservice_1.saveDefaultState)(ticket, fetchOptions);
223
+ }
224
+ catch (error) {
225
+ console.error(`Error saving default state for ticket ${ticket.id}:`, error);
216
226
  }
217
227
  }
218
228
  // save source last so the machinelog does not have the initialization messages of the ticket data
219
229
  if (data.source) {
220
- const [saveError] = await (0, catchError_1.catchError)((0, openservice_1.saveSource)(ticket, data.source, fetchOptions));
221
- if (saveError) {
222
- console.error(`Error saving source ${data.source} for ticket ${ticket.id}:`, saveError);
230
+ try {
231
+ await (0, openservice_1.saveSource)(ticket, data.source, fetchOptions);
232
+ }
233
+ catch (error) {
234
+ console.error(`Error saving source ${data.source} for ticket ${ticket.id}:`, error);
223
235
  }
224
236
  }
225
237
  //Get source from ticket and save to openware
@@ -227,7 +239,7 @@ async function saveTicketData(data, user, overrideFetchOptions) {
227
239
  .equalTo("ticket", new types_1.Maintenance_Ticket({ objectId: ticket.id }))
228
240
  .descending("createdAt")
229
241
  .include("source")
230
- .first({ useMasterKey: true }));
242
+ .first({ useMasterKey: true }), [Error]);
231
243
  if (fetchedTicketSourceError) {
232
244
  console.log("Error fetching saved source", fetchedTicketSourceError);
233
245
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openinc/parse-server-opendash",
3
- "version": "3.24.3",
3
+ "version": "3.24.4",
4
4
  "description": "Parse Server Cloud Code for open.INC Stack.",
5
5
  "packageManager": "pnpm@10.19.0",
6
6
  "keywords": [