@openinc/parse-server-opendash 2.4.94 → 2.4.95

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 (32) hide show
  1. package/dist/functions/openinc-openservice-save-ticket-data.d.ts +6 -6
  2. package/dist/functions/openinc-openservice-save-ticket-data.js +53 -9
  3. package/dist/functions/openinc-openservice-ticket-data.d.ts +9 -1
  4. package/dist/functions/openinc-openservice-ticket-data.js +5 -0
  5. package/dist/helper/BreeInstance.d.ts +16 -0
  6. package/dist/helper/BreeInstance.js +78 -0
  7. package/dist/helper/removeShorltyPreviousEntry.d.ts +2 -2
  8. package/dist/helper/removeShorltyPreviousEntry.js +6 -2
  9. package/dist/hooks/Maintenance_Downtime.js +32 -2
  10. package/dist/hooks/Maintenance_Duedate.js +46 -3
  11. package/dist/hooks/Maintenance_Frequency.js +32 -3
  12. package/dist/hooks/Maintenance_Kanban_State.js +10 -0
  13. package/dist/hooks/Maintenance_Message.d.ts +7 -0
  14. package/dist/hooks/Maintenance_Message.js +38 -0
  15. package/dist/hooks/Maintenance_Priority.js +34 -4
  16. package/dist/hooks/Maintenance_Restriction.js +35 -3
  17. package/dist/hooks/Maintenance_Schedule_Template.js +11 -86
  18. package/dist/hooks/Maintenance_Ticket_Issuecategory.js +36 -4
  19. package/dist/hooks/Maintenance_Ticket_Kanban_State.js +41 -12
  20. package/dist/hooks/Maintenance_Ticket_Source.js +35 -5
  21. package/dist/hooks/Maintenance_Ticket_Title.js +32 -3
  22. package/dist/hooks/Permission.js +0 -26
  23. package/dist/index.js +51 -0
  24. package/dist/jobs/index.d.ts +0 -0
  25. package/dist/jobs/index.js +2 -0
  26. package/dist/types/Maintenance_Kanban_State.d.ts +3 -0
  27. package/dist/types/Maintenance_Kanban_State.js +6 -0
  28. package/dist/types/Maintenance_Schedule_Template.d.ts +3 -0
  29. package/dist/types/Maintenance_Schedule_Template.js +6 -0
  30. package/package.json +1 -1
  31. package/schema/Maintenance_Kanban_State.json +5 -0
  32. package/schema/Maintenance_Schedule_Template.json +4 -0
@@ -1,10 +1,9 @@
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
+ };
8
7
  };
9
8
  type MessageField = {
10
9
  title: string;
@@ -35,6 +34,7 @@ type Values = {
35
34
  state?: string;
36
35
  dailySchedule?: string;
37
36
  };
37
+ export declare function getUsername(user: _User | undefined): string;
38
38
  export declare function init(name: string): Promise<void>;
39
39
  export declare function saveTicketData(data: Values, user?: _User): Promise<Maintenance_Ticket>;
40
40
  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);
38
57
  if (data.assignedTo !== undefined)
39
58
  await assignUsersAndRoles(ticket, data.assignedTo, fetchOptions, user);
40
59
  if (data.title)
@@ -59,8 +78,6 @@ async function saveTicketData(data, user) {
59
78
  await saveSource(ticket, data.source, fetchOptions);
60
79
  if (data.media)
61
80
  await saveMedia(ticket, data.media, fetchOptions);
62
- if (data.message)
63
- await saveMessage(ticket, data.message, fetchOptions);
64
81
  // save defaults
65
82
  if (!data.issuecategory && !data.existingTicketId)
66
83
  await saveDefaultIssueCategory(ticket, fetchOptions);
@@ -142,7 +159,7 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
142
159
  translation: {
143
160
  ticketName: ticket.get("title"),
144
161
  ticketId: ticket.id,
145
- username: assigningUser?.getUsername() ?? "System",
162
+ username: getUsername(assigningUser) ?? "System",
146
163
  },
147
164
  },
148
165
  isSent: false,
@@ -182,10 +199,39 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
182
199
  }
183
200
  }
