@openinc/parse-server-opendash 3.29.13 → 3.31.25

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.
@@ -10,6 +10,7 @@
10
10
  "OD3_BDE_Page": "BDE",
11
11
  "OD3_BDE_Result": "BDE",
12
12
  "OD3_BDE_Unit": "BDE",
13
+ "OD3_Changelog": "CORE",
13
14
  "OD3_Company": "CORE",
14
15
  "OD3_Config": "CORE",
15
16
  "OD3_Contact": "CORE",
@@ -525,4 +525,12 @@ exports.customoptions = {
525
525
  public: false,
526
526
  description: "Application ID for Microsoft authentication. This is the Application (client) ID from the Azure portal.",
527
527
  },
528
+ CHANGELOG_BLACKLIST: {
529
+ env: "OPENINC_PARSE_CHANGELOG_BLACKLIST",
530
+ type: "string",
531
+ required: false,
532
+ secret: false,
533
+ public: false,
534
+ description: "Comma separated list of class names which should be excluded from ChangeLog entries.",
535
+ },
528
536
  };
@@ -3,7 +3,6 @@ export declare namespace ConfigKeys {
3
3
  closedTicketsLifetime = "OPENSERVICE_CLOSED_TICKET_LIFETIME",
4
4
  ticketCreationForm = "OPENSERVICE_CREATE_TICKET_FORM",
5
5
  scheduleMetaFields = "OPENSERVICE_SCHEDULE_META_FIELDS",
6
- sampledataCreated = "OPENSERVICE_SAMPLEDATA_CREATED",
7
6
  createTicketOnSchedule = "OPENSERVICE_CREATE_TICKET_ON_SCHEDULE"
8
7
  }
9
8
  }
@@ -8,7 +8,6 @@ var ConfigKeys;
8
8
  OpenService["closedTicketsLifetime"] = "OPENSERVICE_CLOSED_TICKET_LIFETIME";
9
9
  OpenService["ticketCreationForm"] = "OPENSERVICE_CREATE_TICKET_FORM";
10
10
  OpenService["scheduleMetaFields"] = "OPENSERVICE_SCHEDULE_META_FIELDS";
11
- OpenService["sampledataCreated"] = "OPENSERVICE_SAMPLEDATA_CREATED";
12
11
  OpenService["createTicketOnSchedule"] = "OPENSERVICE_CREATE_TICKET_ON_SCHEDULE";
13
12
  })(OpenService = ConfigKeys.OpenService || (ConfigKeys.OpenService = {}));
14
13
  })(ConfigKeys || (exports.ConfigKeys = ConfigKeys = {}));
@@ -58,6 +58,10 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
58
58
  user: ticket.get("user"),
59
59
  batchStamp: batchTime,
60
60
  }));
