@openinc/parse-server-opendash 2.4.101 → 2.4.103

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,11 +1,11 @@
1
1
  import { Maintenance_Downtime, Maintenance_Frequency, Maintenance_Priority, Maintenance_Restriction, Maintenance_Ticket, Maintenance_Ticket_Issuecategory, Maintenance_Ticket_Kanban_State, Maintenance_Ticket_Source } from "../types";
2
2
  export type OpenWareTicketObject = {
3
3
  ticket: Maintenance_Ticket;
4
- priority: Maintenance_Priority | undefined;
5
- downtime: Maintenance_Downtime | undefined;
6
- frequency: Maintenance_Frequency | undefined;
7
- restriction: Maintenance_Restriction | undefined;
8
- issuecategory: Maintenance_Ticket_Issuecategory | undefined;
9
- state: Maintenance_Ticket_Kanban_State | undefined;
4
+ priority: Maintenance_Priority | Number;
5
+ downtime: Maintenance_Downtime | Number;
6
+ frequency: Maintenance_Frequency | Number;
7
+ restriction: Maintenance_Restriction | Number;
8
+ issuecategory: Maintenance_Ticket_Issuecategory | String;
9
+ state: Maintenance_Ticket_Kanban_State | String;
10
10
  source: Maintenance_Ticket_Source;
11
11
  };
@@ -16,6 +16,7 @@ export declare namespace Permissions {
16
16
  material = "maintenance:can-access-material",
17
17
  scheduletemplate = "maintenance:can-access-scheduletemplate",
18
18
  dailySchedule = "maintenance:can-access-dailySchedule",
19
+ monitoring = "maintenance:can-access-monitoring",
19
20
  downtime = "maintenance:can-access-downtime",
20
21
  restriction = "maintenance:can-access-restriction",
21
22
  frequency = "maintenance:can-access-frequency",
@@ -24,6 +24,7 @@ var Permissions;
24
24
  OpenService["material"] = "maintenance:can-access-material";
25
25
  OpenService["scheduletemplate"] = "maintenance:can-access-scheduletemplate";
26
26
  OpenService["dailySchedule"] = "maintenance:can-access-dailySchedule";
27
+ OpenService["monitoring"] = "maintenance:can-access-monitoring";
27
28
  OpenService["downtime"] = "maintenance:can-access-downtime";
28
29
  OpenService["restriction"] = "maintenance:can-access-restriction";
29
30
  OpenService["frequency"] = "maintenance:can-access-frequency";
@@ -1,5 +1,5 @@
1
- import { _User, Maintenance_Ticket } from "../types";
2
1
  import { Material } from "../hooks/Maintenance_Ticket_Material";
2
+ import { _User, Maintenance_Ticket } from "../types";
3
3
  export type MessageData = {
4
4
  type?: "userinput" | "system";
5
5
  translation?: {
@@ -55,12 +55,12 @@ async function saveTicketData(data, user) {
55
55
  const ticket = await getTicketObject(data, user, fetchOptions);
56
56
  const owticketobj = {
57
57
  ticket: ticket,
58
- priority: undefined,
59
- downtime: undefined,
60
- restriction: undefined,
61
- frequency: undefined,
62
- issuecategory: undefined,
63
- state: undefined,
58
+ priority: 0,
59
+ downtime: 0,
60
+ restriction: 0,
61
+ frequency: 0,
62
+ issuecategory: "",
63
+ state: "",
64
64
  source: new types_1.Maintenance_Ticket_Source(),
65
65
  };
66
66
  // needs to be the first save to save a message before data change messages are created on ticket creation
@@ -78,23 +78,75 @@ async function saveTicketData(data, user) {
78
78
  const savedpriority = await savePriority(ticket, data.priority, fetchOptions);
79
79
  owticketobj.priority = savedpriority;
80
80
  }
81
+ else {
82
+ //Fetch last value so it won't publish a 0 value to openware and overwrite the last value with default 0
83
+ const [lastPriorityError, lastPriority] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Priority)
84
+ .equalTo("ticket", ticket)
85
+ .descending("createdAt")
86
+ .first(fetchOptions));
87
+ if (lastPriorityError) {
88
+ console.log("Error fetching last priority", lastPriorityError);
89
+ }
90
+ else {
91
+ owticketobj.priority = lastPriority?.get("value") ?? 0;
92
+ }
93
+ }
81
94
  if (data.downtime !== undefined) {
82
95
  const saveddowntime = await saveDowntime(ticket, data.downtime, fetchOptions);
83
96
  owticketobj.downtime = saveddowntime;
84
97
  }
98
+ else {
99
+ //Fetch last value so it won't publish a 0 value to openware and overwrite the last value with default 0
100
+ const [lastDowntimeError, lastDowntime] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Downtime)
101
+ .equalTo("ticket", ticket)
102
+ .descending("createdAt")
103
+ .first(fetchOptions));
104
+ if (lastDowntimeError) {
105
+ console.log("Error fetching last downtime", lastDowntimeError);
106
+ }
107
+ else {
108
+ owticketobj.downtime = lastDowntime?.get("value") ?? 0;
109
+ }
110
+ }
85
111
  if (data.frequency !== undefined) {
86
112
  const savedfrequency = await saveFrequency(ticket, data.frequency, fetchOptions);
87
113
  owticketobj.frequency = savedfrequency;
88
114
  }
