@openinc/parse-server-opendash 3.6.2 → 3.8.0
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/features/openservice/functions/saveDescription.d.ts +4 -0
- package/dist/features/openservice/functions/saveDescription.js +7 -0
- package/dist/features/openservice/functions/saveMessage.js +0 -17
- package/dist/features/openservice/index.d.ts +2 -0
- package/dist/features/openservice/index.js +5 -1
- package/dist/features/openservice/init.d.ts +1 -0
- package/dist/features/openservice/init.js +25 -0
- package/dist/features/openservice/types/SaveValues.d.ts +1 -0
- package/dist/functions/openinc-auth-login-microsoft.d.ts +1 -0
- package/dist/functions/openinc-auth-login-microsoft.js +65 -0
- package/dist/functions/openinc-openservice-save-ticket-data.js +3 -1
- package/dist/index.js +2 -1
- package/dist/types/Maintenance_Ticket.d.ts +1 -0
- package/package.json +2 -1
- package/schema/Maintenance_Ticket.json +4 -0
- package/schema/Maintenance_Ticket_FormConfig.json +5 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Maintenance_Ticket } from "../../../types";
|
|
2
|
+
import { FetchOptions } from "../types/FetchOptions";
|
|
3
|
+
import { SaveValues } from "../types/SaveValues";
|
|
4
|
+
export declare function saveDescription(ticket: Maintenance_Ticket, data: SaveValues, fetchOptions: FetchOptions): Promise<void>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.saveDescription = saveDescription;
|
|
4
|
+
async function saveDescription(ticket, data, fetchOptions) {
|
|
5
|
+
ticket.set("description", data.description);
|
|
6
|
+
await ticket.save(null, fetchOptions);
|
|
7
|
+
}
|
|
@@ -3,23 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.saveMessage = saveMessage;
|
|
4
4
|
const types_1 = require("../../../types");
|
|
5
5
|
async function saveMessage(ticket, message, fetchOptions, values) {
|
|
6
|
-
if (values.existingTicketId &&
|
|
7
|
-
message.title === "maintenance:ticket.update.message.title") {
|
|
8
|
-
const description = await new Parse.Query(types_1.Maintenance_Message)
|
|
9
|
-
.equalTo("referencedObjectId", ticket.id)
|
|
10
|
-
.equalTo("classname", types_1.Maintenance_Ticket.className)
|
|
11
|
-
.equalTo("title", "maintenance:ticket.create.database.subject.1")
|
|
12
|
-
.first(fetchOptions);
|
|
13
|
-
if (description) {
|
|
14
|
-
// dont do anything when description is the same
|
|
15
|
-
if (description.content === message.description)
|
|
16
|
-
return;
|
|
17
|
-
// update description
|
|
18
|
-
description.set("content", message.description);
|
|
19
|
-
await description.save(null, fetchOptions);
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
6
|
// create new message log
|
|
24
7
|
await new types_1.Maintenance_Message({
|
|
25
8
|
content: message.description,
|
|
@@ -16,7 +16,9 @@ export { saveState, saveDefaultState } from "./functions/saveState";
|
|
|
16
16
|
export { saveSource } from "./functions/saveSource";
|
|
17
17
|
export { saveProject } from "./functions/saveProject";
|
|
18
18
|
export { saveMessage } from "./functions/saveMessage";
|
|
19
|
+
export { saveDescription } from "./functions/saveDescription";
|
|
19
20
|
export { saveMedia } from "./functions/saveMedia";
|
|
20
21
|
export { saveTicketMeta } from "./functions/saveTicketMeta";
|
|
21
22
|
export { saveIssueCategory, saveDefaultIssueCategory, } from "./functions/saveIssuecategory";
|
|
22
23
|
export { getTicketObject } from "./functions/getTicketObject";
|
|
24
|
+
export { init } from "./init";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getTicketObject = exports.saveDefaultIssueCategory = exports.saveIssueCategory = exports.saveTicketMeta = exports.saveMedia = exports.saveMessage = exports.saveProject = exports.saveSource = exports.saveDefaultState = exports.saveState = exports.saveDuedate = exports.saveTicketTitle = exports.saveMaterial = exports.saveRestriction = exports.saveDowntime = exports.saveFrequency = exports.savePriority = exports.assignUsersAndRoles = exports.OpenserviceMessageTranslationKeys = void 0;
|
|
3
|
+
exports.init = exports.getTicketObject = exports.saveDefaultIssueCategory = exports.saveIssueCategory = exports.saveTicketMeta = exports.saveMedia = exports.saveDescription = exports.saveMessage = exports.saveProject = exports.saveSource = exports.saveDefaultState = exports.saveState = exports.saveDuedate = exports.saveTicketTitle = exports.saveMaterial = exports.saveRestriction = exports.saveDowntime = exports.saveFrequency = exports.savePriority = exports.assignUsersAndRoles = exports.OpenserviceMessageTranslationKeys = void 0;
|
|
4
4
|
var OpenserviceTranslationKeys_1 = require("./types/OpenserviceTranslationKeys");
|
|
5
5
|
Object.defineProperty(exports, "OpenserviceMessageTranslationKeys", { enumerable: true, get: function () { return OpenserviceTranslationKeys_1.OpenserviceMessageTranslationKeys; } });
|
|
6
6
|
var assignUsersAndRoles_1 = require("./functions/assignUsersAndRoles");
|
|
@@ -28,6 +28,8 @@ var saveProject_1 = require("./functions/saveProject");
|
|
|
28
28
|
Object.defineProperty(exports, "saveProject", { enumerable: true, get: function () { return saveProject_1.saveProject; } });
|
|
29
29
|
var saveMessage_1 = require("./functions/saveMessage");
|
|
30
30
|
Object.defineProperty(exports, "saveMessage", { enumerable: true, get: function () { return saveMessage_1.saveMessage; } });
|
|
31
|
+
var saveDescription_1 = require("./functions/saveDescription");
|
|
32
|
+
Object.defineProperty(exports, "saveDescription", { enumerable: true, get: function () { return saveDescription_1.saveDescription; } });
|
|
31
33
|
var saveMedia_1 = require("./functions/saveMedia");
|
|
32
34
|
Object.defineProperty(exports, "saveMedia", { enumerable: true, get: function () { return saveMedia_1.saveMedia; } });
|
|
33
35
|
var saveTicketMeta_1 = require("./functions/saveTicketMeta");
|
|
@@ -37,3 +39,5 @@ Object.defineProperty(exports, "saveIssueCategory", { enumerable: true, get: fun
|
|
|
37
39
|
Object.defineProperty(exports, "saveDefaultIssueCategory", { enumerable: true, get: function () { return saveIssuecategory_1.saveDefaultIssueCategory; } });
|
|
38
40
|
var getTicketObject_1 = require("./functions/getTicketObject");
|
|
39
41
|
Object.defineProperty(exports, "getTicketObject", { enumerable: true, get: function () { return getTicketObject_1.getTicketObject; } });
|
|
42
|
+
var init_1 = require("./init");
|
|
43
|
+
Object.defineProperty(exports, "init", { enumerable: true, get: function () { return init_1.init; } });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function init(): Promise<void>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.init = init;
|
|
4
|
+
const types_1 = require("../../types");
|
|
5
|
+
async function init() {
|
|
6
|
+
console.log("open.SERVICE feature initialized.");
|
|
7
|
+
while (true) {
|
|
8
|
+
const query = new Parse.Query(types_1.Maintenance_Ticket).doesNotExist("description");
|
|
9
|
+
query.limit(1000);
|
|
10
|
+
const tickets = await query.find({ useMasterKey: true });
|
|
11
|
+
if (tickets.length === 0)
|
|
12
|
+
break;
|
|
13
|
+
const allCreationMessages = await new Parse.Query(types_1.Maintenance_Message)
|
|
14
|
+
.equalTo("classname", types_1.Maintenance_Ticket.className)
|
|
15
|
+
.equalTo("title", "maintenance:ticket.create.database.subject.1")
|
|
16
|
+
.containedIn("referencedObjectId", tickets.map((ticket) => ticket.id))
|
|
17
|
+
.limit(1000000)
|
|
18
|
+
.find({ useMasterKey: true });
|
|
19
|
+
for (const ticket of tickets) {
|
|
20
|
+
const foundMessage = allCreationMessages.find((message) => message.get("referencedObjectId") === ticket.id);
|
|
21
|
+
ticket.set("description", foundMessage?.get("content") ?? " ");
|
|
22
|
+
}
|
|
23
|
+
await Parse.Object.saveAll(tickets, { useMasterKey: true });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function init(name: string): Promise<void>;
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
exports.init = init;
|
|
7
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
+
const jwks_rsa_1 = __importDefault(require("jwks-rsa"));
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
const tenantId = process.env.MICROSOFT_TENANT_ID;
|
|
11
|
+
const appId = process.env.MICROSOFT_APP_ID;
|
|
12
|
+
// Setup JWKS client for Microsoft (replace TENANT_ID)
|
|
13
|
+
const client = (0, jwks_rsa_1.default)({
|
|
14
|
+
jwksUri: `https://login.microsoftonline.com/${tenantId}/discovery/v2.0/keys`,
|
|
15
|
+
});
|
|
16
|
+
function getKey(header, callback) {
|
|
17
|
+
if (!header.kid) {
|
|
18
|
+
return callback(new Error("No kid found in token header"));
|
|
19
|
+
}
|
|
20
|
+
client.getSigningKey(header.kid, (err, key) => {
|
|
21
|
+
if (err || !key) {
|
|
22
|
+
return callback(err || new Error("Key not found"));
|
|
23
|
+
}
|
|
24
|
+
const signingKey = key.getPublicKey();
|
|
25
|
+
callback(null, signingKey);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async function init(name) {
|
|
29
|
+
Parse.Cloud.define(name, async (request) => {
|
|
30
|
+
const token = request.params.token;
|
|
31
|
+
const account = request.params.account;
|
|
32
|
+
if (!token) {
|
|
33
|
+
throw new Parse.Error(Parse.Error.INVALID_JSON, "Token missing");
|
|
34
|
+
}
|
|
35
|
+
const verifiedPayload = await new Promise((resolve, reject) => {
|
|
36
|
+
jsonwebtoken_1.default.verify(token, getKey, {
|
|
37
|
+
audience: appId,
|
|
38
|
+
issuer: `https://login.microsoftonline.com/${tenantId}/v2.0`,
|
|
39
|
+
}, (err, decoded) => {
|
|
40
|
+
if (err)
|
|
41
|
+
return reject(err);
|
|
42
|
+
resolve(decoded);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
let user = await new Parse.Query(Parse.User)
|
|
46
|
+
.equalTo("username", verifiedPayload.oid)
|
|
47
|
+
.first({ useMasterKey: true });
|
|
48
|
+
if (!user) {
|
|
49
|
+
user = new Parse.User();
|
|
50
|
+
user.set("username", verifiedPayload.oid);
|
|
51
|
+
user.set("email", account.username);
|
|
52
|
+
user.set("password", (0, crypto_1.randomBytes)(16).toString("hex")); // Generate a random password
|
|
53
|
+
user.set("name", verifiedPayload.name || verifiedPayload.preferred_username);
|
|
54
|
+
user = await user.signUp(null, { useMasterKey: true });
|
|
55
|
+
return user.getSessionToken();
|
|
56
|
+
}
|
|
57
|
+
const sessionToken = "r:" + (0, crypto_1.randomBytes)(16).toString("hex");
|
|
58
|
+
const session = new Parse.Object("_Session");
|
|
59
|
+
session.set("user", user);
|
|
60
|
+
session.set("sessionToken", sessionToken);
|
|
61
|
+
session.set("expiresAt", new Date(Date.now() + 24 * 60 * 60 * 1000 * 7)); // 7 day expiration
|
|
62
|
+
const savedSession = await session.save(null, { useMasterKey: true });
|
|
63
|
+
return savedSession.get("sessionToken");
|
|
64
|
+
});
|
|
65
|
+
}
|
|
@@ -70,6 +70,8 @@ async function saveTicketData(data, user) {
|
|
|
70
70
|
await (0, openservice_1.assignUsersAndRoles)(ticket, data.assignedTo, fetchOptions, user);
|
|
71
71
|
if (data.title)
|
|
72
72
|
await (0, openservice_1.saveTicketTitle)(ticket, fetchOptions);
|
|
73
|
+
if (data.description)
|
|
74
|
+
await (0, openservice_1.saveDescription)(ticket, data, fetchOptions);
|
|
73
75
|
if (data.meta)
|
|
74
76
|
await (0, openservice_1.saveTicketMeta)(ticket, data.meta, fetchOptions);
|
|
75
77
|
if (data.duedate)
|
|
@@ -166,7 +168,7 @@ async function saveTicketData(data, user) {
|
|
|
166
168
|
owticketobj.state = fetchedSavedState;
|
|
167
169
|
}
|
|
168
170
|
}
|
|
169
|
-
if (data.media)
|
|
171
|
+
if (data.media && data.media.length > 0)
|
|
170
172
|
await (0, openservice_1.saveMedia)(ticket, data.media, fetchOptions);
|
|
171
173
|
if (data.material)
|
|
172
174
|
await (0, openservice_1.saveMaterial)(ticket, data.material, fetchOptions);
|
package/dist/index.js
CHANGED
|
@@ -36,6 +36,7 @@ const createRandomPassword_1 = require("./helper/createRandomPassword");
|
|
|
36
36
|
const Core_Email_1 = require("./hooks/Core_Email");
|
|
37
37
|
const _init_2 = require("./hooks/_init");
|
|
38
38
|
const types_1 = require("./types");
|
|
39
|
+
const openservice_1 = require("./features/openservice");
|
|
39
40
|
var Core_Email_2 = require("./hooks/Core_Email");
|
|
40
41
|
Object.defineProperty(exports, "sendSimpleEmail", { enumerable: true, get: function () { return Core_Email_2.sendSimpleEmail; } });
|
|
41
42
|
Object.defineProperty(exports, "sendTemplateEmail", { enumerable: true, get: function () { return Core_Email_2.sendTemplateEmail; } });
|
|
@@ -73,6 +74,7 @@ async function init() {
|
|
|
73
74
|
await (0, permissions_1.initPermissions)();
|
|
74
75
|
await (0, notifications_1.initNotifications)();
|
|
75
76
|
await (0, settings_1.initUserSettings)();
|
|
77
|
+
await (0, openservice_1.init)();
|
|
76
78
|
}
|
|
77
79
|
async function initTranslations() {
|
|
78
80
|
// try {
|
|
@@ -540,7 +542,6 @@ async function autoloadCloudCode(path, regex = /^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$
|
|
|
540
542
|
for (const name of fns) {
|
|
541
543
|
const { init } = require((0, path_1.join)(path, name));
|
|
542
544
|
if (!init || typeof init !== "function") {
|
|
543
|
-
console.warn(`[@openinc/parse-server-opendash] No init() function found in ${name}.js`);
|
|
544
545
|
continue;
|
|
545
546
|
}
|
|
546
547
|
console.log(`[@openinc/parse-server-opendash] Autoloading ${name}.js`);
|
|
@@ -10,6 +10,7 @@ export interface Maintenance_TicketAttributes {
|
|
|
10
10
|
assignedroles: Parse.Relation<Maintenance_Ticket, _Role>;
|
|
11
11
|
assignedusers: Parse.Relation<Maintenance_Ticket, _User>;
|
|
12
12
|
enabled: boolean;
|
|
13
|
+
description?: string;
|
|
13
14
|
latestPriorityValue?: number;
|
|
14
15
|
meta?: any;
|
|
15
16
|
project?: Maintenance_Project;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openinc/parse-server-opendash",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.8.0",
|
|
4
4
|
"description": "Parse Server Cloud Code for open.INC Stack.",
|
|
5
5
|
"packageManager": "pnpm@10.11.0",
|
|
6
6
|
"keywords": [
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"dayjs": "^1.11.13",
|
|
69
69
|
"fast-equals": "^5.2.2",
|
|
70
70
|
"jsonwebtoken": "^9.0.2",
|
|
71
|
+
"jwks-rsa": "^3.2.0",
|
|
71
72
|
"nodemailer": "^6.10.1",
|
|
72
73
|
"nunjucks": "^3.2.4",
|
|
73
74
|
"parse-server": "^8.2.0",
|