61
+ if (assignedTo.id === assigningUser?.id) {
62
+ // Don't notify the user who created the ticket
63
+ continue;
64
+ }
61
65
  await new types_1.Notification({
62
66
  data: {
63
67
  ticketId: ticket.id,
@@ -91,6 +95,10 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
91
95
  .query()
92
96
  .find(fetchOptions);
93
97
  for await (const roleUser of roleUsers) {
98
+ if (roleUser.id === assigningUser?.id) {
99
+ // Don't notify the user who created the ticket
100
+ continue;
101
+ }
94
102
  if (userNotifiedIds.includes(roleUser.id))
95
103
  continue;
96
104
  const resipientlanguage = await (0, getUserLanguage_1.getUserLanguage)(roleUser);
@@ -121,6 +129,10 @@ async function assignUsersAndRoles(ticket, assignedTo, fetchOptions, assigningUs
121
129
  await types_1.Maintenance_Ticket_Assignment.saveAll(assignments, fetchOptions);
122
130
  //Set ACLs for assigned users and roles on ticket
123
131
  const acl = new Parse.ACL();
132
+ if (assigningUser) {
133
+ acl.setReadAccess(assigningUser, true);
134
+ acl.setWriteAccess(assigningUser, true);
135
+ }
124
136
  for (const assignedUser of newUsers) {
125
137
  acl.setReadAccess(assignedUser, true);
126
138
  acl.setWriteAccess(assignedUser, true);
@@ -13,7 +13,6 @@ export type SaveValues = {
13
13
  source?: string;
14
14
  issuecategory?: string;
15
15
  priority?: number;
16
- media?: string[];
17
16
  downtime?: number;
18
17
  frequency?: number;
19
18
  restriction?: number;
@@ -1,4 +1,4 @@
1
- import { Maintenance_Downtime, Maintenance_Duedate, Maintenance_Frequency, Maintenance_Issuecategory, Maintenance_Kanban_State, Maintenance_Message, Maintenance_Priority, Maintenance_Project, Maintenance_Restriction, Maintenance_Ticket, Maintenance_Ticket_Material, Source } from "../../../types";
1
+ import { Assets, Maintenance_Downtime, Maintenance_Duedate, Maintenance_Frequency, Maintenance_Issuecategory, Maintenance_Kanban_State, Maintenance_Message, Maintenance_Priority, Maintenance_Project, Maintenance_Restriction, Maintenance_Ticket, Maintenance_Ticket_Material, Source } from "../../../types";
2
2
  export type TicketData = {
3
3
  ticket: Maintenance_Ticket;
4
4
  downtime?: Maintenance_Downtime;
@@ -14,4 +14,5 @@ export type TicketData = {
14
14
  assignedTo?: Array<Parse.User | Parse.Role>;
15
15
  material?: Maintenance_Ticket_Material;
16
16
  project?: Maintenance_Project;
17
+ assets?: Assets[];
17
18
  };
@@ -3,3 +3,4 @@ import { _User, Maintenance_Ticket } from "../types";
3
3
  export declare function getUsername(user: _User | undefined): string;
4
4
  export declare function init(name: string): Promise<void>;
5
5
  export declare function saveTicketData(data: SaveValues, user?: _User, overrideFetchOptions?: FetchOptions): Promise<Maintenance_Ticket>;
6
+ export declare function serializeTicketData(obj: any): any;
@@ -3,11 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getUsername = getUsername;
4
4
  exports.init = init;
5
5
  exports.saveTicketData = saveTicketData;
6
+ exports.serializeTicketData = serializeTicketData;
6
7
  const parse_1 = require("parse");
7
8
  const openservice_1 = require("../features/openservice");
8
9
  const openware_1 = require("../features/openware");
9
10
  const catchError_1 = require("../helper/catchError");
10
11
  const types_1 = require("../types");
12
+ const openinc_openservice_ticket_data_1 = require("./openinc-openservice-ticket-data");
11
13
  function getUsername(user) {
12
14
  if (!user)
13
15
  return "System";
@@ -184,14 +186,6 @@ async function saveTicketData(data, user, overrideFetchOptions) {
184
186
  owticketobj.state = fetchedSavedState;
185
187
  }
186
188
  }
187
- if (data.media && data.media.length > 0) {
188
- try {
189
- await (0, openservice_1.saveMedia)(ticket, data.media, fetchOptions);
190
- }
191
- catch (error) {
192
- console.error(`Error saving media for ticket ${ticket.id}:`, error);
193
- }
194
- }
195
189
  if (data.material) {
196
190
  try {
197
191
  await (0, openservice_1.saveMaterial)(ticket, data.material, fetchOptions);
@@ -250,6 +244,25 @@ async function saveTicketData(data, user, overrideFetchOptions) {
250
244
  ? ticketsource.get("source").get("tag")
251
245
  : "");
252
246
  }
247
+ // save TicketData in TicketData Table
248
+ const [ticketData] = await (0, openinc_openservice_ticket_data_1.getTicketData)([ticket]);
249
+ if (ticketData) {
250
+ const ticketDataEntry = new types_1.Maintenance_Ticket_Data({
251
+ ticket: ticket,
252
+ data: serializeTicketData(ticketData),
253
+ tenant: ticket.get("tenant"),
254
+ });
255
+ const fallbackACL = new Parse.ACL();
256
+ fallbackACL.setPublicReadAccess(false);
257
+ fallbackACL.setPublicWriteAccess(false);
258
+ const user = ticket.get("user");
259
+ if (user) {
260
+ fallbackACL.setReadAccess(user.id, true);
261
+ fallbackACL.setWriteAccess(user.id, true);
262
+ }
263
+ ticketDataEntry.setACL(ticket.getACL() ?? ticket.get("tenant")?.getACL() ?? fallbackACL);
264
+ await ticketDataEntry.save(null, { useMasterKey: true });
265
+ }
253
266
  return ticket;
254
267
  }
255
268
  /**
@@ -377,3 +390,24 @@ async function publishToOpenWare(owticketobj, ticket, source) {
377
390
  console.error("Error publishing ticket to openware", error);
378
391
  }
379
392
  }
393
+ function serializeTicketData(obj) {
394
+ if (!obj)
395
+ return obj;
396
+ // Parse.Object → convert to JSON
397
+ if (obj instanceof Parse.Object) {
398
+ return { ...obj.toJSON(), className: obj.className };
399
+ }
400
+ // Array
401
+ if (Array.isArray(obj)) {
402
+ return obj.map(serializeTicketData);
403
+ }
404
+ // Plain object
405
+ if (typeof obj === "object") {
406
+ const out = {};
407
+ for (const key in obj) {
408
+ out[key] = serializeTicketData(obj[key]);
409
+ }
410
+ return out;
411
+ }
412
+ return obj; // primitive values
413
+ }
@@ -1,3 +1,4 @@
1
+ import { TicketData } from "../features/openservice";
1
2
  import { Maintenance_Ticket, Maintenance_Ticket_Material, Maintenance_Ticket_Source } from "../types";
2
3
  type FilterParams = {
3
4
  attribute: "objectId" | "state" | "issuecategory" | "user" | "role" | "userRole" | "createdUser" | "source" | "project" | "title";
@@ -21,6 +22,7 @@ export type FetchParams = {
21
22
  config: Array<FetchObject>;
22
23
  };
23
24
  export declare function init(name: string): Promise<void>;
25
+ export declare function getTicketData(tickets: Maintenance_Ticket[]): Promise<TicketData[]>;
24
26
  /**
25
27
  * Fetches the material for a ticket
26
28
  * @param ticket
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.init = init;
4
+ exports.getTicketData = getTicketData;
4
5
  exports.getTicketMaterial = getTicketMaterial;
5
6
  exports.getTicketSource = getTicketSource;
6
7
  exports.arrayToDistinct = arrayToDistinct;
@@ -107,6 +108,7 @@ async function getTicketData(tickets) {
107
108
  const material = getTicketMaterial(ticket);
108
109
  const project = (0, catchError_1.catchError)(ticket.get("project")?.fetch({ useMasterKey: true }) ??
109
110
  new Promise((res) => res(undefined)));
111
+ const assets = getTicketAssets(ticket);
110
112
  const dataPromises = await Promise.all([
111
113
  downtimes,
112
114
  duedate,
@@ -119,6 +121,7 @@ async function getTicketData(tickets) {
119
121
  messages,
120
122
  material,
121
123
  project,
124
+ assets,
122
125
  ]);
123
126
  return {
124
127
  ticket: ticket,
@@ -135,10 +138,16 @@ async function getTicketData(tickets) {
135
138
  assignedTo: [...assignedusers, ...assignedroles],
136
139
  material: dataPromises[9],
137
140
  project: dataPromises[10]?.[1],
141
+ assets: dataPromises[11],
138
142
  };
139
143
  });
140
144
  return await Promise.all(ticketDataPromises);
141
145
  }
146
+ async function getTicketAssets(ticket) {
147
+ return await new Parse.Query(types_1.Assets)
148
+ .equalTo("context", `ticket-media-${ticket.id}`)
149
+ .find({ useMasterKey: true });
150
+ }
142
151
  /**
143
152
  * Fetches the downtime for a ticket
144
153
  * @param ticket
@@ -7,7 +7,7 @@ async function init() {
7
7
  (0, __1.beforeSaveHook)(types_1.MIAAS_MDSEndpoint, async (request) => {
8
8
  const { object, original, user } = request;
9
9
  await (0, __1.defaultHandler)(request);
10
- await (0, __1.defaultAclHandler)(request);
10
+ await (0, __1.defaultAclHandler)(request, { allowCustomACL: true });
11
11
  // TODO
12
12
  });
13
13
  (0, __1.afterSaveHook)(types_1.MIAAS_MDSEndpoint, async (request) => {
@@ -0,0 +1 @@
1
+ export declare function init(): Promise<void>;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.init = init;
4
+ const __1 = require("..");
5
+ const types_1 = require("../types");
6
+ async function init() {
7
+ const schema = await Parse.Schema.all();
8
+ const blacklistedClasses = [
9
+ "_Session",
10
+ "_Installation",
11
+ ...(process.env.OPENINC_PARSE_CHANGELOG_BLACKLIST || "")
12
+ .split(",")
13
+ .map((c) => c.trim())
14
+ .filter((c) => c.length > 0),
15
+ ];
16
+ console.log(`ChangeLog blacklisted classes: ${blacklistedClasses.join(", ") || "None"}`);
17
+ (0, __1.beforeSaveHook)(types_1.Changelog.className, async (request) => {
18
+ const { object, original, user } = request;
19
+ await (0, __1.defaultHandler)(request);
20
+ await (0, __1.defaultAclHandler)(request);
21
+ if (user && object && object.getACL()) {
22
+ object.getACL().setReadAccess(user.id, true);
23
+ }
24
+ });
25
+ schema.forEach((classSchema) => {
26
+ if (!classSchema.className ||
27
+ classSchema.className === types_1.Changelog.className ||
28
+ classSchema.className === types_1.Permission.className) {
29
+ console.log(`Skipping ChangeLog hook for class ${classSchema.className}`);
30
+ return;
31
+ }
32
+ if (blacklistedClasses.includes(classSchema.className)) {
33
+ console.log(`Class ${classSchema.className} is blacklisted from ChangeLog entries.`);
34
+ return;
35
+ }
36
+ console.log(`Registering ChangeLog hook for class ${classSchema?.className || "CLASSNAME_MISSING"}`);
37
+ (0, __1.beforeDeleteHook)(classSchema.className, async (request) => {
38
+ console.log(`Creating ChangeLog entry for DELETE on class ${classSchema.className} and object ${request.object.id}`);
39
+ try {
40
+ const { object, user, master } = request;
41
+ if (blacklistedClasses.includes(classSchema.className)) {
42
+ console.log(`Skipping ChangeLog entry for class ${classSchema.className} and object ${object.id} due to blacklisted class.`);
43
+ return;
44
+ }
45
+ const changelog = new types_1.Changelog();
46
+ changelog.set("nameOfClass", classSchema.className);
47
+ changelog.set("changedObject", object.id);
48
+ changelog.set("operation", "delete");
49
+ changelog.set("actingUser", user);
50
+ changelog.set("masterkey", master ? true : false);
51
+ changelog.set("context", null);
52
+ changelog.set("value", null);
53
+ changelog.set("original", object ? object.toJSON() : null);
54
+ await changelog.save({}, { useMasterKey: true });
55
+ }
56
+ catch (e) {
57
+ console.error("\n" + "-".repeat(80) + "\n", "Error creating ChangeLog entry for DELETE on class " +
58
+ classSchema.className +
59
+ " and object " +
60
+ (request.object ? request.object.id : "unknown") +
61
+ ":", JSON.stringify(e), "\n" + "-".repeat(80) + "\n");
62
+ }
63
+ });
64
+ (0, __1.afterSaveHook)(classSchema.className, async (request) => {
65
+ console.log(`Creating ChangeLog entry for class ${classSchema.className} and object ${request.object.id}`);
66
+ try {
67
+ const { object, original, user, master, context } = request;
68
+ if (context.skipChangelog ||
69
+ blacklistedClasses.includes(classSchema.className)) {
70
+ console.log(`Skipping ChangeLog entry for class ${classSchema.className} and object ${object.id} due to ${context.skipChangelog ? "context flag" : "blacklisted class"}.`);
71
+ return;
72
+ }
73
+ const changelog = new types_1.Changelog();
74
+ changelog.set("nameOfClass", classSchema.className);
75
+ changelog.set("changedObject", object.id);
76
+ changelog.set("operation", original ? "update" : "create");
77
+ changelog.set("actingUser", user);
78
+ changelog.set("masterkey", master ? true : false);
79
+ changelog.set("context", context ? context : null);
80
+ changelog.set("value", object ? object.toJSON() : null);
81
+ changelog.set("original", original ? original.toJSON() : null);
82
+ await changelog.save({}, { useMasterKey: true });
83
+ }
84
+ catch (e) {
85
+ console.error("\n" + "-".repeat(80) + "\n", "Error creating ChangeLog entry for class " +
86
+ classSchema.className +
87
+ " and object " +
88
+ (request.object ? request.object.id : "unknown") +
89
+ ":", JSON.stringify(e), "\n" + "-".repeat(80) + "\n");
90
+ }
91
+ });
92
+ });
93
+ }
@@ -10,6 +10,7 @@ async function init() {
10
10
  "_beforeLogin",
11
11
  "_User",
12
12
  "_Role",
13
+ "_ChangeLog",
13
14
  ...fs_1.default
14
15
  .readdirSync(__dirname)
15
16
  .filter((filename) => !filename.startsWith("_"))
@@ -0,0 +1,34 @@
1
+ import type { _User } from "./_User";
2
+ export interface ChangelogAttributes {
3
+ id: string;
4
+ changedObject: string;
5
+ createdAt: Date;
6
+ updatedAt: Date;
7
+ context?: any | undefined;
8
+ masterkey: boolean;
9
+ nameOfClass: string;
10
+ operation: string;
11
+ original?: any | undefined;
12
+ actingUser?: _User | undefined;
13
+ value?: any | undefined;
14
+ }
15
+ export declare class Changelog extends Parse.Object<ChangelogAttributes> {
16
+ static className: string;
17
+ constructor(data?: Partial<ChangelogAttributes>);
18
+ get context(): any | undefined;
19
+ set context(value: any | undefined);
20
+ get masterkey(): boolean;
21
+ set masterkey(value: boolean);
22
+ get nameOfClass(): string;
23
+ set nameOfClass(value: string);
24
+ get operation(): string;
25
+ set operation(value: string);
26
+ get original(): any | undefined;
27
+ set original(value: any | undefined);
28
+ get actingUser(): _User | undefined;
29
+ set actingUser(value: _User | undefined);
30
+ get value(): any | undefined;
31
+ set value(value: any | undefined);
32
+ get changedObject(): string;
33
+ set changedObject(value: string);
34
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Changelog = void 0;
4
+ class Changelog extends Parse.Object {
5
+ constructor(data) {
6
+ super("OD3_Changelog", data);
7
+ }
8
+ get context() {
9
+ return super.get("context");
10
+ }
11
+ set context(value) {
12
+ super.set("context", value);
13
+ }
14
+ get masterkey() {
15
+ return super.get("masterkey");
16
+ }
17
+ set masterkey(value) {
18
+ super.set("masterkey", value);
19
+ }
20
+ get nameOfClass() {
21
+ return super.get("nameOfClass");
22
+ }
23
+ set nameOfClass(value) {
24
+ super.set("nameOfClass", value);
25
+ }
26
+ get operation() {
27
+ return super.get("operation");
28
+ }
29
+ set operation(value) {
30
+ super.set("operation", value);
31
+ }
32
+ get original() {
33
+ return super.get("original");
34
+ }
35
+ set original(value) {
36
+ super.set("original", value);
37
+ }
38
+ get actingUser() {
39
+ return super.get("actingUser");
40
+ }
41
+ set actingUser(value) {
42
+ super.set("actingUser", value);
43
+ }
44
+ get value() {
45
+ return super.get("value");
46
+ }
47
+ set value(value) {
48
+ super.set("value", value);
49
+ }
50
+ get changedObject() {
51
+ return super.get("changedObject");
52
+ }
53
+ set changedObject(value) {
54
+ super.set("changedObject", value);
55
+ }
56
+ }
57
+ exports.Changelog = Changelog;
58
+ Changelog.className = "OD3_Changelog";
59
+ Parse.Object.registerSubclass("OD3_Changelog", Changelog);
@@ -0,0 +1,22 @@
1
+ import type { Tenant } from "./Tenant";
2
+ import type { Maintenance_Ticket } from "./Maintenance_Ticket";
3
+ import { TicketData } from "../features/openservice";
4
+ export interface Maintenance_Ticket_DataAttributes {
5
+ id: string;
6
+ objectId: string;
7
+ createdAt: Date;
8
+ updatedAt: Date;
9
+ data: TicketData;
10
+ tenant?: Tenant | undefined;
11
+ ticket: Maintenance_Ticket;
12
+ }
13
+ export declare class Maintenance_Ticket_Data extends Parse.Object<Maintenance_Ticket_DataAttributes> {
14
+ static className: string;
15
+ constructor(data?: Partial<Maintenance_Ticket_DataAttributes>);
16
+ get data(): TicketData;
17
+ set data(value: TicketData);
18
+ get tenant(): Tenant | undefined;
19
+ set tenant(value: Tenant | undefined);
20
+ get ticket(): Maintenance_Ticket;
21
+ set ticket(value: Maintenance_Ticket);
22
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Maintenance_Ticket_Data = void 0;
4
+ class Maintenance_Ticket_Data extends Parse.Object {
5
+ constructor(data) {
6
+ super("OD3_Maintenance_Ticket_Data", data);
7
+ }
8
+ get data() {
9
+ return super.get("data");
10
+ }
11
+ set data(value) {
12
+ super.set("data", value);
13
+ }
14
+ get tenant() {
15
+ return super.get("tenant");
16
+ }
17
+ set tenant(value) {
18
+ super.set("tenant", value);
19
+ }
20
+ get ticket() {
21
+ return super.get("ticket");
22
+ }
23
+ set ticket(value) {
24
+ super.set("ticket", value);
25
+ }
26
+ }
27
+ exports.Maintenance_Ticket_Data = Maintenance_Ticket_Data;
28
+ Maintenance_Ticket_Data.className = "OD3_Maintenance_Ticket_Data";
29
+ Parse.Object.registerSubclass("OD3_Maintenance_Ticket_Data", Maintenance_Ticket_Data);
@@ -20,6 +20,8 @@ export { BDE_Result } from "./BDE_Result";
20
20
  export type { BDE_ResultAttributes } from "./BDE_Result";
21
21
  export { BDE_Unit } from "./BDE_Unit";
22
22
  export type { BDE_UnitAttributes } from "./BDE_Unit";
23
+ export { Changelog } from "./Changelog";
24
+ export type { ChangelogAttributes } from "./Changelog";
23
25
  export { Company } from "./Company";
24
26
  export type { CompanyAttributes } from "./Company";
25
27
  export { Config } from "./Config";
@@ -136,6 +138,8 @@ export { Maintenance_Ticket } from "./Maintenance_Ticket";
136
138
  export type { Maintenance_TicketAttributes } from "./Maintenance_Ticket";
137
139
  export { Maintenance_Ticket_Assignment } from "./Maintenance_Ticket_Assignment";
138
140
  export type { Maintenance_Ticket_AssignmentAttributes } from "./Maintenance_Ticket_Assignment";
141
+ export { Maintenance_Ticket_Data } from "./Maintenance_Ticket_Data";
142
+ export type { Maintenance_Ticket_DataAttributes } from "./Maintenance_Ticket_Data";
139
143
  export { Maintenance_Ticket_FormConfig } from "./Maintenance_Ticket_FormConfig";
140
144
  export type { Maintenance_Ticket_FormConfigAttributes } from "./Maintenance_Ticket_FormConfig";
141
145
  export { Maintenance_Ticket_Issuecategory } from "./Maintenance_Ticket_Issuecategory";
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Maintenance_Downtime = exports.Mail_Groups = exports.MailTemplate = exports.ML_DataSelection = exports.MIAAS_MDSEndpoint = exports.MES_OrderPlan = exports.MES_Order = exports.MES_Article = exports.Log = exports.Language = exports.Knowledge_Video = exports.Knowledge_DocumentPage = exports.Knowledge_Document = exports.Knowledge_ChatMessage = exports.Knowledge_Chat = exports.Knowledge_Category = exports.Knowledge_Article = exports.GTFS_Wheelchair_Boarding = exports.GTFS_Wheelchair_Accessible = exports.GTFS_Trip = exports.GTFS_Stop_Times = exports.GTFS_Stop = exports.GTFS_Route_Type = exports.GTFS_Route = exports.GTFS_Location_Type = exports.GTFS_Level = exports.GTFS_Direction = exports.GTFS_Calendar = exports.GTFS_Bikes_Allowed = exports.GTFS_Agency = exports.Documentation_Document = exports.Documentation_Config = exports.Documentation_Category = exports.Dashboard = exports.Core_Token = exports.Core_Email = exports.Contact = exports.Config = exports.Company = exports.BDE_Unit = exports.BDE_Result = exports.BDE_Page = exports.BDE_ListEntry = exports.BDE_List = exports.BDE_Form = exports.Attachment = exports.Assets = exports.AlarmWebhook = exports.AlarmAction = exports.Alarm = void 0;
4
- exports.User_Setting = exports.UserData = exports.TenantTrustedDomain = exports.TenantMeta = exports.Tenant = exports.SourceMeta = exports.Source = exports.Share = exports.Report = exports.Push = exports.Permission = exports.OWPlcItem = exports.OWPlcDevice = exports.Notification_Setting = exports.Notification = exports.NavigationItem = exports.NavigationGroup = exports.Monitoring_Slideshow = exports.Monitoring_ReportImage = exports.Monitoring_ParseTableSensor = exports.Monitoring_Jobs = exports.Monitoring_DataHierachies = exports.Maintenance_Ticket_Title = exports.Maintenance_Ticket_Source = exports.Maintenance_Ticket_QR_Code = exports.Maintenance_Ticket_Project = exports.Maintenance_Ticket_Material = exports.Maintenance_Ticket_Kanban_State_Current = exports.Maintenance_Ticket_Kanban_State = exports.Maintenance_Ticket_Issuecategory = exports.Maintenance_Ticket_FormConfig = exports.Maintenance_Ticket_Assignment = exports.Maintenance_Ticket = exports.Maintenance_Source_File = exports.Maintenance_Schedule_Template = exports.Maintenance_Schedule_Step = exports.Maintenance_Schedule_Execution_Step = exports.Maintenance_Schedule_Execution = exports.Maintenance_Schedule = exports.Maintenance_Restriction = exports.Maintenance_Project = exports.Maintenance_Priority = exports.Maintenance_Order = exports.Maintenance_Message = exports.Maintenance_Media = exports.Maintenance_Kanban_State = exports.Maintenance_Item = exports.Maintenance_Issuecategory = exports.Maintenance_Frequency = exports.Maintenance_Duedate = void 0;
5
- exports.WidgetPreset = exports.Widget = exports.WebPush = exports.VirtualKPI = void 0;
3
+ exports.Mail_Groups = exports.MailTemplate = exports.ML_DataSelection = exports.MIAAS_MDSEndpoint = exports.MES_OrderPlan = exports.MES_Order = exports.MES_Article = exports.Log = exports.Language = exports.Knowledge_Video = exports.Knowledge_DocumentPage = exports.Knowledge_Document = exports.Knowledge_ChatMessage = exports.Knowledge_Chat = exports.Knowledge_Category = exports.Knowledge_Article = exports.GTFS_Wheelchair_Boarding = exports.GTFS_Wheelchair_Accessible = exports.GTFS_Trip = exports.GTFS_Stop_Times = exports.GTFS_Stop = exports.GTFS_Route_Type = exports.GTFS_Route = exports.GTFS_Location_Type = exports.GTFS_Level = exports.GTFS_Direction = exports.GTFS_Calendar = exports.GTFS_Bikes_Allowed = exports.GTFS_Agency = exports.Documentation_Document = exports.Documentation_Config = exports.Documentation_Category = exports.Dashboard = exports.Core_Token = exports.Core_Email = exports.Contact = exports.Config = exports.Company = exports.Changelog = exports.BDE_Unit = exports.BDE_Result = exports.BDE_Page = exports.BDE_ListEntry = exports.BDE_List = exports.BDE_Form = exports.Attachment = exports.Assets = exports.AlarmWebhook = exports.AlarmAction = exports.Alarm = void 0;
4
+ exports.TenantTrustedDomain = exports.TenantMeta = exports.Tenant = exports.SourceMeta = exports.Source = exports.Share = exports.Report = exports.Push = exports.Permission = exports.OWPlcItem = exports.OWPlcDevice = exports.Notification_Setting = exports.Notification = exports.NavigationItem = exports.NavigationGroup = exports.Monitoring_Slideshow = exports.Monitoring_ReportImage = exports.Monitoring_ParseTableSensor = exports.Monitoring_Jobs = exports.Monitoring_DataHierachies = exports.Maintenance_Ticket_Title = exports.Maintenance_Ticket_Source = exports.Maintenance_Ticket_QR_Code = exports.Maintenance_Ticket_Project = exports.Maintenance_Ticket_Material = exports.Maintenance_Ticket_Kanban_State_Current = exports.Maintenance_Ticket_Kanban_State = exports.Maintenance_Ticket_Issuecategory = exports.Maintenance_Ticket_FormConfig = exports.Maintenance_Ticket_Data = exports.Maintenance_Ticket_Assignment = exports.Maintenance_Ticket = exports.Maintenance_Source_File = exports.Maintenance_Schedule_Template = exports.Maintenance_Schedule_Step = exports.Maintenance_Schedule_Execution_Step = exports.Maintenance_Schedule_Execution = exports.Maintenance_Schedule = exports.Maintenance_Restriction = exports.Maintenance_Project = exports.Maintenance_Priority = exports.Maintenance_Order = exports.Maintenance_Message = exports.Maintenance_Media = exports.Maintenance_Kanban_State = exports.Maintenance_Item = exports.Maintenance_Issuecategory = exports.Maintenance_Frequency = exports.Maintenance_Duedate = exports.Maintenance_Downtime = void 0;
5
+ exports.WidgetPreset = exports.Widget = exports.WebPush = exports.VirtualKPI = exports.User_Setting = exports.UserData = void 0;
6
6
  var Alarm_1 = require("./Alarm");
7
7
  Object.defineProperty(exports, "Alarm", { enumerable: true, get: function () { return Alarm_1.Alarm; } });
8
8
  var AlarmAction_1 = require("./AlarmAction");
@@ -25,6 +25,8 @@ var BDE_Result_1 = require("./BDE_Result");
25
25
  Object.defineProperty(exports, "BDE_Result", { enumerable: true, get: function () { return BDE_Result_1.BDE_Result; } });
26
26
  var BDE_Unit_1 = require("./BDE_Unit");
27
27
  Object.defineProperty(exports, "BDE_Unit", { enumerable: true, get: function () { return BDE_Unit_1.BDE_Unit; } });
28
+ var Changelog_1 = require("./Changelog");
29
+ Object.defineProperty(exports, "Changelog", { enumerable: true, get: function () { return Changelog_1.Changelog; } });
28
30
  var Company_1 = require("./Company");
29
31
  Object.defineProperty(exports, "Company", { enumerable: true, get: function () { return Company_1.Company; } });
30
32
  var Config_1 = require("./Config");
@@ -141,6 +143,8 @@ var Maintenance_Ticket_1 = require("./Maintenance_Ticket");
141
143
  Object.defineProperty(exports, "Maintenance_Ticket", { enumerable: true, get: function () { return Maintenance_Ticket_1.Maintenance_Ticket; } });
142
144
  var Maintenance_Ticket_Assignment_1 = require("./Maintenance_Ticket_Assignment");
143
145
  Object.defineProperty(exports, "Maintenance_Ticket_Assignment", { enumerable: true, get: function () { return Maintenance_Ticket_Assignment_1.Maintenance_Ticket_Assignment; } });
146
+ var Maintenance_Ticket_Data_1 = require("./Maintenance_Ticket_Data");
147
+ Object.defineProperty(exports, "Maintenance_Ticket_Data", { enumerable: true, get: function () { return Maintenance_Ticket_Data_1.Maintenance_Ticket_Data; } });
144
148
  var Maintenance_Ticket_FormConfig_1 = require("./Maintenance_Ticket_FormConfig");
145
149
  Object.defineProperty(exports, "Maintenance_Ticket_FormConfig", { enumerable: true, get: function () { return Maintenance_Ticket_FormConfig_1.Maintenance_Ticket_FormConfig; } });
146
150
  var Maintenance_Ticket_Issuecategory_1 = require("./Maintenance_Ticket_Issuecategory");
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@openinc/parse-server-opendash",
3
- "version": "3.29.13",
3
+ "version": "3.31.25",
4
4
  "description": "Parse Server Cloud Code for open.INC Stack.",
5
- "packageManager": "pnpm@10.20.0",
5
+ "packageManager": "pnpm@10.26.2",
6
6
  "keywords": [
7
7
  "parse",
8
8
  "opendash"
9
9
  ],
10
+ "publishConfig": {
11
+ "access": "public",
12
+ "registry": "https://registry.npmjs.org/"
13
+ },
10
14
  "repository": {
11
15
  "type": "git",
12
16
  "url": "git+https://github.com/open-inc/node-parse-server-opendash.git"
@@ -64,7 +68,7 @@
64
68
  "dependencies": {
65
69
  "@openinc/parse-server-schema": "^3.0.6",
66
70
  "@opentelemetry/api-logs": "^0.208.0",
67
- "@opentelemetry/auto-instrumentations-node": "^0.67.0",
71
+ "@opentelemetry/auto-instrumentations-node": "^0.67.3",
68
72
  "@opentelemetry/exporter-logs-otlp-http": "^0.208.0",
69
73
  "@opentelemetry/exporter-trace-otlp-http": "^0.208.0",
70
74
  "@opentelemetry/resources": "^2.2.0",
@@ -72,21 +76,21 @@
72
76
  "@opentelemetry/sdk-node": "^0.208.0",
73
77
  "@opentelemetry/semantic-conventions": "^1.38.0",
74
78
  "@opentelemetry/winston-transport": "^0.19.0",
75
- "cron": "^4.3.4",
79
+ "cron": "^4.4.0",
76
80
  "dayjs": "^1.11.19",
77
- "fast-equals": "^5.3.3",
78
- "i18next": "^25.6.2",
81
+ "fast-equals": "^5.4.0",
82
+ "i18next": "^25.7.3",
79
83
  "i18next-fs-backend": "^2.6.1",
80
- "jsonwebtoken": "^9.0.2",
84
+ "jsonwebtoken": "^9.0.3",
81
85
  "jwks-rsa": "^3.2.0",
82
- "nodemailer": "^7.0.10",
86
+ "nodemailer": "^7.0.12",
83
87
  "nunjucks": "^3.2.4",
84
- "parse-server": "^8.4.0",
88
+ "parse-server": "^9.1.1",
85
89
  "pdf-img-convert": "2.0.0",
86
90
  "semantic-release": "^25.0.2",
87
91
  "table": "^6.9.0",
88
92
  "web-push": "^3.6.7",
89
- "winston": "^3.18.3"
93
+ "winston": "^3.19.0"
90
94
  },
91
95
  "devDependencies": {
92
96
  "@semantic-release/changelog": "^6.0.3",
@@ -94,10 +98,10 @@
94
98
  "@semantic-release/exec": "^7.1.0",
95
99
  "@semantic-release/git": "^10.0.1",
96
100
  "@semantic-release/github": "^12.0.2",
97
- "@semantic-release/npm": "^13.1.2",
101
+ "@semantic-release/npm": "^13.1.3",
98
102
  "@semantic-release/release-notes-generator": "^14.1.0",
99
103
  "@types/jsonwebtoken": "^9.0.10",
100
- "@types/node": "^24.10.1",
104
+ "@types/node": "^24.10.4",
101
105
  "@types/nodemailer": "^7.0.4",
102
106
  "@types/nunjucks": "^3.2.6",
103
107
  "@types/parse": "^3.0.9",
@@ -106,7 +110,7 @@
106
110
  "concurrently": "^9.2.1",
107
111
  "semantic-release-export-data": "^1.2.0",
108
112
  "ts-node": "^10.9.2",
109
- "typedoc": "^0.28.14",
113
+ "typedoc": "^0.28.15",
110
114
  "typedoc-plugin-markdown": "^4.9.0",
111
115
  "typescript": "^5.9.3"
112
116
  }
@@ -0,0 +1,69 @@
1
+ {
2
+ "fields": {
3
+ "actingUser": {
4
+ "type": "Pointer",
5
+ "targetClass": "_User",
6
+ "required": false
7
+ },
8
+ "masterkey": {
9
+ "type": "Boolean",
10
+ "required": true,
11
+ "default": false
12
+ },
13
+ "context": {
14
+ "type": "Object",
15
+ "required": false
16
+ },
17
+ "nameOfClass": {
18
+ "type": "String",
19
+ "required": true
20
+ },
21
+ "changedObject": {
22
+ "type": "String",
23
+ "required": true
24
+ },
25
+ "operation": {
26
+ "type": "String",
27
+ "required": true
28
+ },
29
+ "value": {
30
+ "type": "Object",
31
+ "required": false
32
+ },
33
+ "original": {
34
+ "type": "Object",
35
+ "required": false
36
+ }
37
+ },
38
+ "classLevelPermissions": {
39
+ "find": {
40
+ "requiresAuthentication": true,
41
+ "role:od-admin": true
42
+ },
43
+ "count": {
44
+ "requiresAuthentication": true,
45
+ "role:od-admin": true
46
+ },
47
+ "get": {
48
+ "requiresAuthentication": true,
49
+ "role:od-admin": true
50
+ },
51
+ "create": {
52
+ "role:od-admin": true
53
+ },
54
+ "update": {
55
+ "requiresAuthentication": true,
56
+ "role:od-admin": true
57
+ },
58
+ "delete": {
59
+ "requiresAuthentication": true,
60
+ "role:od-admin": true
61
+ },
62
+ "addField": {
63
+ "role:od-admin": true
64
+ },
65
+ "protectedFields": {
66
+ "*": []
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "fields": {
3
+ "data": {
4
+ "type": "Object",
5
+ "required": true
6
+ },
7
+ "tenant": {
8
+ "type": "Pointer",
9
+ "targetClass": "{{PREFIX}}Tenant",
10
+ "required": false
11
+ },
12
+ "ticket": {
13
+ "type": "Pointer",
14
+ "targetClass": "{{PREFIX}}Maintenance_Ticket",
15
+ "required": true
16
+ }
17
+ },
18
+ "classLevelPermissions": {
19
+ "ACL": {
20
+ "*": {
21
+ "read": true,
22
+ "write": true
23
+ }
24
+ },
25
+ "find": {
26
+ "*": true
27
+ },
28
+ "count": {
29
+ "*": true
30
+ },
31
+ "get": {
32
+ "*": true
33
+ },
34
+ "create": {
35
+ "*": true
36
+ },
37
+ "update": {
38
+ "*": true
39
+ },
40
+ "delete": {
41
+ "*": true
42
+ },
43
+ "addField": {
44
+ "*": true
45
+ },
46
+ "protectedFields": {
47
+ "*": []
48
+ }
49
+ }
50
+ }
File without changes
@@ -1,2 +0,0 @@
1
- "use strict";
2
- (async () => { })();