115
+ else {
116
+ //Fetch last value so it won't publish a 0 value to openware and overwrite the last value with default 0
117
+ const [lastFrequencyError, lastFrequency] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Frequency)
118
+ .equalTo("ticket", ticket)
119
+ .descending("createdAt")
120
+ .first(fetchOptions));
121
+ if (lastFrequencyError) {
122
+ console.log("Error fetching last frequency", lastFrequencyError);
123
+ }
124
+ else {
125
+ owticketobj.frequency = lastFrequency?.get("value") ?? 0;
126
+ }
127
+ }
89
128
  if (data.restriction !== undefined) {
90
129
  const savedrestriction = await saveRestriction(ticket, data.restriction, fetchOptions);
91
130
  owticketobj.restriction = savedrestriction;
92
131
  }
132
+ else {
133
+ //Fetch last value so it won't publish a 0 value to openware and overwrite the last value with default 0
134
+ const [lastRestrictionError, lastRestriction] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Restriction)
135
+ .equalTo("ticket", ticket)
136
+ .descending("createdAt")
137
+ .first(fetchOptions));
138
+ if (lastRestrictionError) {
139
+ console.log("Error fetching last restriction", lastRestrictionError);
140
+ }
141
+ else {
142
+ owticketobj.restriction = lastRestriction?.get("value") ?? 0;
143
+ }
144
+ }
93
145
  if (data.issuecategory) {
94
146
  const savedissuecategory = await saveIssueCategory(ticket, data.issuecategory, fetchOptions);
95
147
  const [fetchedSavedIssuecategoryError, fetchedSavedIssuecategory] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Issuecategory)
96
148
  .include("issuecategory")
97
- .get(savedissuecategory.id));
149
+ .get(savedissuecategory.id, fetchOptions));
98
150
  if (fetchedSavedIssuecategoryError) {
99
151
  console.log("Error fetching saved issue category", fetchedSavedIssuecategoryError);
100
152
  }
@@ -106,7 +158,7 @@ async function saveTicketData(data, user) {
106
158
  const savedstate = await saveState(ticket, data.state, fetchOptions);
107
159
  const [fetchedSavedStateError, fetchedSavedState] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Ticket_Kanban_State)
108
160
  .include("state")
109
- .get(savedstate.id));
161
+ .get(savedstate.id, fetchOptions));
110
162
  if (fetchedSavedStateError) {
111
163
  console.log("Error fetching saved state", fetchedSavedStateError);
112
164
  }
@@ -141,7 +193,9 @@ async function saveTicketData(data, user) {
141
193
  else if (ticketsource && ticketsource.get("source")) {
142
194
  owticketobj.source = ticketsource;
143
195
  // publish to openware
144
- await publishToOpenWare(owticketobj, ticket, ticketsource.get("source").id);
196
+ await publishToOpenWare(owticketobj, ticket, ticketsource.get("source").get("tag")
197
+ ? ticketsource.get("source").get("tag")
198
+ : "");
145
199
  }
146
200
  return ticket;
147
201
  }
