@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
@@ -2,24 +2,38 @@
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.RESTRICTION.TITLE;
12
+ const TRANSLATION_CONTENT = TranslationKeys_1.MessageTranslationKeys.TICKETLOG.RESTRICTION.CONTENT;
13
+ const TRANSLATION_TITLE_MACHINELOG = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.RESTRICTION.TITLE;
14
+ const TRANSLATION_CONTENT_MACHINELOG = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.RESTRICTION.CONTENT;
7
15
  async function init() {
8
16
  (0, __1.beforeSaveHook)(types_1.Maintenance_Restriction, 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);
29
+ // if an entry was removed, remove the message as well
30
+ if (removedEntry)
31
+ (0, Maintenance_Message_1.removeLatestMessage)(removedEntry, TRANSLATION_TITLE, TRANSLATION_CONTENT);
18
32
  });
19
33
  (0, __1.afterSaveHook)(types_1.Maintenance_Restriction, async (request) => {
20
34
  const { object, original, user } = request;
21
35
  // 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) => {
36
+ const savedObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
23
37
  query.includeAll();
24
38
  query.equalTo("ticket", object.get("ticket"));
25
39
  query.notEqualTo("objectId", object.id);
@@ -27,6 +41,61 @@ async function init() {
27
41
  }, (first, second) => {
28
42
  return first.get("value") === second.get("value");
29
43
  });
30
- // TODO
44
+ // fetch necessary data
45
+ await savedObject.fetchWithInclude(["ticket"], {
46
+ useMasterKey: true,
47
+ });
48
+ const previous = await new Parse.Query(types_1.Maintenance_Restriction)
49
+ .includeAll()
50
+ .equalTo("ticket", savedObject.get("ticket"))
51
+ .notEqualTo("objectId", savedObject.id)
52
+ .descending("createdAt")
53
+ .first({ useMasterKey: true });
54
+ // create new message log
55
+ await new types_1.Maintenance_Message({
56
+ referencedObjectId: savedObject.get("ticket")?.id,
57
+ classname: savedObject.get("ticket")?.className,
58
+ title: TRANSLATION_TITLE,
59
+ content: TRANSLATION_CONTENT,
60
+ user: user,
61
+ tenant: user?.get("tenant"),
62
+ data: {
63
+ type: "system",
64
+ translation: {
65
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
66
+ old: previous?.get("value") ?? "Nicht vorhanden",
67
+ new: savedObject?.get("value"),
68
+ },
69
+ origin: {
70
+ id: savedObject.id,
71
+ classname: savedObject.className,
72
+ },
73
+ },
74
+ }).save(null, { useMasterKey: true });
75
+ // to machinelog
76
+ const source = (await (0, openinc_openservice_ticket_data_1.getTicketSource)(savedObject.get("ticket")))?.get("source");
77
+ if (source) {
78
+ await new types_1.Maintenance_Message({
79
+ referencedObjectId: source?.id,
80
+ classname: source?.className,
81
+ title: TRANSLATION_TITLE_MACHINELOG,
82
+ content: TRANSLATION_CONTENT_MACHINELOG,
83
+ user: user,
84
+ tenant: user?.get("tenant"),
85
+ data: {
86
+ type: "system",
87
+ translation: {
88
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
89
+ old: previous?.get("value") ?? "Nicht vorhanden",
90
+ new: savedObject?.get("value"),
91
+ ticketName: savedObject.get("ticket")?.get("title"),
92
+ },
93
+ origin: {
94
+ id: savedObject.get("ticket")?.id,
95
+ classname: savedObject.get("ticket")?.className,
96
+ },
97
+ },
98
+ }).save(null, { useMasterKey: true });
99
+ }
31
100
  });
32
101
  }
@@ -2,8 +2,12 @@
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 catchError_1 = require("../helper/catchError");
7
+ const TranslationKeys_1 = require("../helper/TranslationKeys");
6
8
  const types_1 = require("../types");
