@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.
- package/dist/functions/openinc-openservice-save-ticket-data.d.ts +6 -6
- package/dist/functions/openinc-openservice-save-ticket-data.js +53 -9
- package/dist/functions/openinc-openservice-ticket-data.d.ts +9 -1
- package/dist/functions/openinc-openservice-ticket-data.js +5 -0
- package/dist/helper/BreeInstance.d.ts +16 -0
- package/dist/helper/BreeInstance.js +78 -0
- package/dist/helper/removeShorltyPreviousEntry.d.ts +2 -2
- package/dist/helper/removeShorltyPreviousEntry.js +6 -2
- package/dist/hooks/Maintenance_Downtime.js +32 -2
- package/dist/hooks/Maintenance_Duedate.js +46 -3
- package/dist/hooks/Maintenance_Frequency.js +32 -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 +38 -0
- package/dist/hooks/Maintenance_Priority.js +34 -4
- package/dist/hooks/Maintenance_Restriction.js +35 -3
- package/dist/hooks/Maintenance_Schedule_Template.js +11 -86
- package/dist/hooks/Maintenance_Ticket_Issuecategory.js +36 -4
- package/dist/hooks/Maintenance_Ticket_Kanban_State.js +41 -12
- package/dist/hooks/Maintenance_Ticket_Source.js +35 -5
- package/dist/hooks/Maintenance_Ticket_Title.js +32 -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/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/package.json +1 -1
- package/schema/Maintenance_Kanban_State.json +5 -0
- 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?: "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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<
|
|
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,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
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
32
|
-
ticket.set("latestPriorityValue",
|
|
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
|
}
|