@openinc/parse-server-opendash 2.4.94 → 2.4.96

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.
Files changed (42) hide show
  1. package/dist/app_types/CRON_Types.d.ts +10 -0
  2. package/dist/app_types/CRON_Types.js +2 -0
  3. package/dist/functions/openinc-openservice-save-ticket-data.d.ts +10 -6
  4. package/dist/functions/openinc-openservice-save-ticket-data.js +99 -16
  5. package/dist/functions/openinc-openservice-ticket-data.d.ts +16 -1
  6. package/dist/functions/openinc-openservice-ticket-data.js +7 -1
  7. package/dist/helper/BreeInstance.d.ts +16 -0
  8. package/dist/helper/BreeInstance.js +78 -0
  9. package/dist/helper/TranslationKeys.d.ts +82 -0
  10. package/dist/helper/TranslationKeys.js +86 -0
  11. package/dist/helper/removeShorltyPreviousEntry.d.ts +2 -2
  12. package/dist/helper/removeShorltyPreviousEntry.js +6 -2
  13. package/dist/hooks/Maintenance_Downtime.js +69 -2
  14. package/dist/hooks/Maintenance_Duedate.js +91 -3
  15. package/dist/hooks/Maintenance_Frequency.js +69 -3
  16. package/dist/hooks/Maintenance_Kanban_State.js +10 -0
  17. package/dist/hooks/Maintenance_Message.d.ts +7 -0
  18. package/dist/hooks/Maintenance_Message.js +467 -1
  19. package/dist/hooks/Maintenance_Priority.js +71 -4
  20. package/dist/hooks/Maintenance_Restriction.js +72 -3
  21. package/dist/hooks/Maintenance_Schedule_Execution.js +36 -0
  22. package/dist/hooks/Maintenance_Schedule_Template.js +73 -105
  23. package/dist/hooks/Maintenance_Ticket_Issuecategory.js +74 -4
  24. package/dist/hooks/Maintenance_Ticket_Kanban_State.js +78 -12
  25. package/dist/hooks/Maintenance_Ticket_Source.js +84 -5
  26. package/dist/hooks/Maintenance_Ticket_Title.js +69 -3
  27. package/dist/hooks/Permission.js +0 -26
  28. package/dist/index.js +51 -0
  29. package/dist/jobs/index.d.ts +0 -0
  30. package/dist/jobs/index.js +2 -0
  31. package/dist/types/ML_DataSelection.d.ts +16 -0
  32. package/dist/types/ML_DataSelection.js +23 -0
  33. package/dist/types/Maintenance_Kanban_State.d.ts +3 -0
  34. package/dist/types/Maintenance_Kanban_State.js +6 -0
  35. package/dist/types/Maintenance_Schedule_Template.d.ts +3 -0
  36. package/dist/types/Maintenance_Schedule_Template.js +6 -0
  37. package/dist/types/index.d.ts +2 -0
  38. package/dist/types/index.js +4 -2
  39. package/package.json +1 -1
  40. package/schema/ML_DataSelection.json +38 -0
  41. package/schema/Maintenance_Kanban_State.json +5 -0
  42. package/schema/Maintenance_Schedule_Template.json +4 -0
