@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.
- package/dist/app_types/CRON_Types.d.ts +10 -0
- package/dist/app_types/CRON_Types.js +2 -0
- package/dist/functions/openinc-openservice-save-ticket-data.d.ts +10 -6
- package/dist/functions/openinc-openservice-save-ticket-data.js +99 -16
- package/dist/functions/openinc-openservice-ticket-data.d.ts +16 -1
- package/dist/functions/openinc-openservice-ticket-data.js +7 -1
- package/dist/helper/BreeInstance.d.ts +16 -0
- package/dist/helper/BreeInstance.js +78 -0
- package/dist/helper/TranslationKeys.d.ts +82 -0
- package/dist/helper/TranslationKeys.js +86 -0
- package/dist/helper/removeShorltyPreviousEntry.d.ts +2 -2
- package/dist/helper/removeShorltyPreviousEntry.js +6 -2
- package/dist/hooks/Maintenance_Downtime.js +69 -2
- package/dist/hooks/Maintenance_Duedate.js +91 -3
- package/dist/hooks/Maintenance_Frequency.js +69 -3
- package/dist/hooks/Maintenance_Kanban_State.js +10 -0
- package/dist/hooks/Maintenance_Message.d.ts +7 -0
- package/dist/hooks/Maintenance_Message.js +467 -1
- package/dist/hooks/Maintenance_Priority.js +71 -4
- package/dist/hooks/Maintenance_Restriction.js +72 -3
- package/dist/hooks/Maintenance_Schedule_Execution.js +36 -0
- package/dist/hooks/Maintenance_Schedule_Template.js +73 -105
- package/dist/hooks/Maintenance_Ticket_Issuecategory.js +74 -4
- package/dist/hooks/Maintenance_Ticket_Kanban_State.js +78 -12
- package/dist/hooks/Maintenance_Ticket_Source.js +84 -5
- package/dist/hooks/Maintenance_Ticket_Title.js +69 -3
- package/dist/hooks/Permission.js +0 -26
- package/dist/index.js +51 -0
- package/dist/jobs/index.d.ts +0 -0
- package/dist/jobs/index.js +2 -0
- package/dist/types/ML_DataSelection.d.ts +16 -0
- package/dist/types/ML_DataSelection.js +23 -0
- package/dist/types/Maintenance_Kanban_State.d.ts +3 -0
- package/dist/types/Maintenance_Kanban_State.js +6 -0
- package/dist/types/Maintenance_Schedule_Template.d.ts +3 -0
- package/dist/types/Maintenance_Schedule_Template.js +6 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +4 -2
- package/package.json +1 -1
- package/schema/ML_DataSelection.json +38 -0
- package/schema/Maintenance_Kanban_State.json +5 -0
- package/schema/Maintenance_Schedule_Template.json +4 -0
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { _User, Maintenance_Ticket } from "../types";
|
|
2
|
-
type MessageData = {
|
|
3
|
-
type?: "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
296
|
-
|
|
297
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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]
|
|
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<
|
|
2
|
-
export declare function removeEqualSaved<T extends Parse.Object>(entry: T, onQuery: (query: Parse.Query<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 =
|
|
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
|
}
|