@@ -154,90 +208,112 @@ async function publishToOpenWare(owticketobj, ticket, source) {
154
208
  const time = new Date().getTime();
155
209
  const values = {
156
210
  date: time,
157
- value: Object.values(owticketobj)
158
- .map((value) => {
159
- if (value instanceof types_1.Maintenance_Downtime) {
160
- return value.get("value");
211
+ value: Object.entries(owticketobj).map(([key, value]) => {
212
+ if (key === "downtime") {
213
+ if (value instanceof types_1.Maintenance_Downtime) {
214
+ return value.get("value");
215
+ }
216
+ return value;
161
217
  }
162
- else if (value instanceof types_1.Maintenance_Frequency) {
163
- return value.get("value");
218
+ else if (key === "frequency") {
219
+ if (value instanceof types_1.Maintenance_Frequency) {
220
+ return value.get("value");
221
+ }
222
+ return value;
164
223
  }
165
- else if (value instanceof types_1.Maintenance_Priority) {
166
- return value.get("value");
224
+ else if (key === "priority") {
225
+ if (value instanceof types_1.Maintenance_Priority) {
226
+ return value.get("value");
227
+ }
228
+ return value;
167
229
  }
168
- else if (value instanceof types_1.Maintenance_Restriction) {
169
- return value.get("value");
230
+ else if (key === "restriction") {
231
+ if (value instanceof types_1.Maintenance_Restriction) {
232
+ return value.get("value");
233
+ }
234
+ return value;
170
235
  }
171
- else if (value instanceof types_1.Maintenance_Ticket_Issuecategory) {
172
- return value.get("issuecategory").id;
236
+ else if (key === "issuecategory") {
237
+ if (value instanceof types_1.Maintenance_Ticket_Issuecategory) {
238
+ return value.get("issuecategory").id;
239
+ }
240
+ return value;
173
241
  }
174
- else if (value instanceof types_1.Maintenance_Ticket_Kanban_State) {
175
- return value.get("state").id;
242
+ else if (key === "state") {
243
+ if (value instanceof types_1.Maintenance_Ticket_Kanban_State) {
244
+ return value.get("state").id;
245
+ }
246
+ return value;
176
247
  }
177
- else if (value instanceof types_1.Maintenance_Ticket) {
178
- return value.id;
248
+ else if (key === "ticket") {
249
+ if (value instanceof types_1.Maintenance_Ticket) {
250
+ return value.id;
251
+ }
252
+ return value;
179
253
  }
180
- else if (value instanceof types_1.Maintenance_Ticket_Source) {
181
- return value.get("source").id;
254
+ else if (key === "source") {
255
+ if (value instanceof types_1.Maintenance_Ticket_Source) {
256
+ return value.get("source").id;
257
+ }
258
+ return value;
182
259
  }
183
- return undefined;
184
- })
185
- .filter((v) => v !== undefined),
260
+ return value;
261
+ }),
186
262
  };
187
- const valueTypes = Object.entries(owticketobj).map(([key, value]) => {
263
+ const valueTypes = Object.keys(owticketobj).map((key) => {
188
264
  const tmpvaluetype = {
189
265
  name: "",
190
266
  unit: "",
191
267
  type: "String",
192
268
  };
193
- if (value instanceof types_1.Maintenance_Downtime) {
194
- tmpvaluetype.name = types_1.Maintenance_Downtime.className;
269
+ if (key === "downtime") {
270
+ tmpvaluetype.name = types_1.Maintenance_Downtime.className.replace("OD3_Maintenance_", "");
195
271
  tmpvaluetype.unit = "%";
196
272
  tmpvaluetype.type = "Number";
197
273
  }
198
- else if (value instanceof types_1.Maintenance_Frequency) {
199
- tmpvaluetype.name = types_1.Maintenance_Frequency.className;
274
+ else if (key === "frequency") {
275
+ tmpvaluetype.name = types_1.Maintenance_Frequency.className.replace("OD3_Maintenance_", "");
200
276
  tmpvaluetype.unit = "%";
201
277
  tmpvaluetype.type = "Number";
202
278
  }
203
- else if (value instanceof types_1.Maintenance_Priority) {
204
- tmpvaluetype.name = types_1.Maintenance_Priority.className;
279
+ else if (key === "priority") {
280
+ tmpvaluetype.name = types_1.Maintenance_Priority.className.replace("OD3_Maintenance_", "");
205
281
  tmpvaluetype.unit = "%";
206
282
  tmpvaluetype.type = "Number";
207
283
  }
208
- else if (value instanceof types_1.Maintenance_Restriction) {
209
- tmpvaluetype.name = types_1.Maintenance_Restriction.className;
284
+ else if (key === "restriction") {
285
+ tmpvaluetype.name = types_1.Maintenance_Restriction.className.replace("OD3_Maintenance_", "");
210
286
  tmpvaluetype.unit = "%";
211
287
  tmpvaluetype.type = "Number";
212
288
  }
213
- else if (value instanceof types_1.Maintenance_Ticket_Issuecategory) {
214
- tmpvaluetype.name = types_1.Maintenance_Ticket_Issuecategory.className;
289
+ else if (key === "issuecategory") {
290
+ tmpvaluetype.name = types_1.Maintenance_Ticket_Issuecategory.className.replace("OD3_Maintenance_", "");
215
291
  tmpvaluetype.unit = "";
216
292
  tmpvaluetype.type = "String";
217
293
  }
218
- else if (value instanceof types_1.Maintenance_Ticket_Kanban_State) {
219
- tmpvaluetype.name = types_1.Maintenance_Ticket_Kanban_State.className;
294
+ else if (key === "state") {
295
+ tmpvaluetype.name = types_1.Maintenance_Ticket_Kanban_State.className.replace("OD3_Maintenance_", "");
220
296
  tmpvaluetype.unit = "";
221
297
  tmpvaluetype.type = "String";
222
298
  }
223
- else if (value instanceof types_1.Maintenance_Ticket) {
224
- tmpvaluetype.name = types_1.Maintenance_Ticket.className;
299
+ else if (key === "ticket") {
300
+ tmpvaluetype.name = types_1.Maintenance_Ticket.className.replace("OD3_Maintenance_", "");
225
301
  tmpvaluetype.unit = "";
226
302
  tmpvaluetype.type = "String";
227
303
  }
228
- else if (value instanceof types_1.Maintenance_Ticket_Source) {
229
- tmpvaluetype.name = types_1.Maintenance_Ticket_Source.className;
304
+ else if (key === "source") {
305
+ tmpvaluetype.name = types_1.Maintenance_Ticket_Source.className.replace("OD3_Maintenance_", "");
230
306
  tmpvaluetype.unit = "";
231
307
  tmpvaluetype.type = "String";
232
308
  }
233
309
  return tmpvaluetype;
234
310
  });
235
311
  const dataitem = {
236
- id: "openservice_ticket",
237
- name: `Ticket`,
312
+ id: `openservice_ticket_${ticket.id}`,
313
+ name: `Ticket ${owticketobj.ticket.get("title")}`,
238
314
  source: source,
239
315
  values: [values],
240
- valueTypes: valueTypes.filter((v) => v.name !== ""),
316
+ valueTypes: valueTypes,
241
317
  meta: {},
242
318
  };
243
319
  console.log("Publishing ticket to openware: ", dataitem, "with values", JSON.stringify(dataitem.values));
@@ -552,7 +628,7 @@ async function saveMaterial(ticket, material, fetchOptions) {
552
628
  await materialObject.save(null, fetchOptions);
553
629
  }
554
630
  async function saveTicketProject(ticket, project, fetchOptions) {
555
- const projectObj = await new Parse.Query(types_1.Maintenance_Project).get(project);
631
+ const projectObj = await new Parse.Query(types_1.Maintenance_Project).get(project, fetchOptions);
556
632
  if (!projectObj)
557
633
  throw new Error("Project not found");
558
634
  const ticketProjectObject = new types_1.Maintenance_Ticket_Project({
@@ -562,7 +638,7 @@ async function saveTicketProject(ticket, project, fetchOptions) {
562
638
  user: ticket.get("user"),
563
639
  });
564
640
  await ticketProjectObject.save(null, fetchOptions);
565
- ticket.set("project", new types_1.Maintenance_Project({ objectId: project }));
641
+ ticket.set("project", projectObj);
566
642
  await ticket.save(null, fetchOptions);
567
643
  projectObj.relation("tickets").add(ticket);
568
644
  await projectObj.save(null, fetchOptions);
@@ -108,6 +108,7 @@ async function getTicketData(tickets) {
108
108
  const dailySchedule = getDailySchedule(ticket);
109
109
  const messages = getMessages(ticket);
110
110
  const material = getTicketMaterial(ticket);
111
+ const project = ticket.get("project")?.fetch({ useMasterKey: true });
111
112
  const dataPromises = await Promise.all([
112
113
  downtimes,
113
114
  duedate,
@@ -120,6 +121,7 @@ async function getTicketData(tickets) {
120
121
  dailySchedule,
121
122
  messages,
122
123
  material,
124
+ project,
123
125
  ]);
124
126
  return {
125
127
  ticket: ticket,
@@ -135,6 +137,7 @@ async function getTicketData(tickets) {
135
137
  messages: dataPromises[9]?.messages,
136
138
  assignedTo: [...assignedusers, ...assignedroles],
137
139
  material: dataPromises[10],
140
+ project: dataPromises[11],
138
141
  };
139
142
  });
140
143
  return await Promise.all(ticketDataPromises);
@@ -1,4 +1,4 @@
1
- import { Maintenance_Ticket, Maintenance_DailySchedule, Maintenance_Downtime, Maintenance_Duedate, Maintenance_Frequency, Maintenance_Issuecategory, Maintenance_Kanban_State, Maintenance_Message, Maintenance_Priority, Maintenance_Restriction, Source, Maintenance_Ticket_Material } from "../types";
1
+ import { Maintenance_Ticket, Maintenance_DailySchedule, Maintenance_Downtime, Maintenance_Duedate, Maintenance_Frequency, Maintenance_Issuecategory, Maintenance_Kanban_State, Maintenance_Message, Maintenance_Priority, Maintenance_Restriction, Source, Maintenance_Ticket_Material, Maintenance_Project } from "../types";
2
2
  export type TicketData = {
3
3
  ticket: Maintenance_Ticket;
4
4
  dailySchedule?: Maintenance_DailySchedule;
@@ -13,4 +13,5 @@ export type TicketData = {
13
13
  source?: Source;
14
14
  assignedTo?: Array<Parse.User | Parse.Role>;
15
15
  material?: Maintenance_Ticket_Material;
16
+ project?: Maintenance_Project;
16
17
  };
package/dist/index.js CHANGED
@@ -176,10 +176,14 @@ async function initDefaultData() {
176
176
  }
177
177
  }
178
178
  async function initPermissions() {
179
- const tenant = await new Parse.Query(types_1.Tenant)
179
+ const tenants = await new Parse.Query(types_1.Tenant)
180
180
  .descending("createdAt")
181
- .first({ useMasterKey: true });
182
- tenant && (await registerPermissions(tenant));
181
+ .find({ useMasterKey: true });
182
+ if (tenants) {
183
+ for await (const tenant of tenants) {
184
+ await registerPermissions(tenant);
185
+ }
186
+ }
183
187
  }
184
188
  /**
185
189
  * Register all permissions in the database, if not already registered.
@@ -189,6 +193,7 @@ async function registerPermissions(tenant) {
189
193
  (0, registerPermissions_1.getAllPermissions)().forEach((permission) => {
190
194
  new Parse.Query(types_1.Permission)
191
195
  .equalTo("key", permission.key)
196
+ .equalTo("tenant", tenant)
192
197
  .first({ useMasterKey: true })
193
198
  .then((result) => {
194
199
  if (!result) {
@@ -196,14 +201,10 @@ async function registerPermissions(tenant) {
196
201
  const newPermission = new types_1.Permission();
197
202
  newPermission.set("key", permission.key);
198
203
  newPermission.set("label", permission.label);
204
+ newPermission.set("tenant", tenant);
199
205
  newPermission.set("description", permission.description);
200
206
  newPermission.save({}, { useMasterKey: true });
201
207
  }
202
- else if (result.get("tenant") === undefined) {
203
- console.log("Update permission tenant to default tenant", permission.key);
204
- result.set("tenant", tenant);
205
- result.save({}, { useMasterKey: true });
206
- }
207
208
  else {
208
209
  console.log("Permission already exists", permission.key);
209
210
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openinc/parse-server-opendash",
3
- "version": "2.4.101",
3
+ "version": "2.4.103",
4
4
  "description": "Parse Server Cloud Code for open.DASH",
5
5
  "packageManager": "pnpm@10.2.1",
6
6
  "keywords": [