@@ -0,0 +1,10 @@
1
+ export type ScheduleType = "quartz" | "human";
2
+ export type ScheduleCronObjectType = {
3
+ scheduletype: ScheduleType;
4
+ run_cron: string;
5
+ run_startdate: Date;
6
+ run_enddate: Date;
7
+ is_week: boolean;
8
+ week_interval: number;
9
+ is_one_time: boolean;
10
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,10 +1,13 @@
1
1
  import { _User, Maintenance_Ticket } from "../types";
2
- type MessageData = {
3
- type?: "media" | "userinput" | "move" | "schedule_execution_step";
4
- headline?: string;
5
- description?: string;
6
- objectId?: string;
7
- translation?: any;
2
+ export type MessageData = {
3
+ type?: "userinput" | "system";
4
+ translation?: {
5
+ [key: string]: any;
6
+ };
7
+ origin?: {
8
+ id: string | number;
9
+ classname: string;
10
+ };
8
11
  };
9
12
  type MessageField = {
10
13
  title: string;
@@ -35,6 +38,7 @@ type Values = {
35
38
  state?: string;
36
39
  dailySchedule?: string;
37
40
  };
41
+ export declare function getUsername(user: _User | undefined): string;
38
42
  export declare function init(name: string): Promise<void>;
39
43
  export declare function saveTicketData(data: Values, user?: _User): Promise<Maintenance_Ticket>;
40
44
  export {};
@@ -1,9 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUsername = getUsername;
3
4
  exports.init = init;
4
5
  exports.saveTicketData = saveTicketData;
5
6
  const parse_1 = require("parse");
6
7
  const types_1 = require("../types");
8
+ function getUsername(user) {
9
+ if (!user)
10
+ return "System";
11
+ let username = "";
12
+ if (user?.get("firstname") && user?.get("lastname")) {
13
+ username = user?.get("firstname") + " " + user?.get("lastname");
14
+ }
15
+ else if (user?.get("name")) {
16
+ username = user.get("name");
17
+ }
18
+ else {
19
+ username = user?.getUsername();
20
+ }
21
+ return username ?? "System";
22
+ }
7
23
  async function init(name) {
8
24
  Parse.Cloud.define(name, handleRequest, {
9
25
  requireUser: true,
@@ -35,6 +51,9 @@ async function saveTicketData(data, user) {
35
51
  ? { sessionToken: user.getSessionToken() }
36
52
  : { useMasterKey: true };
37
53
  const ticket = await getTicketObject(data, user, fetchOptions);
54
+ // needs to be the first save to save a message before data change messages are created on ticket creation
55
+ if (data.message)
56
+ await saveMessage(ticket, data.message, fetchOptions, data);
38
57
  if (data.assignedTo !== undefined)
39
58
  await assignUsersAndRoles(ticket, data.assignedTo, fetchOptions, user);
40
59
  if (data.title)
@@ -55,17 +74,16 @@ async function saveTicketData(data, user) {
55
74
  await saveIssueCategory(ticket, data.issuecategory, fetchOptions);
56
75
  if (data.state)
57
76
  await saveState(ticket, data.state, fetchOptions);
58
- if (data.source)
59
- await saveSource(ticket, data.source, fetchOptions);
60
77
  if (data.media)
61
78
  await saveMedia(ticket, data.media, fetchOptions);
62
- if (data.message)
63
- await saveMessage(ticket, data.message, fetchOptions);
64
79
  // save defaults
65
80
  if (!data.issuecategory && !data.existingTicketId)
66
81
  await saveDefaultIssueCategory(ticket, fetchOptions);
67
82
  if (!data.state && !data.existingTicketId)
68
83
  await saveDefaultState(ticket, fetchOptions);
84
+ // save source last so the machinelog does not have the initialization messages of the ticket data
85
+ if (data.source)
86
+ await saveSource(ticket, data.source, fetchOptions);
69
87
  return ticket;
70
88
  }
71
89
  async function getTicketObject(value, user, fetchOptions) {
@@ -142,7 +160,7 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
142
160
  translation: {
143
161
  ticketName: ticket.get("title"),
144
162
  ticketId: ticket.id,
145
- username: assigningUser?.getUsername() ?? "System",
163
+ username: getUsername(assigningUser) ?? "System",
146
164
  },
147
165
  },
148
166
  isSent: false,
@@ -182,10 +200,44 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
182
200
  }
183
201
  }
184
202
  await types_1.Maintenance_Ticket_Assignment.saveAll(assignments, fetchOptions);
203
+ // SAVE ASSIGNMENT MESSAGE
204
+ // set the content for the message
205
+ let content = "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.none";
206
+ if (newUsers.length > 0 && newRoles.length > 0)
207
+ content =
208
+ "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.both";
209
+ else if (newUsers.length > 0)
210
+ content =
211
+ "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.user";
212
+ else if (newRoles.length > 0)
213
+ content =
214
+ "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.role";
215
+ await new types_1.Maintenance_Message({
216
+ referencedObjectId: ticket.id,
217
+ classname: types_1.Maintenance_Ticket.className,
218
+ title: "maintenance:ticket.message.assignment.changed.title",
219
+ content,
220
+ user: ticket.get("user"),
221
+ tenant: ticket.get("tenant"),
222
+ data: {
223
+ type: "system",
224
+ translation: {
225
+ username: getUsername(assigningUser),
226
+ userList: newUsers.map((u) => `'${u.get("username")}'`).join(", "),
227
+ roleList: newRoles.map((r) => `'${r.get("label")}'`).join(", "),
228
+ ticketName: ticket.get("title"),
229
+ },
230
+ origin: {
231
+ id: ticket.id,
232
+ classname: ticket.className,
233
+ },
234
+ },
235
+ }).save(null, fetchOptions);
185
236
  await ticket.save(null, fetchOptions);
186
237
  }
187
238
  async function saveTicketTitle(ticket, fetchOptions) {
188
239
  const ticketTitle = await new Parse.Query(types_1.Maintenance_Ticket_Title)
240
+ .descending("createdAt")
189
241
  .equalTo("ticket", ticket)
190
242
  .first(fetchOptions);
191
243
  if ((ticketTitle && ticketTitle.get("title") !== ticket.get("title")) ||
@@ -284,25 +336,57 @@ async function saveSource(ticket, source, fetchOptions) {
284
336
  });
285
337
  await tSource.save(null, fetchOptions);
286
338
  }
287
- async function saveMessage(ticket, message, fetchOptions) {
288
- const msg = new types_1.Maintenance_Message({
339
+ async function saveMessage(ticket, message, fetchOptions, values) {
340
+ // create new message log
341
+ await new types_1.Maintenance_Message({
289
342
  content: message.description,
290
343
  referencedObjectId: ticket.id,
291
344
  classname: types_1.Maintenance_Ticket.className,
292
345
  tenant: ticket.get("tenant"),
293
346
  user: ticket.get("user"),
294
347
  title: message.title,
295
- data: message.data,
296
- });
297
- await msg.save(null, fetchOptions);
348
+ data: {
349
+ origin: { id: ticket.id, classname: ticket.className }, // default
350
+ ...message.data,
351
+ },
352
+ }).save(null, fetchOptions);
353
+ // to machinelog
354
+ // if needed, this saves a message to the machinelog when a message is saved to the ticket
355
+ // this counts for user input and the ticket creation
356
+ // const source = values.source
357
+ // ? await new Parse.Query(Source).get(values.source, fetchOptions)
358
+ // : (await getTicketSource(ticket))?.get("source");
359
+ // if (source) {
360
+ // await new Maintenance_Message({
361
+ // referencedObjectId: source.id,
362
+ // classname: source.className,
363
+ // title: message.title,
364
+ // content: message.description,
365
+ // user: ticket.get("user"),
366
+ // tenant: ticket.get("tenant"),
367
+ // data: {
368
+ // type: "system",
369
+ // translation: {
370
+ // username: getUsername(ticket.get("user") as _User),
371
+ // old: "Nicht vorhanden",
372
+ // new: ticket.get("title"),
373
+ // ticketName: ticket.get("title"),
374
+ // },
375
+ // origin: {
376
+ // id: ticket.id,
377
+ // classname: ticket.className,
378
+ // },
379
+ // ...message.data,
380
+ // } as MessageData,
381
+ // }).save(null, fetchOptions);
382
+ // }
298
383
  }
299
384
  async function saveDefaultIssueCategory(ticket, fetchOptions) {
300
385
  const catchAll = await new Parse.Query(types_1.Maintenance_Issuecategory)
301
386
  .equalTo("catchall", true)
302
387
  .first(fetchOptions);
303
- if (!catchAll) {
304
- throw new Error("CatchAll issue category not found");
305
- }
388
+ if (!catchAll)
389
+ return;
306
390
  const issueCategory = new types_1.Maintenance_Ticket_Issuecategory({
307
391
  ticket,
308
392
  issuecategory: catchAll,
@@ -315,9 +399,8 @@ async function saveDefaultState(ticket, fetchOptions) {
315
399
  const newState = await new Parse.Query(types_1.Maintenance_Kanban_State)
316
400
  .equalTo("isInbox", true)
317
401
  .first(fetchOptions);
318
- if (!newState) {
319
- throw new Error("Inbox state not found");
320
- }
402
+ if (!newState)
403
+ return;
321
404
  const state = new types_1.Maintenance_Ticket_Kanban_State({
322
405
  ticket,
323
406
  state: newState,
@@ -1,5 +1,6 @@
1
+ import { Maintenance_Ticket, Maintenance_Ticket_Source } from "../types";
1
2
  type FilterParams = {
2
- attribute: "objectId" | "state" | "issuecategory" | "user" | "role" | "userRole" | "source";
3
+ attribute: "objectId" | "state" | "issuecategory" | "user" | "role" | "userRole" | "createdUser" | "source";
3
4
  /**
4
5
  * the objectId of the attribute to filter by
5
6
  */
@@ -20,4 +21,18 @@ export type FetchParams = {
20
21
  config: Array<FetchObject>;
21
22
  };
22
23
  export declare function init(name: string): Promise<void>;
24
+ /**
25
+ * Fetches the source for a ticket
26
+ * @param ticket
27
+ * @param ticketIds
28
+ */
29
+ export declare function getTicketSource(ticket: Maintenance_Ticket): Promise<Maintenance_Ticket_Source | undefined>;
30
+ /**
31
+ * Creates a distinct array based on the getId function and can afterwards filter the array
32
+ * @param arr the array to get distinct values from
33
+ * @param getId the identifier function to get the id of the item
34
+ * @param filter the filter function to filter the array afterwards
35
+ * @returns an array with distinct values based on the getId function
36
+ */
37
+ export declare function arrayToDistinct<T>(arr: Array<T>, getId: (item: T) => string, filter?: (item: T) => boolean): Array<T>;
23
38
  export {};
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.init = init;
4
+ exports.getTicketSource = getTicketSource;
5
+ exports.arrayToDistinct = arrayToDistinct;
4
6
  const catchError_1 = require("../helper/catchError");
5
7
  const types_1 = require("../types");
6
8
  async function init(name) {
@@ -125,7 +127,7 @@ async function getTicketData(tickets) {
125
127
  source: dataPromises[6]?.get("source"),
126
128
  state: dataPromises[7]?.get("state"),
127
129
  dailySchedule: dataPromises[8],
128
- messages: dataPromises[9].messages,
130
+ messages: dataPromises[9]?.messages,
129
131
  assignedTo: [...assignedusers, ...assignedroles],
130
132
  };
131
133
  });
@@ -314,6 +316,10 @@ const filterQueryMap = {
314
316
  .matchesQuery("users", userQuery);
315
317
  query.include("assignedroles").matchesQuery("assignedroles", roleQuery);
316
318
  },
319
+ createdUser: async (query, value) => {
320
+ query.include("user");
321
+ query.equalTo("user", new Parse.User({ objectId: value }));
322
+ },
317
323
  };
318
324
  /**
319
325
  * Creates a distinct array based on the getId function and can afterwards filter the array
@@ -0,0 +1,16 @@
1
+ import Bree from "bree";
2
+ declare class BreeInstance {
3
+ private static instance;
4
+ private static jobs;
5
+ private constructor();
6
+ static getInstance(): Bree;
7
+ static getAllJobs(): Bree.Job[];
8
+ /**
9
+ * Converts a cron-like string into a human-readable format.
10
+ *
11
+ * @param value - The cron-like string to convert.
12
+ * @returns A human-readable string representing the cron-like schedule.
13
+ */
14
+ static createHumanReadableFormat(value: string): string;
15
+ }
16
+ export default BreeInstance;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const bree_1 = __importDefault(require("bree"));
7
+ class BreeInstance {
8
+ constructor() { }
9
+ static getInstance() {
10
+ if (this.instance === null) {
11
+ // Create a new instance of Bree
12
+ this.instance = new bree_1.default({
13
+ // Bree configuration options
14
+ errorHandler: (error, workerMetadata) => {
15
+ console.error(`An error occurred in worker ${workerMetadata.name} with the following error: ${error}`);
16
+ },
17
+ workerMessageHandler: (message) => {
18
+ console.log(`Worker ${message.name} sent the following message: ${message.message}`);
19
+ },
20
+ root: false, //path.join(__dirname, "..", "jobs")
21
+ jobs: this.jobs,
22
+ acceptedExtensions: ["js"],
23
+ defaultExtension: "js",
24
+ outputWorkerMetadata: false,
25
+ });
26
+ }
27
+ return this.instance;
28
+ }
29
+ static getAllJobs() {
30
+ return this.jobs;
31
+ }
32
+ /**
33
+ * Converts a cron-like string into a human-readable format.
34
+ *
35
+ * @param value - The cron-like string to convert.
36
+ * @returns A human-readable string representing the cron-like schedule.
37
+ */
38
+ static createHumanReadableFormat(value) {
39
+ //value looks like this: "1 1 1 1 1 1 1"
40
+ //1. seconds
41
+ //2. minutes
42
+ //3. hours
43
+ //4. days
44
+ //5. weeks
45
+ //6. months
46
+ //7. years
47
+ const valueArray = value.split(" ");
48
+ //Should be in the format: "every 1 second" when second is 1
49
+ //If any value is 0, it should be ignored
50
+ //Values should be separated by a comma
51
+ const returnArray = [];
52
+ if (valueArray[0] !== "0") {
53
+ returnArray.push(`every ${valueArray[0]} seconds`);
54
+ }
55
+ if (valueArray[1] !== "0") {
56
+ returnArray.push(`every ${valueArray[1]} minutes`);
57
+ }
58
+ if (valueArray[2] !== "0") {
59
+ returnArray.push(`every ${valueArray[2]} hours`);
60
+ }
61
+ if (valueArray[3] !== "0") {
62
+ returnArray.push(`every ${valueArray[3]} days`);
63
+ }
64
+ if (valueArray[4] !== "0") {
65
+ returnArray.push(`every ${valueArray[4]} weeks`);
66
+ }
67
+ if (valueArray[5] !== "0") {
68
+ returnArray.push(`every ${valueArray[5]} months`);
69
+ }
70
+ if (valueArray[6] !== "0") {
71
+ returnArray.push(`every ${valueArray[6]} years`);
72
+ }
73
+ return returnArray.join(", ");
74
+ }
75
+ }
76
+ BreeInstance.instance = null;
77
+ BreeInstance.jobs = [];
78
+ exports.default = BreeInstance;
@@ -0,0 +1,82 @@
1
+ export declare class MessageTranslationKeys {
2
+ static TICKETLOG: {
3
+ TITLE: {
4
+ TITLE: string;
5
+ CONTENT: string;
6
+ };
7
+ PRIORITY: {
8
+ TITLE: string;
9
+ CONTENT: string;
10
+ };
11
+ DUEDATE: {
12
+ TITLE: string;
13
+ CONTENT: string;
14
+ };
15
+ FREQUENCY: {
16
+ TITLE: string;
17
+ CONTENT: string;
18
+ };
19
+ ISSUECATEGORY: {
20
+ TITLE: string;
21
+ CONTENT: string;
22
+ };
23
+ KANBANSTATE: {
24
+ TITLE: string;
25
+ CONTENT: string;
26
+ };
27
+ RESTRICTION: {
28
+ TITLE: string;
29
+ CONTENT: string;
30
+ };
31
+ SOURCE: {
32
+ TITLE: string;
33
+ CONTENT: string;
34
+ };
35
+ DOWNTIME: {
36
+ TITLE: string;
37
+ CONTENT: string;
38
+ };
39
+ };
40
+ static MACHINELOG: {
41
+ TITLE: {
42
+ TITLE: string;
43
+ CONTENT: string;
44
+ };
45
+ PRIORITY: {
46
+ TITLE: string;
47
+ CONTENT: string;
48
+ };
49
+ DUEDATE: {
50
+ TITLE: string;
51
+ CONTENT: string;
52
+ };
53
+ FREQUENCY: {
54
+ TITLE: string;
55
+ CONTENT: string;
56
+ };
57
+ ISSUECATEGORY: {
58
+ TITLE: string;
59
+ CONTENT: string;
60
+ };
61
+ KANBANSTATE: {
62
+ TITLE: string;
63
+ CONTENT: string;
64
+ };
65
+ RESTRICTION: {
66
+ TITLE: string;
67
+ CONTENT: string;
68
+ };
69
+ SOURCE: {
70
+ TITLE: string;
71
+ CONTENT: string;
72
+ };
73
+ DOWNTIME: {
74
+ TITLE: string;
75
+ CONTENT: string;
76
+ };
77
+ SCHEDULEEXECUTION: {
78
+ TITLE: string;
79
+ CONTENT: string;
80
+ };
81
+ };
82
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageTranslationKeys = void 0;
4
+ class MessageTranslationKeys {
5
+ }
6
+ exports.MessageTranslationKeys = MessageTranslationKeys;
7
+ MessageTranslationKeys.TICKETLOG = {
8
+ TITLE: {
9
+ TITLE: "maintenance:ticket.message.title.changed.title",
10
+ CONTENT: "maintenance:ticket.message.title.changed.content",
11
+ },
12
+ PRIORITY: {
13
+ TITLE: "maintenance:ticket.message.priority.changed.title",
14
+ CONTENT: "maintenance:ticket.message.priority.changed.content",
15
+ },
16
+ DUEDATE: {
17
+ TITLE: "maintenance:ticket.message.duedate.changed.title",
18
+ CONTENT: "maintenance:ticket.message.duedate.changed.content",
19
+ },
20
+ FREQUENCY: {
21
+ TITLE: "maintenance:ticket.message.frequency.changed.title",
22
+ CONTENT: "maintenance:ticket.message.frequency.changed.content",
23
+ },
24
+ ISSUECATEGORY: {
25
+ TITLE: "maintenance:ticket.message.issuecategory.changed.title",
26
+ CONTENT: "maintenance:ticket.message.issuecategory.changed.content",
27
+ },
28
+ KANBANSTATE: {
29
+ TITLE: "maintenance:ticket.message.kanbanstate.changed.title",
30
+ CONTENT: "maintenance:ticket.message.kanbanstate.changed.content",
31
+ },
32
+ RESTRICTION: {
33
+ TITLE: "maintenance:ticket.message.restriction.changed.title",
34
+ CONTENT: "maintenance:ticket.message.restriction.changed.content",
35
+ },
36
+ SOURCE: {
37
+ TITLE: "maintenance:ticket.message.source.changed.title",
38
+ CONTENT: "maintenance:ticket.message.source.changed.content",
39
+ },
40
+ DOWNTIME: {
41
+ TITLE: "maintenance:ticket.message.downtime.changed.title",
42
+ CONTENT: "maintenance:ticket.message.downtime.changed.content",
43
+ },
44
+ };
45
+ MessageTranslationKeys.MACHINELOG = {
46
+ TITLE: {
47
+ TITLE: "maintenance:machinelog.message.title.changed.title",
48
+ CONTENT: "maintenance:machinelog.message.title.changed.content",
49
+ },
50
+ PRIORITY: {
51
+ TITLE: "maintenance:machinelog.message.priority.changed.title",
52
+ CONTENT: "maintenance:machinelog.message.priority.changed.content",
53
+ },
54
+ DUEDATE: {
55
+ TITLE: "maintenance:machinelog.message.duedate.changed.title",
56
+ CONTENT: "maintenance:machinelog.message.duedate.changed.content",
57
+ },
58
+ FREQUENCY: {
59
+ TITLE: "maintenance:machinelog.message.frequency.changed.title",
60
+ CONTENT: "maintenance:machinelog.message.frequency.changed.content",
61
+ },
62
+ ISSUECATEGORY: {
63
+ TITLE: "maintenance:machinelog.message.issuecategory.changed.title",
64
+ CONTENT: "maintenance:machinelog.message.issuecategory.changed.content",
65
+ },
66
+ KANBANSTATE: {
67
+ TITLE: "maintenance:machinelog.message.kanbanstate.changed.title",
68
+ CONTENT: "maintenance:machinelog.message.kanbanstate.changed.content",
69
+ },
70
+ RESTRICTION: {
71
+ TITLE: "maintenance:machinelog.message.restriction.changed.title",
72
+ CONTENT: "maintenance:machinelog.message.restriction.changed.content",
73
+ },
74
+ SOURCE: {
75
+ TITLE: "maintenance:machinelog.message.source.changed.title",
76
+ CONTENT: "maintenance:machinelog.message.source.changed.content",
77
+ },
78
+ DOWNTIME: {
79
+ TITLE: "maintenance:machinelog.message.downtime.changed.title",
80
+ CONTENT: "maintenance:machinelog.message.downtime.changed.content",
81
+ },
82
+ SCHEDULEEXECUTION: {
83
+ TITLE: "maintenance:schedule.message.execution.title",
84
+ CONTENT: "maintenance:schedule.message.execution.content",
85
+ },
86
+ };
@@ -1,2 +1,2 @@
1
- export declare function removeShortlyPreviousEntry<T extends Parse.Object>(entry: T, onQuery: (query: Parse.Query<T>) => Parse.Query<T>, overrideTime?: number): Promise<void>;
2
- export declare function removeEqualSaved<T extends Parse.Object>(entry: T, onQuery: (query: Parse.Query<T>) => Parse.Query<T>, isEqual: (frist: T, second: T) => boolean): Promise<T>;
1
+ export declare function removeShortlyPreviousEntry<T extends Parse.Object>(entry: T, onQuery: (query: Parse.Query<T>) => Parse.Query<T>, overrideTime?: number): Promise<T | undefined>;
2
+ export declare function removeEqualSaved<T extends Parse.Object>(entry: T, onQuery: (query: Parse.Query<T>) => void, isEqual: (first: T, second: T) => boolean): Promise<T>;
@@ -9,11 +9,15 @@ async function removeShortlyPreviousEntry(entry, onQuery, overrideTime = 300) {
9
9
  const currentTime = new Date().getTime();
10
10
  const timeDifferenceInSeconds = (currentTime - lastEntryTime) / 1000;
11
11
  if (timeDifferenceInSeconds <= overrideTime) {
12
- await object?.destroy({ useMasterKey: true });
12
+ return await object?.destroy({ useMasterKey: true });
13
13
  }
14
+ return undefined;
14
15
  }
15
16
  async function removeEqualSaved(entry, onQuery, isEqual) {
16
- const query = onQuery(new Parse.Query(entry.className));
17
+ const query = new Parse.Query(entry.className)
18
+ .descending("createdAt")
19
+ .includeAll();
20
+ onQuery(query);
17
21
  const object = await query.first({ useMasterKey: true });
18
22
  if (object && isEqual(entry, object)) {
19
23
  await entry.destroy({ useMasterKey: true });
@@ -2,24 +2,35 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.init = init;
4
4
  const __1 = require("..");
5
+ const openinc_openservice_save_ticket_data_1 = require("../functions/openinc-openservice-save-ticket-data");
6
+ const openinc_openservice_ticket_data_1 = require("../functions/openinc-openservice-ticket-data");
5
7
  const removeShorltyPreviousEntry_1 = require("../helper/removeShorltyPreviousEntry");
8
+ const TranslationKeys_1 = require("../helper/TranslationKeys");
6
9
  const types_1 = require("../types");
10
+ const Maintenance_Message_1 = require("./Maintenance_Message");
11
+ const TRANSLATION_TITLE = TranslationKeys_1.MessageTranslationKeys.TICKETLOG.DOWNTIME.TITLE;
12
+ const TRANSLATION_CONTENT = TranslationKeys_1.MessageTranslationKeys.TICKETLOG.DOWNTIME.CONTENT;
13
+ const TRANSLATION_TITLE_MACHINELOG = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.DOWNTIME.TITLE;
14
+ const TRANSLATION_CONTENT_MACHINELOG = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.DOWNTIME.CONTENT;
7
15
  async function init() {
8
16
  (0, __1.beforeSaveHook)(types_1.Maintenance_Downtime, async (request) => {
9
17
  const { object, original, user } = request;
10
18
  await (0, __1.defaultHandler)(request);
11
19
  await (0, __1.defaultAclHandler)(request);
12
20
  // Remove previous entry if it was created within 5 minutes
13
- await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
21
+ const removedEntry = await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
14
22
  query.equalTo("ticket", object.get("ticket"));
15
23
  query.descending("createdAt");
16
24
  return query;
17
25
  });
26
+ // if an entry was removed, remove the message as well
27
+ if (removedEntry)
28
+ (0, Maintenance_Message_1.removeLatestMessage)(removedEntry, TRANSLATION_TITLE, TRANSLATION_CONTENT);
18
29
  });
19
30
  (0, __1.afterSaveHook)(types_1.Maintenance_Downtime, async (request) => {
20
31
  const { object, original, user } = request;
21
32
  // Remove entry if it has the same values as the previous entry so its simply reverted to the already existing entry
22
- await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
33
+ const savedObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
23
34
  query.includeAll();
24
35
  query.equalTo("ticket", object.get("ticket"));
25
36
  query.notEqualTo("objectId", object.id);
@@ -27,5 +38,61 @@ async function init() {
27
38
  }, (first, second) => {
28
39
  return first.get("value") === second.get("value");
29
40
  });
41
+ // fetch necessary data
42
+ await savedObject.fetchWithInclude(["ticket"], {
43
+ useMasterKey: true,
44
+ });
45
+ const previous = await new Parse.Query(types_1.Maintenance_Downtime)
46
+ .includeAll()
47
+ .equalTo("ticket", savedObject.get("ticket"))
48
+ .notEqualTo("objectId", savedObject.id)
49
+ .descending("createdAt")
50
+ .first({ useMasterKey: true });
51
+ // create new message log
52
+ await new types_1.Maintenance_Message({
53
+ referencedObjectId: savedObject.get("ticket")?.id,
54
+ classname: savedObject.get("ticket")?.className,
55
+ title: TRANSLATION_TITLE,
56
+ content: TRANSLATION_CONTENT,
57
+ user: user,
58
+ tenant: user?.get("tenant"),
59
+ data: {
60
+ type: "system",
61
+ translation: {
62
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
63
+ old: previous?.get("value") ?? "Nicht vorhanden",
64
+ new: savedObject?.get("value"),
65
+ },
66
+ origin: {
67
+ id: savedObject.id,
68
+ classname: savedObject.className,
69
+ },
70
+ },
71
+ }).save(null, { useMasterKey: true });
72
+ // to machinelog
73
+ const source = (await (0, openinc_openservice_ticket_data_1.getTicketSource)(savedObject.get("ticket")))?.get("source");
74
+ if (source) {
75
+ await new types_1.Maintenance_Message({
76
+ referencedObjectId: source?.id,
77
+ classname: source?.className,
78
+ title: TRANSLATION_TITLE_MACHINELOG,
79
+ content: TRANSLATION_CONTENT_MACHINELOG,
80
+ user: user,
81
+ tenant: user?.get("tenant"),
82
+ data: {
83
+ type: "system",
84
+ translation: {
85
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
86
+ old: previous?.get("value") ?? "Nicht vorhanden",
87
+ new: savedObject?.get("value"),
88
+ ticketName: savedObject.get("ticket")?.get("title"),
89
+ },
90
+ origin: {
91
+ id: savedObject.get("ticket")?.id,
92
+ classname: savedObject.get("ticket")?.className,
93
+ },
94
+ },
95
+ }).save(null, { useMasterKey: true });
96
+ }
30
97
  });
31
98
  }