9
+ const TRANSLATION_TITLE = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.SCHEDULEEXECUTION.TITLE;
10
+ const TRANSLATION_CONTENT = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.SCHEDULEEXECUTION.CONTENT;
7
11
  async function init() {
8
12
  (0, __1.beforeSaveHook)(types_1.Maintenance_Schedule_Execution, async (request) => {
9
13
  const { object, original, user } = request;
@@ -12,6 +16,13 @@ async function init() {
12
16
  });
13
17
  (0, __1.afterSaveHook)(types_1.Maintenance_Schedule_Execution, async (request) => {
14
18
  const { object, original, user } = request;
19
+ // save schedule message to source
20
+ addMachinelogMessage(object, user);
21
+ //If this is an update, do nothing
22
+ if (original !== undefined) {
23
+ return;
24
+ }
25
+ //If this is a new object, create all steps from the origin
15
26
  const tenant = object.get("tenant")
16
27
  ? object.get("tenant")
17
28
  : Parse.User.current()
@@ -61,3 +72,28 @@ async function init() {
61
72
  }
62
73
  });
63
74
  }
75
+ async function addMachinelogMessage(object, user) {
76
+ const source = await object.get("source")?.fetch({ useMasterKey: true });
77
+ if (source)
78
+ new types_1.Maintenance_Message({
79
+ referencedObjectId: source.id,
80
+ classname: source.className,
81
+ title: TRANSLATION_TITLE,
82
+ content: TRANSLATION_CONTENT,
83
+ user: user,
84
+ tenant: user.get("tenant"),
85
+ displayAt: object.get("finishedAt") ?? object.get("createdAt"),
86
+ data: {
87
+ type: "system",
88
+ origin: {
89
+ id: object.id,
90
+ classname: object.className,
91
+ },
92
+ translation: {
93
+ title: object.get("title"),
94
+ description: object.get("description"),
95
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
96
+ },
97
+ },
98
+ }).save(null, { useMasterKey: true });
99
+ }
@@ -7,6 +7,7 @@ exports.init = init;
7
7
  const bree_1 = __importDefault(require("bree"));
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const __1 = require("..");
10
+ const BreeInstance_1 = __importDefault(require("../helper/BreeInstance"));
10
11
  const catchError_1 = require("../helper/catchError");
11
12
  const types_1 = require("../types");
12
13
  bree_1.default.extend(require("@breejs/ts-worker"));
@@ -19,10 +20,7 @@ async function init() {
19
20
  });
20
21
  (0, __1.afterSaveHook)(types_1.Maintenance_Schedule_Template, async (request) => {
21
22
  const { object, original, user } = request;
22
- //TODO: Create notification object
23
- //TODO: Send mail or anything that is enabled
24
- //TODO: Move bree to a separate file and use as singleton
25
- startBree([object]);
23
+ await addJobToBree([object]);
26
24
  });
