@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 |
|
|
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
|
-
//
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
}
|