184
201
  await types_1.Maintenance_Ticket_Assignment.saveAll(assignments, fetchOptions);
202
+ // SAVE ASSIGNMENT MESSAGE
203
+ // set the content for the message
204
+ let content = "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.none";
205
+ if (newUsers.length > 0 && newRoles.length > 0)
206
+ content =
207
+ "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.both";
208
+ else if (newUsers.length > 0)
209
+ content =
210
+ "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.user";
211
+ else if (newRoles.length > 0)
212
+ content =
213
+ "maintenance:ticket.eventlist.OD3_Maintenance_Ticket_Assignment.role";
214
+ await new types_1.Maintenance_Message({
215
+ referencedObjectId: ticket.id,
216
+ classname: types_1.Maintenance_Ticket.className,
217
+ title: "maintenance:ticket.message.assignment.changed.title",
218
+ content,
219
+ user: ticket.get("user"),
220
+ tenant: ticket.get("tenant"),
221
+ data: {
222
+ type: "system",
223
+ translation: {
224
+ username: getUsername(assigningUser),
225
+ userList: newUsers.map((u) => `'${u.get("username")}'`).join(", "),
226
+ roleList: newRoles.map((r) => `'${r.get("label")}'`).join(", "),
227
+ },
228
+ },
229
+ }).save(null, fetchOptions);
185
230
  await ticket.save(null, fetchOptions);
186
231
  }