27
25
  /**
28
26
  * This function is called upon initialization and uses bree to schedule all jobs.
@@ -30,44 +28,67 @@ async function init() {
30
28
  async function initScheduling() {
31
29
  console.log("Init Scheduling Maintenance_Schedule_Template jobs");
32
30
  //Get all Maintenance_Schedule_Template objects
33
- const [queryError, query] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Schedule_Template).find());
31
+ const [queryError, query] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Maintenance_Schedule_Template).find({
32
+ useMasterKey: true,
33
+ }));
34
34
  //Create an new bree object for all Maintenance_Schedule_Template objects that have cron.is_one_time = false
35
35
  if (queryError) {
36
36
  console.error("Error while querying Maintenance_Schedule_Template objects", queryError);
37
37
  return;
38
38
  }
39
- //TODO: Do I need to reschedule all jobs when server restarts?
39
+ await addJobToBree(query);
40
40
  }
41
- async function startBree(query) {
42
- console.log("Starting Bree");
43
- const jobs = [];
41
+ async function addJobToBree(query) {
44
42
  for (const schedule of query) {
43
+ console.log(`Adding job for schedule ${schedule.id}`);
45
44
  const cron = schedule.get("cron");
46
- if (cron["is_one_time"] === false) {
47
- if (cron["scheduletype"] === "human") {
48
- jobs.push({
49
- name: `Schedule ${schedule.id}`,
50
- path: node_path_1.default.join(__dirname, "..", "jobs", "open_service_notifyOnSchedule.js"),
51
- timeout: 0,
52
- interval: createHumanReadableFormat(cron["run_cron"]),
53
- hasSeconds: true,
54
- worker: {
55
- workerData: {
56
- scheduleId: schedule.id,
57
- ParseAppId: Parse.applicationId,
58
- ParseJSKey: Parse.javaScriptKey,
59
- ParseMasterKey: Parse.masterKey,
60
- ParseServerURL: Parse.serverURL,
45
+ try {
46
+ let newjob = undefined;
47
+ if (cron.is_one_time === false) {
48
+ if (cron.scheduletype === "human") {
49
+ newjob = {
50
+ name: `Schedule ${schedule.id}`,
51
+ path: node_path_1.default.join(__dirname, "..", "jobs", "open_service_notifyOnSchedule.js"),
52
+ timeout: 0,
53
+ interval: BreeInstance_1.default.createHumanReadableFormat(cron.run_cron),
54
+ hasSeconds: true,
55
+ worker: {
56
+ workerData: {
57
+ scheduleId: schedule.id,
58
+ ParseAppId: Parse.applicationId,
59
+ ParseJSKey: Parse.javaScriptKey,
60
+ ParseMasterKey: Parse.masterKey,
61
+ ParseServerURL: Parse.serverURL,
62
+ },
61
63
  },
62
- },
63
- });
64
+ };
65
+ }
66
+ else if (cron.scheduletype === "quartz") {
67
+ newjob = {
68
+ name: `Schedule ${schedule.id}`,
69
+ cron: cron.run_cron,
70
+ path: node_path_1.default.join(__dirname, "..", "jobs", "open_service_notifyOnSchedule.js"),
71
+ timeout: 0,
72
+ interval: 0,
73
+ hasSeconds: true,
74
+ worker: {
75
+ workerData: {
76
+ scheduleId: schedule.id,
77
+ ParseAppId: Parse.applicationId,
78
+ ParseJSKey: Parse.javaScriptKey,
79
+ ParseMasterKey: Parse.masterKey,
80
+ ParseServerURL: Parse.serverURL,
81
+ },
82
+ },
83
+ };
84
+ }
64
85
  }
65
- else if (cron["scheduletype"] === "quartz") {
66
- jobs.push({
86
+ else {
87
+ // If the job is a one time job, we will schedule it to run once
88
+ newjob = {
67
89
  name: `Schedule ${schedule.id}`,
68
- cron: cron["run_cron"],
90
+ date: cron.run_startdate,
69
91
  path: node_path_1.default.join(__dirname, "..", "jobs", "open_service_notifyOnSchedule.js"),
70
- timeout: 0,
71
92
  interval: 0,
72
93
  hasSeconds: true,
73
94
  worker: {
@@ -79,83 +100,30 @@ async function init() {
79
100
  ParseServerURL: Parse.serverURL,
80
101
  },
81
102
  },
82
- });
103
+ };
83
104
  }
105
+ if (newjob === undefined) {
106
+ console.error("newjob is undefined");
107
+ return;
108
+ }
109
+ //Get all jobs from bree and check whether the job already exists
110
+ const jobs = BreeInstance_1.default.getAllJobs();
111
+ let jobExists = false;
112
+ for (const job of jobs) {
113
+ if (job.name === newjob.name) {
114
+ jobExists = true;
115
+ break;
116
+ }
117
+ }
118
+ if (jobExists) {
119
+ console.log(`Job for schedule ${schedule.id} already exists`);
120
+ return;
121
+ }
122
+ await BreeInstance_1.default.getInstance().add(newjob);
123
+ }
124
+ catch (error) {
125
+ console.warn(`Error while adding job for schedule ${schedule.id}`, error);
84
126
  }
85
127
  }
86
- //Create bree object
87
- console.log("Creating bree object");
88
- const bree = new bree_1.default({
89
- errorHandler: (error, workerMetadata) => {
90
- console.error(`An error occurred in worker ${workerMetadata.name} with the following error: ${error}`);
91
- },
92
- workerMessageHandler: (message) => {
93
- console.log(`Worker ${message.name} sent the following message: ${message.message}`);
94
- },
95
- root: node_path_1.default.join(__dirname, "..", "jobs"),
96
- jobs: [...jobs],
97
- acceptedExtensions: ["js"],
98
- defaultExtension: "js",
99
- outputWorkerMetadata: false,
100
- });
101
- //Start bree object
102
- // const graceful = new Graceful({ brees: [bree] });
103
- // graceful.listen();
104
- (async () => {
105
- console.log("Starting bree");
106
- await bree.start();
107
- })();
108
- }
109
- // async function notifyOnSchedule() {
110
- // console.log("Notify on schedule");
111
- // console.log("Creating new ticket");
112
- // //Create a new ticket
113
- // const ticketObject = new Maintenance_Ticket();
114
- // await ticketObject.save(null, { useMasterKey: true });
115
- // console.log("Creating new notification object");
116
- // //Create a new notification object in the database, class name: OD3_Notification
117
- // const notificationObject = new Notification();
118
- // notificationObject.set("title", "Maintenance Notification");
119
- // notificationObject.set("description", "Maintenance is scheduled");
120
- // notificationObject.set("data", { test: "test" });
121
- // await notificationObject.save(null, { useMasterKey: true });
122
- // console.log("Ticket and Notification object created");
123
- // }
124
- function createHumanReadableFormat(value) {
125
- //value looks like this: "1 1 1 1 1 1 1"
126
- //1. seconds
127
- //2. minutes
128
- //3. hours
129
- //4. days
130
- //5. weeks
131
- //6. months
132
- //7. years
133
- const valueArray = value.split(" ");
134
- //Should be in the format: "every 1 second" when second is 1
135
- //If any value is 0, it should be ignored
136
- //Values should be separated by a comma
137
- const returnArray = [];
138
- if (valueArray[0] !== "0") {
139
- returnArray.push(`every ${valueArray[0]} seconds`);
140
- }
141
- if (valueArray[1] !== "0") {
142
- returnArray.push(`every ${valueArray[1]} minutes`);
143
- }
144
- if (valueArray[2] !== "0") {
145
- returnArray.push(`every ${valueArray[2]} hours`);
146
- }
147
- if (valueArray[3] !== "0") {
148
- returnArray.push(`every ${valueArray[3]} days`);
149
- }
150
- if (valueArray[4] !== "0") {
151
- returnArray.push(`every ${valueArray[4]} weeks`);
152
- }
153
- if (valueArray[5] !== "0") {
154
- returnArray.push(`every ${valueArray[5]} months`);
155
- }
156
- if (valueArray[6] !== "0") {
157
- returnArray.push(`every ${valueArray[6]} years`);
158
- }
159
- return returnArray.join(", ");
160
128
  }
161
129
  }
@@ -2,30 +2,100 @@
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.ISSUECATEGORY.TITLE;
12
+ const TRANSLATION_CONTENT = TranslationKeys_1.MessageTranslationKeys.TICKETLOG.ISSUECATEGORY.CONTENT;
13
+ const TRANSLATION_TITLE_MACHINELOG = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.ISSUECATEGORY.TITLE;
14
+ const TRANSLATION_CONTENT_MACHINELOG = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.ISSUECATEGORY.CONTENT;
7
15
  async function init() {
8
16
  (0, __1.beforeSaveHook)(types_1.Maintenance_Ticket_Issuecategory, 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_Ticket_Issuecategory, 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) => {
23
- query.includeAll();
33
+ const savedObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
24
34
  query.equalTo("ticket", object.get("ticket"));
25
35
  query.notEqualTo("objectId", object.id);
26
- return query;
27
36
  }, (first, second) => {
28
37
  return (first.get("issuecategory")?.id === second.get("issuecategory")?.id);
29
38
  });
39
+ // fetch necessary data
40
+ await savedObject.fetchWithInclude(["ticket", "issuecategory"], {
41
+ useMasterKey: true,
42
+ });
43
+ const previousIssue = await new Parse.Query(types_1.Maintenance_Ticket_Issuecategory)
44
+ .includeAll()
45
+ .equalTo("ticket", savedObject.get("ticket"))
46
+ .notEqualTo("objectId", savedObject.id)
47
+ .descending("createdAt")
48
+ .first({ useMasterKey: true });
49
+ const issue = await savedObject
50
+ .get("issuecategory")
51
+ ?.fetch({ useMasterKey: true });
52
+ // create new message log
53
+ await new types_1.Maintenance_Message({
54
+ referencedObjectId: savedObject.get("ticket")?.id,
55
+ classname: savedObject.get("ticket")?.className,
56
+ title: TRANSLATION_TITLE,
57
+ content: TRANSLATION_CONTENT,
58
+ user: user,
59
+ tenant: user?.get("tenant"),
60
+ data: {
61
+ type: "system",
62
+ translation: {
63
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
64
+ old: previousIssue?.get("issuecategory")?.get("name") ??
65
+ "Nicht vorhanden",
66
+ new: issue?.get("name"),
67
+ },
68
+ origin: {
69
+ id: savedObject.id,
70
+ classname: savedObject.className,
71
+ },
72
+ },
73
+ }).save(null, { useMasterKey: true });
74
+ // to machinelog
75
+ const source = (await (0, openinc_openservice_ticket_data_1.getTicketSource)(savedObject.get("ticket")))?.get("source");
76
+ if (source) {
77
+ await new types_1.Maintenance_Message({
78
+ referencedObjectId: source?.id,
79
+ classname: source?.className,
80
+ title: TRANSLATION_TITLE_MACHINELOG,
81
+ content: TRANSLATION_CONTENT_MACHINELOG,
82
+ user: user,
83
+ tenant: user?.get("tenant"),
84
+ data: {
85
+ type: "system",
86
+ translation: {
87
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
88
+ old: previousIssue?.get("issuecategory")?.get("name") ??
89
+ "Nicht vorhanden",
90
+ new: issue?.get("name"),
91
+ ticketName: savedObject.get("ticket")?.get("title"),
92
+ },
93
+ origin: {
94
+ id: savedObject.get("ticket")?.id,
95
+ classname: savedObject.get("ticket")?.className,
96
+ },
97
+ },
98
+ }).save(null, { useMasterKey: true });
99
+ }
30
100
  });
31
101
  }
@@ -2,8 +2,16 @@
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.KANBANSTATE.TITLE;
12
+ const TRANSLATION_CONTENT = TranslationKeys_1.MessageTranslationKeys.TICKETLOG.KANBANSTATE.CONTENT;
13
+ const TRANSLATION_TITLE_MACHINELOG = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.KANBANSTATE.TITLE;
14
+ const TRANSLATION_CONTENT_MACHINELOG = TranslationKeys_1.MessageTranslationKeys.MACHINELOG.KANBANSTATE.CONTENT;
7
15
  async function init() {
8
16
  (0, __1.beforeSaveHook)(types_1.Maintenance_Ticket_Kanban_State, async (request) => {
9
17
  const { object, original, user } = request;
@@ -15,43 +23,101 @@ async function init() {
15
23
  await (0, __1.requirePermission)(request, "maintenance:can-update-kanbanstate", "Permission denied.");
16
24
  }
17
25
  // Remove previous entry if it was created within 5 minutes
18
- await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
26
+ const removedEntry = await (0, removeShorltyPreviousEntry_1.removeShortlyPreviousEntry)(object, (query) => {
19
27
  query.equalTo("ticket", object.get("ticket"));
28
+ query.notEqualTo("objectId", object.id);
20
29
  query.descending("createdAt");
21
30
  return query;
22
31
  });
23
- // TODO
32
+ // if an entry was removed, remove the message as well
33
+ if (removedEntry)
34
+ (0, Maintenance_Message_1.removeLatestMessage)(removedEntry, TRANSLATION_TITLE, TRANSLATION_CONTENT);
24
35
  });
25
36
  (0, __1.afterSaveHook)(types_1.Maintenance_Ticket_Kanban_State, async (request) => {
26
37
  const { object, original, user } = request;
27
38
  // Remove entry if it has the same values as the previous entry so its simply reverted to the already existing entry
28
- const latestEntry = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
29
- query.includeAll();
39
+ const savedObject = await (0, removeShorltyPreviousEntry_1.removeEqualSaved)(object, (query) => {
30
40
  query.equalTo("ticket", object.get("ticket"));
31
41
  query.notEqualTo("objectId", object.id);
32
- return query;
33
42
  }, (first, second) => {
34
43
  return first.get("state")?.id === second.get("state")?.id;
35
44
  });
45
+ // fetch necessary data
46
+ await savedObject.fetchWithInclude(["ticket", "state"], {
47
+ useMasterKey: true,
48
+ });
49
+ const previousState = await new Parse.Query(types_1.Maintenance_Ticket_Kanban_State)
50
+ .includeAll()
51
+ .descending("createdAt")
52
+ .equalTo("ticket", savedObject.get("ticket"))
53
+ .notEqualTo("objectId", savedObject.id)
54
+ .first({ useMasterKey: true });
55
+ const state = await savedObject.get("state")?.fetch({ useMasterKey: true });
56
+ // create new message log
57
+ await new types_1.Maintenance_Message({
58
+ referencedObjectId: savedObject.get("ticket")?.id,
59
+ classname: savedObject.get("ticket")?.className,
60
+ title: TRANSLATION_TITLE,
61
+ content: TRANSLATION_CONTENT,
62
+ user: user,
63
+ tenant: user?.get("tenant"),
64
+ data: {
65
+ type: "system",
66
+ translation: {
67
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
68
+ old: previousState?.get("state").get("label") ?? "Nicht vorhanden",
69
+ new: state.get("label"),
70
+ },
71
+ origin: {
72
+ id: savedObject.id,
73
+ classname: savedObject.className,
74
+ },
75
+ },
76
+ }).save(null, { useMasterKey: true });
36
77
  // Update the current state of the ticket
37
78
  const currentTicketState = await new Parse.Query(types_1.Maintenance_Ticket_Kanban_State_Current)
38
- .equalTo("ticket", latestEntry.get("ticket"))
79
+ .equalTo("ticket", savedObject.get("ticket"))
39
80
  .first({ useMasterKey: true });
40
81
  // if the ticket is already in the current state table, update it
41
82
  if (currentTicketState) {
42
- currentTicketState.set("ticketState", latestEntry);
43
- currentTicketState.set("state", latestEntry.get("state"));
83
+ currentTicketState.set("ticketState", savedObject);
84
+ currentTicketState.set("state", savedObject.get("state"));
44
85
  await currentTicketState.save(null, { useMasterKey: true });
45
86
  }
46
87
  // if the ticket is not in the current state table, create a new entry
47
88
  else {
48
89
  const newTicketState = new types_1.Maintenance_Ticket_Kanban_State_Current({
49
- ticket: latestEntry.get("ticket"),
50
- ticketState: latestEntry,
51
- state: latestEntry.get("state"),
52
- tenant: latestEntry.get("tenant"),
90
+ ticket: savedObject.get("ticket"),
91
+ ticketState: savedObject,
92
+ state: savedObject.get("state"),
93
+ tenant: savedObject.get("tenant"),
53
94
  });
54
95
  await newTicketState.save(null, { useMasterKey: true });
55
96
  }
97
+ // to machinelog
98
+ const source = (await (0, openinc_openservice_ticket_data_1.getTicketSource)(savedObject.get("ticket")))?.get("source");
99
+ if (source) {
100
+ await new types_1.Maintenance_Message({
101
+ referencedObjectId: source?.id,
102
+ classname: source?.className,
103
+ title: TRANSLATION_TITLE_MACHINELOG,
104
+ content: TRANSLATION_CONTENT_MACHINELOG,
105
+ user: user,
106
+ tenant: user?.get("tenant"),
107
+ data: {
108
+ type: "system",
109
+ translation: {
110
+ username: (0, openinc_openservice_save_ticket_data_1.getUsername)(user),
111
+ old: previousState?.get("state").get("label") ?? "Nicht vorhanden",
112
+ new: state.get("label"),
113
+ ticketName: savedObject.get("ticket")?.get("title"),
114
+ },
115
+ origin: {
116
+ id: savedObject.get("ticket")?.id,
117
+ classname: savedObject.get("ticket")?.className,
118
+ },
119
+ },
120
+ }).save(null, { useMasterKey: true });
121
+ }
56
122
  });
57
123
  }