187
232
  async function saveTicketTitle(ticket, fetchOptions) {
188
233
  const ticketTitle = await new Parse.Query(types_1.Maintenance_Ticket_Title)
234
+ .descending("createdAt")
189
235
  .equalTo("ticket", ticket)
190
236
  .first(fetchOptions);
191
237
  if ((ticketTitle && ticketTitle.get("title") !== ticket.get("title")) ||
@@ -300,9 +346,8 @@ async function saveDefaultIssueCategory(ticket, fetchOptions) {
300
346
  const catchAll = await new Parse.Query(types_1.Maintenance_Issuecategory)
301
347
  .equalTo("catchall", true)
302
348
  .first(fetchOptions);
303
- if (!catchAll) {
304
- throw new Error("CatchAll issue category not found");
305
- }
349
+ if (!catchAll)
350
+ return;
306
351
  const issueCategory = new types_1.Maintenance_Ticket_Issuecategory({
307
352
  ticket,
308
353
  issuecategory: catchAll,
@@ -315,9 +360,8 @@ async function saveDefaultState(ticket, fetchOptions) {
315
360
  const newState = await new Parse.Query(types_1.Maintenance_Kanban_State)
316
361
  .equalTo("isInbox", true)
317
362
  .first(fetchOptions);
318
- if (!newState) {
319
- throw new Error("Inbox state not found");
320
- }
363
+ if (!newState)
364
+ return;
321
365
  const state = new types_1.Maintenance_Ticket_Kanban_State({
322
366
  ticket,
323
367
  state: newState,
@@ -1,5 +1,5 @@
1
1
  type FilterParams = {
2
- attribute: "objectId" | "state" | "issuecategory" | "user" | "role" | "userRole" | "source";
2
+ attribute: "objectId" | "state" | "issuecategory" | "user" | "role" | "userRole" | "createdUser" | "source";
3
3
  /**
4
4
  * the objectId of the attribute to filter by
5
5
  */
@@ -20,4 +20,12 @@ export type FetchParams = {
20
20
  config: Array<FetchObject>;
21
21
  };
22
22
  export declare function init(name: string): Promise<void>;
23
+ /**
24
+ * Creates a distinct array based on the getId function and can afterwards filter the array
25
+ * @param arr the array to get distinct values from
26
+ * @param getId the identifier function to get the id of the item
27
+ * @param filter the filter function to filter the array afterwards
28
+ * @returns an array with distinct values based on the getId function
29
+ */
30
+ export declare function arrayToDistinct<T>(arr: Array<T>, getId: (item: T) => string, filter?: (item: T) => boolean): Array<T>;
23
31
  export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.init = init;
4
+ exports.arrayToDistinct = arrayToDistinct;
4
5
  const catchError_1 = require("../helper/catchError");
5
6
  const types_1 = require("../types");
6
7
  async function init(name) {
@@ -314,6 +315,10 @@ const filterQueryMap = {
314
315
  .matchesQuery("users", userQuery);
315
316
  query.include("assignedroles").matchesQuery("assignedroles", roleQuery);
316
317
  },
318
+ createdUser: async (query, value) => {
319
+ query.include("user");
320
+ query.equalTo("user", new Parse.User({ objectId: value }));
321
+ },
317
322
  };
318
323
  /**
319
324
  * 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;
@@ -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,31 @@
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");
5
6
  const removeShorltyPreviousEntry_1 = require("../helper/removeShorltyPreviousEntry");
6
7
  const types_1 = require("../types");
8
+ const Maintenance_Message_1 = require("./Maintenance_Message");
9
+ const TRANSLATION_TITLE = "maintenance:ticket.message.downtime.changed.title";
10
+ const TRANSLATION_CONTENT = "maintenance:ticket.message.downtime.changed.content";
7
11
  async function init() {
8
12
  (0, __1.beforeSaveHook)(types_1.Maintenance_Downtime, async (request) => {
9
13
  const { object, original, user } = request;
10
14
  await (0, __1.defaultHandler)(request);
11
15
  await (0, __1.defaultAclHandler)(request);
12
16
  // Remove previous entry if it was created within 5 minutes
13
- await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
17
+ const removedEntry = await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
14
18
  query.equalTo("ticket", object.get("ticket"));
15
19
  query.descending("createdAt");
16
20
  return query;
17
21
  });
22
+ // if an entry was removed, remove the message as well
23
+ if (removedEntry)
24
+ (0, Maintenance_Message_1.removeLatestMessage)(removedEntry, TRANSLATION_TITLE, TRANSLATION_CONTENT);
18
25
  });
19
26
  (0, __1.afterSaveHook)(types_1.Maintenance_Downtime, async (request) => {
20
27
  const { object, original, user } = request;
21
28
  // 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) => {
29
+ const savedObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
23
30
  query.includeAll();
24
31
  query.equalTo("ticket", object.get("ticket"));
25
32
  query.notEqualTo("objectId", object.id);
@@ -27,5 +34,28 @@ async function init() {
27
34
  }, (first, second) => {
28
35
  return first.get("value") === second.get("value");
29
36
  });
37
+ const previous = await new Parse.Query(types_1.Maintenance_Downtime)
38
+ .includeAll()
39
+ .equalTo("ticket", savedObject.get("ticket"))
40
+ .notEqualTo("objectId", savedObject.id)
41
+ .descending("createdAt")
42
+ .first({ useMasterKey: true });
43
+ // create new message log
44
+ await new types_1.Maintenance_Message({
45
+ referencedObjectId: savedObject.get("ticket")?.id,
46
+ classname: savedObject.get("ticket")?.className,
47
+ title: TRANSLATION_TITLE,
48
+ content: TRANSLATION_CONTENT,
49
+ user: user,
50
+ tenant: user?.get("tenant"),
51
+ data: {
52
+ type: "system",
53
+ translation: {
54
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
55
+ old: previous?.get("value") ?? "Nicht vorhanden",
56
+ new: savedObject?.get("value"),
57
+ },
58
+ },
59
+ }).save(null, { useMasterKey: true });
30
60
  });
31
61
  }
@@ -2,24 +2,31 @@
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");
5
6
  const removeShorltyPreviousEntry_1 = require("../helper/removeShorltyPreviousEntry");
6
7
  const types_1 = require("../types");
8
+ const Maintenance_Message_1 = require("./Maintenance_Message");
9
+ const TRANSLATION_TITLE = "maintenance:ticket.message.duedate.changed.title";
10
+ const TRANSLATION_CONTENT = "maintenance:ticket.message.duedate.changed.content";
7
11
  async function init() {
8
12
  (0, __1.beforeSaveHook)(types_1.Maintenance_Duedate, async (request) => {
9
13
  const { object, original, user } = request;
10
14
  await (0, __1.defaultHandler)(request);
11
15
  await (0, __1.defaultAclHandler)(request);
12
16
  // Remove previous entry if it was created within 5 minutes
13
- await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
17
+ const removedEntry = await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
14
18
  query.equalTo("ticket", object.get("ticket"));
15
19
  query.descending("createdAt");
16
20
  return query;
17
21
  });
22
+ // if an entry was removed, remove the message as well
23
+ if (removedEntry)
24
+ (0, Maintenance_Message_1.removeLatestMessage)(removedEntry, TRANSLATION_TITLE, TRANSLATION_CONTENT);
18
25
  });
19
26
  (0, __1.afterSaveHook)(types_1.Maintenance_Duedate, async (request) => {
20
27
  const { object, original, user } = request;
21
28
  // 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) => {
29
+ const savedObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
23
30
  query.includeAll();
24
31
  query.equalTo("ticket", object.get("ticket"));
25
32
  query.notEqualTo("objectId", object.id);
@@ -27,6 +34,42 @@ async function init() {
27
34
  }, (first, second) => {
28
35
  return first.get("end")?.getTime() === second.get("end")?.getTime();
29
36
  });
30
- // TODO
37
+ const previous = await new Parse.Query(types_1.Maintenance_Duedate)
38
+ .includeAll()
39
+ .equalTo("ticket", savedObject.get("ticket"))
40
+ .notEqualTo("objectId", savedObject.id)
41
+ .descending("createdAt")
42
+ .first({ useMasterKey: true });
43
+ const dateFormat = {
44
+ year: "numeric",
45
+ month: "2-digit",
46
+ day: "2-digit",
47
+ hour: "2-digit",
48
+ minute: "2-digit",
49
+ };
50
+ // create new message log
51
+ await new types_1.Maintenance_Message({
52
+ referencedObjectId: savedObject.get("ticket")?.id,
53
+ classname: savedObject.get("ticket")?.className,
54
+ title: TRANSLATION_TITLE,
55
+ content: TRANSLATION_CONTENT,
56
+ user: user,
57
+ tenant: user?.get("tenant"),
58
+ data: {
59
+ type: "system",
60
+ translation: {
61
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
62
+ oldstart: previous?.get("start")?.toLocaleDateString("de-DE", dateFormat) ??
63
+ "Nicht vorhanden",
64
+ oldend: previous?.get("end")?.toLocaleDateString("de-DE", dateFormat) ??
65
+ "Nicht vorhanden",
66
+ newstart: savedObject
67
+ ?.get("start")
68
+ ?.toLocaleDateString("de-DE", dateFormat) ?? "Nicht vorhanden",
69
+ newend: savedObject?.get("end")?.toLocaleDateString("de-DE", dateFormat) ??
70
+ "Nicht vorhanden",
71
+ },
72
+ },
73
+ }).save(null, { useMasterKey: true });
31
74
  });
32
75
  }
@@ -2,24 +2,31 @@
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");
5
6
  const removeShorltyPreviousEntry_1 = require("../helper/removeShorltyPreviousEntry");
6
7
  const types_1 = require("../types");
8
+ const Maintenance_Message_1 = require("./Maintenance_Message");
9
+ const TRANSLATION_TITLE = "maintenance:ticket.message.frequency.changed.title";
10
+ const TRANSLATION_CONTENT = "maintenance:ticket.message.frequency.changed.content";
7
11
  async function init() {
8
12
  (0, __1.beforeSaveHook)(types_1.Maintenance_Frequency, async (request) => {
9
13
  const { object, original, user } = request;
10
14
  await (0, __1.defaultHandler)(request);
11
15
  await (0, __1.defaultAclHandler)(request);
12
16
  // Remove previous entry if it was created within 5 minutes
13
- await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
17
+ const removedEntry = await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
14
18
  query.equalTo("ticket", object.get("ticket"));
15
19
  query.descending("createdAt");
16
20
  return query;
17
21
  });
22
+ // if an entry was removed, remove the message as well
23
+ if (removedEntry)
24
+ (0, Maintenance_Message_1.removeLatestMessage)(removedEntry, TRANSLATION_TITLE, TRANSLATION_CONTENT);
18
25
  });
19
26
  (0, __1.afterSaveHook)(types_1.Maintenance_Frequency, async (request) => {
20
27
  const { object, original, user } = request;
21
28
  // 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) => {
29
+ const savedObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
23
30
  query.includeAll();
24
31
  query.equalTo("ticket", object.get("ticket"));
25
32
  query.notEqualTo("objectId", object.id);
@@ -27,6 +34,28 @@ async function init() {
27
34
  }, (first, second) => {
28
35
  return first.get("value") === second.get("value");
29
36
  });
30
- // TODO
37
+ const previous = await new Parse.Query(types_1.Maintenance_Frequency)
38
+ .includeAll()
39
+ .equalTo("ticket", savedObject.get("ticket"))
40
+ .notEqualTo("objectId", savedObject.id)
41
+ .descending("createdAt")
42
+ .first({ useMasterKey: true });
43
+ // create new message log
44
+ await new types_1.Maintenance_Message({
45
+ referencedObjectId: savedObject.get("ticket")?.id,
46
+ classname: savedObject.get("ticket")?.className,
47
+ title: TRANSLATION_TITLE,
48
+ content: TRANSLATION_CONTENT,
49
+ user: user,
50
+ tenant: user?.get("tenant"),
51
+ data: {
52
+ type: "system",
53
+ translation: {
54
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
55
+ old: previous?.get("value") ?? "Nicht vorhanden",
56
+ new: savedObject?.get("value"),
57
+ },
58
+ },
59
+ }).save(null, { useMasterKey: true });
31
60
  });
32
61
  }
@@ -4,6 +4,7 @@ exports.init = init;
4
4
  const __1 = require("..");
5
5
  const types_1 = require("../types");
6
6
  async function init() {
7
+ initEnabledFlag();
7
8
  (0, __1.beforeSaveHook)(types_1.Maintenance_Kanban_State, async (request) => {
8
9
  const { object, original, user } = request;
9
10
  await (0, __1.defaultHandler)(request);
@@ -15,3 +16,12 @@ async function init() {
15
16
  // TODO
16
17
  });
17
18
  }
19
+ async function initEnabledFlag() {
20
+ const objects = await new Parse.Query(types_1.Maintenance_Kanban_State)
21
+ .limit(1000000000)
22
+ .find({ useMasterKey: true });
23
+ const promises = objects.map((object) => {
24
+ object.save({ enabled: object.enabled === undefined ? true : object.enabled }, { useMasterKey: true });
25
+ });
26
+ await Promise.all(promises);
27
+ }
@@ -1 +1,8 @@
1
1
  export declare function init(): Promise<void>;
2
+ /**
3
+ * Removes the latest message. as context the title and content are used (should be translation strings)
4
+ * @param entry the entry to remove the message for
5
+ * @param title translation string for the title
6
+ * @param content translation string for the content
7
+ */
8
+ export declare function removeLatestMessage(entry: Parse.Object, title: string, content: string): Promise<boolean>;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.init = init;
4
+ exports.removeLatestMessage = removeLatestMessage;
4
5
  const __1 = require("..");
5
6
  const types_1 = require("../types");
6
7
  async function init() {
@@ -11,6 +12,23 @@ async function init() {
11
12
  await message.save(null, { useMasterKey: true });
12
13
  }
13
14
  }, { useMasterKey: true });
15
+ // get all massage_body content and put it inside the message content
16
+ const bodies = await new Parse.Query(types_1.Maintenance_Message_Body)
17
+ .includeAll()
18
+ .find({
19
+ useMasterKey: true,
20
+ });
21
+ for (const body of bodies) {
22
+ const message = body.get("message");
23
+ if (!message)
24
+ continue;
25
+ const currentContent = message.get("content");
26
+ const bodyContent = body.get("content");
27
+ if (!currentContent && !bodyContent)
28
+ continue;
29
+ message.set("content", (currentContent ? currentContent + "\n" : "") + (bodyContent ?? ""));
30
+ await message.save(null, { useMasterKey: true });
31
+ }
14
32
  (0, __1.beforeSaveHook)(types_1.Maintenance_Message, async (request) => {
15
33
  const { object, original, user, master } = request;
16
34
  await (0, __1.defaultHandler)(request);
@@ -24,3 +42,23 @@ async function init() {
24
42
  const { object, original, user, master } = request;
25
43
  });
26
44
  }
45
+ /**
46
+ * Removes the latest message. as context the title and content are used (should be translation strings)
47
+ * @param entry the entry to remove the message for
48
+ * @param title translation string for the title
49
+ * @param content translation string for the content
50
+ */
51
+ async function removeLatestMessage(entry, title, content) {
52
+ const message = await new Parse.Query(types_1.Maintenance_Message)
53
+ .descending("createdAt")
54
+ .equalTo("referencedObjectId", entry.get("ticket")?.id)
55
+ .equalTo("classname", entry.get("ticket")?.className)
56
+ .equalTo("title", title)
57
+ .equalTo("content", content)
58
+ .first({ useMasterKey: true });
59
+ if (message) {
60
+ await message.destroy({ useMasterKey: true });
61
+ return true;
62
+ }
63
+ return false;
64
+ }
@@ -2,24 +2,31 @@
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");
5
6
  const removeShorltyPreviousEntry_1 = require("../helper/removeShorltyPreviousEntry");
6
7
  const types_1 = require("../types");
8
+ const Maintenance_Message_1 = require("./Maintenance_Message");
9
+ const TRANSLATION_TITLE = "maintenance:ticket.message.priority.changed.title";
10
+ const TRANSLATION_CONTENT = "maintenance:ticket.message.priority.changed.content";
7
11
  async function init() {
8
12
  (0, __1.beforeSaveHook)(types_1.Maintenance_Priority, async (request) => {
9
13
  const { object, original, user } = request;
10
14
  await (0, __1.defaultHandler)(request);
11
15
  await (0, __1.defaultAclHandler)(request);
12
16
  // Remove previous entry if it was created within 5 minutes
13
- await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
17
+ const removedEntry = await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
14
18
  query.equalTo("ticket", object.get("ticket"));
15
19
  query.descending("createdAt");
16
20
  return query;
17
21
  });
22
+ // if an entry was removed, remove the message as well
23
+ if (removedEntry)
24
+ (0, Maintenance_Message_1.removeLatestMessage)(removedEntry, TRANSLATION_TITLE, TRANSLATION_CONTENT);
18
25
  });
19
26
  (0, __1.afterSaveHook)(types_1.Maintenance_Priority, async (request) => {
20
27
  const { object, original, user } = request;
21
28
  // Remove entry if it has the same values as the previous entry so its simply reverted to the already existing entry
22
- const lastObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
29
+ const savedObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
23
30
  query.includeAll();
24
31
  query.equalTo("ticket", object.get("ticket"));
25
32
  query.notEqualTo("objectId", object.id);
@@ -27,9 +34,32 @@ async function init() {
27
34
  }, (first, second) => {
28
35
  return first.get("value") === second.get("value");
29
36
  });
37
+ const previousPrio = await new Parse.Query(types_1.Maintenance_Priority)
38
+ .includeAll()
39
+ .equalTo("ticket", savedObject.get("ticket"))
40
+ .notEqualTo("objectId", savedObject.id)
41
+ .descending("createdAt")
42
+ .first({ useMasterKey: true });
43
+ // create new message log
44
+ await new types_1.Maintenance_Message({
45
+ referencedObjectId: savedObject.get("ticket")?.id,
46
+ classname: savedObject.get("ticket")?.className,
47
+ title: TRANSLATION_TITLE,
48
+ content: TRANSLATION_CONTENT,
49
+ user: user,
50
+ tenant: user?.get("tenant"),
51
+ data: {
52
+ type: "system",
53
+ translation: {
54
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
55
+ old: previousPrio?.get("value") ?? "Nicht vorhanden",
56
+ new: savedObject?.get("value"),
57
+ },
58
+ },
59
+ }).save(null, { useMasterKey: true });
30
60
  //Save object.id in object.ticket.latestPriority
31
- const ticket = lastObject.get("ticket");
32
- ticket.set("latestPriorityValue", lastObject.get("value"));
61
+ const ticket = savedObject.get("ticket");
62
+ ticket.set("latestPriorityValue", savedObject.get("value"));
33
63
  await ticket.save(null, { useMasterKey: true });
34
64
  });
35
65
  }