@openinc/parse-server-opendash 2.4.66 → 2.4.68

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.
@@ -17,7 +17,6 @@
17
17
  "OD3_Dashboard": "MONITORING",
18
18
  "OD3_Documentation_Category": "DOCUMENTATION",
19
19
  "OD3_Documentation_Document": "DOCUMENTATION",
20
- "OD3_Group": "CORE",
21
20
  "OD3_GTFS_Agency": "GTFS",
22
21
  "OD3_GTFS_Bikes_Allowed": "GTFS",
23
22
  "OD3_GTFS_Calendar": "GTFS",
@@ -31,6 +30,7 @@
31
30
  "OD3_GTFS_Trip": "GTFS",
32
31
  "OD3_GTFS_Wheelchair_Accessible": "GTFS",
33
32
  "OD3_GTFS_Wheelchair_Boarding": "GTFS",
33
+ "OD3_Group": "CORE",
34
34
  "OD3_Knowledge_Article": "KNOWLEDGE",
35
35
  "OD3_Knowledge_Category": "KNOWLEDGE",
36
36
  "OD3_Knowledge_Chat": "KNOWLEDGE",
@@ -40,6 +40,10 @@
40
40
  "OD3_Knowledge_Video": "KNOWLEDGE",
41
41
  "OD3_Language": "CORE",
42
42
  "OD3_Log": "CORE",
43
+ "OD3_MES_Article": "MONITORING",
44
+ "OD3_MES_Order": "MONITORING",
45
+ "OD3_MES_OrderPlan": "MONITORING",
46
+ "OD3_MIAAS_MDSEndpoint": "MIAAS",
43
47
  "OD3_MailTemplate": "MONITORING",
44
48
  "OD3_Maintenance_DailySchedule": "MAINTENANCE",
45
49
  "OD3_Maintenance_Downtime": "MAINTENANCE",
@@ -67,9 +71,9 @@
67
71
  "OD3_Maintenance_Ticket_Kanban_State_Current": "MAINTENANCE",
68
72
  "OD3_Maintenance_Ticket_Source": "MAINTENANCE",
69
73
  "OD3_Maintenance_Ticket_Title": "MAINTENANCE",
70
- "OD3_MIAAS_MDSEndpoint": "MIAAS",
71
74
  "OD3_Monitoring_DataHierachies": "MONITORING",
72
75
  "OD3_Monitoring_Jobs": "MONITORING",
76
+ "OD3_Monitoring_ParseTableSensor": "MONITORING",
73
77
  "OD3_Monitoring_ReportImage": "MONITORING",
74
78
  "OD3_Monitoring_Slideshow": "MONITORING",
75
79
  "OD3_NavigationGroup": "CORE",
@@ -88,7 +92,5 @@
88
92
  "OD3_VirtualKPI": "MONITORING",
89
93
  "OD3_WebPush": "CORE",
90
94
  "OD3_Widget": "MONITORING",
91
- "OD3_WidgetPreset": "MONITORING",
92
- "OD3_MES_Order": "MONITORING",
93
- "OD3_MES_Article": "MONITORING"
95
+ "OD3_WidgetPreset": "MONITORING"
94
96
  }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Permissions that should be registered in the database by default when the server starts.
3
+ * The ACLs are set to od-admin only.
4
+ * Adding new Permissions here requires the server to restart for registering those.
5
+ */
6
+ export declare namespace Permissions {
7
+ enum OpenService {
8
+ global = "maintenance:can-access-global",
9
+ monitor = "maintenance:can-access-monitor",
10
+ material = "maintenance:can-access-material",
11
+ scheduletemplate = "maintenance:can-access-scheduletemplate",
12
+ dailySchedule = "maintenance:can-access-dailySchedule",
13
+ downtime = "maintenance:can-access-downtime",
14
+ restriction = "maintenance:can-access-restriction",
15
+ frequency = "maintenance:can-access-frequency",
16
+ downtimeField0 = "maintenance:can-access-downtime-field-0",
17
+ downtimeField1 = "maintenance:can-access-downtime-field-1",
18
+ downtimeField2 = "maintenance:can-access-downtime-field-2",
19
+ downtimeField3 = "maintenance:can-access-downtime-field-3",
20
+ downtimeField4 = "maintenance:can-access-downtime-field-4",
21
+ restrictionField0 = "maintenance:can-access-restriction-field-0",
22
+ restrictionField1 = "maintenance:can-access-restriction-field-1",
23
+ restrictionField2 = "maintenance:can-access-restriction-field-2",
24
+ frequencyField0 = "maintenance:can-access-frequency-field-0",
25
+ frequencyField1 = "maintenance:can-access-frequency-field-1",
26
+ frequencyField2 = "maintenance:can-access-frequency-field-2",
27
+ frequencyField3 = "maintenance:can-access-frequency-field-3",
28
+ frequencyField4 = "maintenance:can-access-frequency-field-4",
29
+ priority = "maintenance:can-access-priority",
30
+ priorityNumber = "maintenance:can-access-priority-number",
31
+ priorityLabel = "maintenance:can-access-priority-label",
32
+ issuecategory = "maintenance:can-update-issuecategory",
33
+ monitorstate = "maintenance:can-update-monitorstate"
34
+ }
35
+ }
36
+ /**
37
+ * Returns all permissions from the OpenService plugin defined in types/config.ts as an array of Permission objects.
38
+ * @returns all permissions from the OpenService plugin
39
+ */
40
+ export declare function getAllPermissions(): RegisteredPermission[];
41
+ interface PermissionInterface {
42
+ label: string;
43
+ description: string;
44
+ key: string;
45
+ }
46
+ type FunctionKeys<T> = {
47
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never;
48
+ }[keyof T];
49
+ export declare class RegisteredPermission implements PermissionInterface {
50
+ key: string;
51
+ label: string;
52
+ description: string;
53
+ constructor(key: string, label: string, description: string);
54
+ get<T extends Exclude<keyof RegisteredPermission, FunctionKeys<RegisteredPermission>>>(attribute: T): (typeof this)[T];
55
+ set<T extends Exclude<keyof RegisteredPermission, FunctionKeys<RegisteredPermission>>>(attribute: T, value: (typeof this)[T]): this;
56
+ }
57
+ export {};
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RegisteredPermission = exports.Permissions = void 0;
4
+ exports.getAllPermissions = getAllPermissions;
5
+ /**
6
+ * Permissions that should be registered in the database by default when the server starts.
7
+ * The ACLs are set to od-admin only.
8
+ * Adding new Permissions here requires the server to restart for registering those.
9
+ */
10
+ var Permissions;
11
+ (function (Permissions) {
12
+ // needs to be exported for getAllPermissions() to work
13
+ let OpenService;
14
+ (function (OpenService) {
15
+ // Access
16
+ OpenService["global"] = "maintenance:can-access-global";
17
+ OpenService["monitor"] = "maintenance:can-access-monitor";
18
+ OpenService["material"] = "maintenance:can-access-material";
19
+ OpenService["scheduletemplate"] = "maintenance:can-access-scheduletemplate";
20
+ OpenService["dailySchedule"] = "maintenance:can-access-dailySchedule";
21
+ OpenService["downtime"] = "maintenance:can-access-downtime";
22
+ OpenService["restriction"] = "maintenance:can-access-restriction";
23
+ OpenService["frequency"] = "maintenance:can-access-frequency";
24
+ OpenService["downtimeField0"] = "maintenance:can-access-downtime-field-0";
25
+ OpenService["downtimeField1"] = "maintenance:can-access-downtime-field-1";
26
+ OpenService["downtimeField2"] = "maintenance:can-access-downtime-field-2";
27
+ OpenService["downtimeField3"] = "maintenance:can-access-downtime-field-3";
28
+ OpenService["downtimeField4"] = "maintenance:can-access-downtime-field-4";
29
+ OpenService["restrictionField0"] = "maintenance:can-access-restriction-field-0";
30
+ OpenService["restrictionField1"] = "maintenance:can-access-restriction-field-1";
31
+ OpenService["restrictionField2"] = "maintenance:can-access-restriction-field-2";
32
+ OpenService["frequencyField0"] = "maintenance:can-access-frequency-field-0";
33
+ OpenService["frequencyField1"] = "maintenance:can-access-frequency-field-1";
34
+ OpenService["frequencyField2"] = "maintenance:can-access-frequency-field-2";
35
+ OpenService["frequencyField3"] = "maintenance:can-access-frequency-field-3";
36
+ OpenService["frequencyField4"] = "maintenance:can-access-frequency-field-4";
37
+ OpenService["priority"] = "maintenance:can-access-priority";
38
+ OpenService["priorityNumber"] = "maintenance:can-access-priority-number";
39
+ OpenService["priorityLabel"] = "maintenance:can-access-priority-label";
40
+ // Update
41
+ OpenService["issuecategory"] = "maintenance:can-update-issuecategory";
42
+ OpenService["monitorstate"] = "maintenance:can-update-monitorstate";
43
+ })(OpenService = Permissions.OpenService || (Permissions.OpenService = {}));
44
+ // can also be used for nested permissions
45
+ // Example:
46
+ // export namespace TestPlugin {
47
+ // export enum TestPermission {
48
+ // test = "test:can-test",
49
+ // }
50
+ // export enum TestPermission2 {
51
+ // test2 = "test:can-test2",
52
+ // }
53
+ // }
54
+ })(Permissions || (exports.Permissions = Permissions = {}));
55
+ /**
56
+ * Returns all permissions from the OpenService plugin defined in types/config.ts as an array of Permission objects.
57
+ * @returns all permissions from the OpenService plugin
58
+ */
59
+ function getAllPermissions() {
60
+ const permissions = []; // stores all permissions
61
+ for (const key in Permissions) {
62
+ // iterate over the objects / enums of the Permissions namespace
63
+ if (Object.prototype.hasOwnProperty.call(Permissions, key)) {
64
+ const element = Permissions[key]; // get the object / enum
65
+ const createdPermissions = createPermission(element); // create Permission objects recursively
66
+ permissions.push(...createdPermissions);
67
+ }
68
+ }
69
+ return permissions;
70
+ }
71
+ class RegisteredPermission {
72
+ constructor(key, label, description) {
73
+ this.key = key;
74
+ this.label = label;
75
+ this.description = description;
76
+ }
77
+ get(attribute) {
78
+ return this[attribute];
79
+ }
80
+ set(attribute, value) {
81
+ this[attribute] = value;
82
+ return this;
83
+ }
84
+ }
85
+ exports.RegisteredPermission = RegisteredPermission;
86
+ /**
87
+ * Recursively creates Permission objects from the input object.
88
+ * @param input a string from an enum or an enum itself
89
+ * @returns an array of Permission objects
90
+ */
91
+ function createPermission(input) {
92
+ const permissions = []; // all permission objects created from the input
93
+ if (typeof input === "string") {
94
+ // if the input is a string, create a Permission object from it
95
+ permissions.push(new RegisteredPermission(input, input + ".label", input + ".description"));
96
+ }
97
+ else {
98
+ // if the input is an object, iterate over its keys and create Permission objects from the values
99
+ for (const key in input) {
100
+ if (Object.prototype.hasOwnProperty.call(input, key)) {
101
+ const element = input[key];
102
+ permissions.push(...createPermission(element));
103
+ }
104
+ }
105
+ }
106
+ return permissions;
107
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * This handles all config changes for a key starting with 'OPENSERVICE_' in class OD3_Config
3
+ */
4
+ export declare function init(): Promise<void>;
@@ -0,0 +1,36 @@
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
+ /**
7
+ * This handles all config changes for a key starting with 'OPENSERVICE_' in class OD3_Config
8
+ */
9
+ async function init() {
10
+ (0, __1.beforeSaveHook)(types_1.Config, async (request) => {
11
+ const { object, original, user } = request;
12
+ await (0, __1.defaultHandler)(request);
13
+ //Set custom acl for all keys starting with 'OPENSERVICE_'
14
+ //Read should only be allowed for tenant users
15
+ //Write should be allowed for tenant users
16
+ if (object.get("key").startsWith("OPENSERVICE_")) {
17
+ let acl = object.getACL();
18
+ const tenant = object.get("tenant");
19
+ if (!acl) {
20
+ acl = new Parse.ACL();
21
+ }
22
+ acl.setRoleReadAccess("od-admin", true);
23
+ acl.setRoleWriteAccess("od-admin", true);
24
+ if (tenant?.id) {
25
+ acl.setPublicReadAccess(false);
26
+ acl.setPublicWriteAccess(false);
27
+ acl.setRoleReadAccess(`od-tenant-admin-${tenant?.id}`, true);
28
+ acl.setRoleWriteAccess(`od-tenant-admin-${tenant?.id}`, true);
29
+ acl.setRoleReadAccess(`od-tenant-user-${tenant?.id}`, true);
30
+ acl.setRoleWriteAccess(`od-tenant-user-${tenant?.id}`, true);
31
+ }
32
+ object.setACL(acl);
33
+ }
34
+ });
35
+ (0, __1.afterSaveHook)(types_1.Config, async ({ object, original, user }) => { });
36
+ }
@@ -0,0 +1 @@
1
+ export declare function init(): Promise<void>;
@@ -0,0 +1,17 @@
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
+ (0, __1.beforeSaveHook)(types_1.MES_Article, async (request) => {
8
+ const { object, original, user } = request;
9
+ await (0, __1.defaultHandler)(request);
10
+ await (0, __1.defaultAclHandler)(request);
11
+ // TODO
12
+ });
13
+ (0, __1.afterSaveHook)(types_1.MES_Article, async (request) => {
14
+ const { object, original, user } = request;
15
+ // TODO
16
+ });
17
+ }
@@ -11,24 +11,29 @@ const excludeFields = [
11
11
  "tenant",
12
12
  "source",
13
13
  "unitInfo",
14
+ "tag",
15
+ "article",
14
16
  ];
15
17
  const standardFields = [
16
- "ordernr",
17
- "article",
18
- "setup_time",
19
- "end",
20
- "start",
21
- "status",
22
- "order_quantity",
18
+ "start", //date
19
+ "ordernr", //0
20
+ "status", //1
21
+ "articlenr", //2
22
+ "articlename", //3
23
+ "setup_time", //4
24
+ "duration", //5
25
+ "order_quantity", //6
26
+ "targettime", //7
23
27
  ];
24
28
  const defaultValueTypes = [
25
- { unit: "", name: "status", type: "String" },
26
- { unit: "", name: "ordernr", type: "String" },
27
- { unit: "", name: "article", type: "String" },
28
- { unit: "", name: "articlenr", type: "String" },
29
- { unit: "ms", name: "setup_time", type: "Number" },
30
- { unit: "ms", name: "duration", type: "Number" },
31
- { unit: "#", name: "order_quantity", type: "Number" },
29
+ { unit: "", name: "ordernr", type: "String" }, //0
30
+ { unit: "", name: "status", type: "String" }, //1
31
+ { unit: "", name: "articlenr", type: "String" }, //2
32
+ { unit: "", name: "articlename", type: "String" }, //3
33
+ { unit: "ms", name: "setup_time", type: "Number" }, //4
34
+ { unit: "ms", name: "duration", type: "Number" }, //5
35
+ { unit: "#", name: "order_quantity", type: "Number" }, //6
36
+ { unit: "ms", name: "targettime", type: "Number" }, //7
32
37
  ];
33
38
  async function init() {
34
39
  (0, __1.beforeSaveHook)(types_1.MES_Order, async (request) => {
@@ -40,52 +45,89 @@ async function init() {
40
45
  allowCustomACL: true,
41
46
  allowTenantUserWrite: true,
42
47
  });
43
- if (object.start &&
44
- object.start.getTime() > nowThresholded &&
45
- !(object.status === "canceled" || object.status === "rescheduled")) {
46
- object.status = "planned";
48
+ if (!object.tag) {
49
+ const source = await object.get("source")?.fetch({ useMasterKey: true });
50
+ if (!source || !source.tag) {
51
+ throw new Error("No source found in order. Cannot start order.");
52
+ }
53
+ object.set("tag", source.tag);
54
+ }
55
+ if (!object.articlenr) {
56
+ const article = await object
57
+ .get("article")
58
+ ?.fetch({ useMasterKey: true });
59
+ if (article) {
60
+ object.set("articlenr", article.get("artnr"));
61
+ object.set("articlename", article?.get("name"));
62
+ object.set("targettime", object.targettime
63
+ ? object.targettime
64
+ : article?.get("targettime") || 0);
65
+ }
66
+ }
67
+ if (object.status === "canceled") {
47
68
  }
48
69
  // If the order is started and has a source, it is running
49
70
  if (object.start &&
50
71
  object.start.getTime() < nowThresholded &&
51
72
  object.source &&
52
- !(object.status === "canceled" || object.status === "rescheduled")) {
53
- object.status = "running";
73
+ !object.status) {
74
+ object.set("status", "running");
75
+ }
76
+ if (object.start &&
77
+ object.start.getTime() > Date.now() &&
78
+ object.source &&
79
+ !object.status) {
80
+ object.set("status", "planned");
54
81
  }
55
82
  // If the order is started and has no source, it is unknown
56
83
  if (object.start &&
57
84
  object.start.getTime() < nowThresholded &&
58
- !object.source &&
59
- !object.status) {
60
- object.status = "unknown";
85
+ !object.source) {
86
+ object.set("status", "unknown");
61
87
  }
62
88
  // If the order has been started and ended, it is done
63
89
  if (object.start &&
64
- object.end &&
65
- object.end.getTime() < nowThresholded &&
66
- !(object.status === "canceled" || object.status === "rescheduled")) {
67
- object.status = "done";
90
+ object.duration &&
91
+ (object.status === "running" || object.status === "planned")) {
92
+ object.set("status", "done");
68
93
  }
69
94
  });
70
95
  (0, __1.afterSaveHook)(types_1.MES_Order, async (request) => {
71
96
  const { object, original, user } = request;
72
97
  try {
73
98
  if (original) {
99
+ // If the order is canceled, publish it as canceled
100
+ if (object.status === "canceled" && original.status !== "canceled") {
101
+ const data = await object2OWItem(object);
102
+ await (0, ow_1.publishDataItem)(data, user?.getEmail(), true);
103
+ return;
104
+ }
105
+ // If the order is rescheduled, publish it as rescheduled
74
106
  if ((original?.start?.getTime() || 0) !==
75
107
  (object.get("start")?.getTime() || 0)) {
108
+ console.log("-".repeat(20));
109
+ console.log("Publishing rescheduled order");
110
+ console.log("-".repeat(20));
76
111
  const rescheduled = await object2OWItem(original);
77
112
  rescheduled.values[0].value[0] = "rescheduled";
78
113
  await (0, ow_1.publishDataItem)(rescheduled, user?.getEmail(), true);
114
+ return;
79
115
  }
80
116
  }
117
+ if (object.status === "canceled") {
118
+ // If order was canceled before, do not publish it
119
+ return;
120
+ }
81
121
  const data = await object2OWItem(object);
82
122
  await (0, ow_1.publishDataItem)(data, user?.getEmail(), true);
83
- console.log(JSON.stringify(data, null, 2));
84
123
  // Publish all running orders separately to make use of these as reference values
85
124
  if (object.status === "running") {
86
125
  const runningData = { ...data };
87
126
  runningData.id = "ow_mes_order_running";
88
127
  runningData.name = "Order_Running";
128
+ console.log("-".repeat(20));
129
+ console.log("Publishing running order " + object.id);
130
+ console.log("-".repeat(20));
89
131
  await (0, ow_1.publishDataItem)(runningData, user?.getEmail(), true);
90
132
  }
91
133
  }
@@ -96,8 +138,12 @@ async function init() {
96
138
  });
97
139
  }
98
140
  async function object2OWItem(object) {
99
- const source = await object.get("source")?.fetch({ useMasterKey: true });
100
- const tag = source?.get("tag");
141
+ const tag = object.get("tag");
142
+ const configString = await new Parse.Query("OD3_Config")
143
+ .equalTo("key", "ow.mes.unitInfo")
144
+ .descending("priority")
145
+ .first({ useMasterKey: true });
146
+ const fieldInfos = JSON.parse(configString?.get("value") || "{}");
101
147
  if (!tag || tag === "") {
102
148
  throw new Error("No tag found in source. Cannot publish DataItem.");
103
149
  }
@@ -105,7 +151,7 @@ async function object2OWItem(object) {
105
151
  //@ts-expect-error
106
152
  const schema = await schemaQ.get({ useMasterKey: true });
107
153
  const fields = schema.fields;
108
- const extraVType = await createCustomValueTypes(object, fields);
154
+ const extraVType = await createCustomValueTypes(object, fields, fieldInfos);
109
155
  const values = await createValueArrayForObject(object, extraVType, fields);
110
156
  const valueTypes = [...defaultValueTypes, ...extraVType];
111
157
  return {
@@ -117,7 +163,7 @@ async function object2OWItem(object) {
117
163
  values,
118
164
  };
119
165
  }
120
- function createCustomValueTypes(object, fields) {
166
+ function createCustomValueTypes(object, fields, fieldInfos) {
121
167
  const keyObject = object.toJSON();
122
168
  return Object.keys(keyObject)
123
169
  .filter((field) => {
@@ -138,7 +184,7 @@ function createCustomValueTypes(object, fields) {
138
184
  };
139
185
  case "Number":
140
186
  return {
141
- unit: object.unitInfo[field] || "",
187
+ unit: fieldInfos[field]?.unit || "",
142
188
  name: field,
143
189
  type: "Number",
144
190
  };
@@ -171,24 +217,36 @@ async function createValueArrayForObject(object, extraValues, fields) {
171
217
  const article = articleData?.get("name");
172
218
  const articlenr = articleData?.get("artnr");
173
219
  const setup_time = object.get("setup_time");
174
- const start = object.get("start");
175
- const end = object.get("end");
176
- let duration = 0;
177
- if (start && end) {
178
- duration = end.getTime() - start.getTime();
179
- }
180
- values.push(status);
181
- values.push(ordernr);
182
- values.push(article);
183
- values.push(articlenr);
184
- values.push(setup_time);
185
- values.push(duration);
220
+ const duration = object.get("duration");
221
+ const order_quantity = object.get("order_quantity");
222
+ const targettime = object.get("targettime");
223
+ /*
224
+ { unit: "", name: "ordernr", type: "String" }, //0
225
+ { unit: "", name: "status", type: "String" }, //1
226
+ { unit: "", name: "articlenr", type: "String" }, //2
227
+ { unit: "", name: "articlename", type: "String" }, //3
228
+ { unit: "ms", name: "setup_time", type: "Number" }, //4
229
+ { unit: "ms", name: "duration", type: "Number" }, //5
230
+ { unit: "#", name: "order_quantity", type: "Number" }, //6
231
+ { unit: "ms", name: "targettime", type: "Number" }, //7
232
+
233
+ */
234
+ values.push(ordernr || "unknown"); //0
235
+ values.push(status || "unknown"); //1
236
+ values.push(articlenr); //2
237
+ values.push(article); //3
238
+ values.push(setup_time ?? 0); //4
239
+ values.push(duration ?? 0); //5
240
+ values.push(order_quantity ?? 0); //6
241
+ values.push(targettime ?? 0); //7
186
242
  for (const extraValue of extraValues) {
187
243
  let value = object.get(extraValue.name);
188
- if (fields[extraValue.name].type === "Date") {
189
- value = value.getTime();
244
+ if (value && fields[extraValue.name].type === "Date") {
245
+ if (value instanceof Date) {
246
+ value = value.getTime();
247
+ }
190
248
  }
191
249
  values.push(value);
192
250
  }
193
- return [{ date: object.start.getTime(), value: values }];
251
+ return [{ date: object.get("start").getTime(), value: values }];
194
252
  }
@@ -12,6 +12,9 @@ async function init() {
12
12
  });
13
13
  (0, __1.afterSaveHook)(types_1.Maintenance_Schedule_Template, async (request) => {
14
14
  const { object, original, user } = request;
15
- // TODO
15
+ const cronstring = object.get("cron")["run_cron"];
16
+ // Create a file for bree to run it.
17
+ //TODO: Create notification object
18
+ //TODO: Send mail or anything that is enabled
16
19
  });
17
20
  }
@@ -0,0 +1 @@
1
+ export declare function init(): Promise<void>;
@@ -0,0 +1,17 @@
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
+ (0, __1.beforeSaveHook)(types_1.Monitoring_DataHierachies, async (request) => {
8
+ const { object, original, user } = request;
9
+ await (0, __1.defaultHandler)(request);
10
+ await (0, __1.defaultAclHandler)(request);
11
+ // TODO
12
+ });
13
+ (0, __1.afterSaveHook)(types_1.Monitoring_DataHierachies, async (request) => {
14
+ const { object, original, user } = request;
15
+ // TODO
16
+ });
17
+ }
@@ -0,0 +1 @@
1
+ export declare function init(): Promise<void>;
@@ -0,0 +1,17 @@
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
+ (0, __1.beforeSaveHook)(types_1.Monitoring_Jobs, async (request) => {
8
+ const { object, original, user } = request;
9
+ await (0, __1.defaultHandler)(request);
10
+ await (0, __1.defaultAclHandler)(request);
11
+ // TODO
12
+ });
13
+ (0, __1.afterSaveHook)(types_1.Monitoring_Jobs, async (request) => {
14
+ const { object, original, user } = request;
15
+ // TODO
16
+ });
17
+ }
@@ -0,0 +1 @@
1
+ export declare function init(): Promise<void>;
@@ -0,0 +1,17 @@
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
+ (0, __1.beforeSaveHook)(types_1.Monitoring_ParseTableSensor, async (request) => {
8
+ const { object, original, user } = request;
9
+ await (0, __1.defaultHandler)(request);
10
+ await (0, __1.defaultAclHandler)(request);
11
+ // TODO
12
+ });
13
+ (0, __1.afterSaveHook)(types_1.Monitoring_ParseTableSensor, async (request) => {
14
+ const { object, original, user } = request;
15
+ // TODO
16
+ });
17
+ }
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.init = init;
4
4
  const __1 = require("..");
5
+ const registerPermissions_1 = require("../helper/registerPermissions");
5
6
  const types_1 = require("../types");
6
7
  async function init() {
8
+ await registerPermissions();
7
9
  (0, __1.beforeSaveHook)(types_1.Permission, async (request) => {
8
10
  const { object, original, user } = request;
9
11
  await (0, __1.defaultHandler)(request);
@@ -16,3 +18,27 @@ async function init() {
16
18
  // TODO
17
19
  });
18
20
  }
21
+ /**
22
+ * Register all permissions in the database, if not already registered.
23
+ */
24
+ async function registerPermissions() {
25
+ console.log("Register all permissions");
26
+ (0, registerPermissions_1.getAllPermissions)().forEach((permission) => {
27
+ new Parse.Query(types_1.Permission)
28
+ .equalTo("key", permission.key)
29
+ .first({ useMasterKey: true })
30
+ .then((result) => {
31
+ if (!result) {
32
+ console.log("Create permission", permission.key);
33
+ const newPermission = new types_1.Permission();
34
+ newPermission.set("key", permission.key);
35
+ newPermission.set("label", permission.label);
36
+ newPermission.set("description", permission.description);
37
+ newPermission.save({}, { useMasterKey: true });
38
+ }
39
+ else {
40
+ console.log("Permission already exists", permission.key);
41
+ }
42
+ });
43
+ });
44
+ }
@@ -5,6 +5,7 @@ export interface MES_ArticleAttributes {
5
5
  updatedAt: Date;
6
6
  artnr: string;
7
7
  name: string;
8
+ targettime: number;
8
9
  }
9
10
  export declare class MES_Article extends Parse.Object<MES_ArticleAttributes> {
10
11
  static className: string;
@@ -13,4 +14,6 @@ export declare class MES_Article extends Parse.Object<MES_ArticleAttributes> {
13
14
  set artnr(value: string);
14
15
  get name(): string;
15
16
  set name(value: string);
17
+ get targettime(): number;
18
+ set targettime(value: number);
16
19
  }
@@ -17,6 +17,12 @@ class MES_Article extends Parse.Object {
17
17
  set name(value) {
18
18
  super.set("name", value);
19
19
  }
20
+ get targettime() {
21
+ return super.get("targettime");
22
+ }
23
+ set targettime(value) {
24
+ super.set("targettime", value);
25
+ }
20
26
  }
21
27
  exports.MES_Article = MES_Article;
22
28
  MES_Article.className = "OD3_MES_Article";
@@ -7,30 +7,34 @@ export interface MES_OrderAttributes {
7
7
  createdAt: Date;
8
8
  updatedAt: Date;
9
9
  article?: MES_Article;
10
- end?: Date;
10
+ articlename?: string;
11
+ articlenr?: string;
12
+ duration: number;
11
13
  order_quantity: number;
12
14
  ordernr: string;
13
- rikutec_cycletime: number;
14
15
  setup_time: number;
15
16
  source?: Source;
16
17
  start: Date;
17
18
  status?: string;
19
+ tag?: string;
20
+ targettime: number;
18
21
  tenant: Tenant;
19
- unitInfo: any;
20
22
  }
21
23
  export declare class MES_Order extends Parse.Object<MES_OrderAttributes> {
22
24
  static className: string;
23
25
  constructor(data?: Partial<MES_OrderAttributes>);
24
26
  get article(): MES_Article | undefined;
25
27
  set article(value: MES_Article | undefined);
26
- get end(): Date | undefined;
27
- set end(value: Date | undefined);
28
+ get articlename(): string | undefined;
29
+ set articlename(value: string | undefined);
30
+ get articlenr(): string | undefined;
31
+ set articlenr(value: string | undefined);
32
+ get duration(): number;
33
+ set duration(value: number);
28
34
  get order_quantity(): number;
29
35
  set order_quantity(value: number);
30
36
  get ordernr(): string;
31
37
  set ordernr(value: string);
32
- get rikutec_cycletime(): number;
33
- set rikutec_cycletime(value: number);
34
38
  get setup_time(): number;
35
39
  set setup_time(value: number);
36
40
  get source(): Source | undefined;
@@ -39,8 +43,10 @@ export declare class MES_Order extends Parse.Object<MES_OrderAttributes> {
39
43
  set start(value: Date);
40
44
  get status(): string | undefined;
41
45
  set status(value: string | undefined);
46
+ get tag(): string | undefined;
47
+ set tag(value: string | undefined);
48
+ get targettime(): number;
49
+ set targettime(value: number);
42
50
  get tenant(): Tenant;
43
51
  set tenant(value: Tenant);
44
- get unitInfo(): any;
45
- set unitInfo(value: any);
46
52
  }
@@ -11,11 +11,23 @@ class MES_Order extends Parse.Object {
11
11
  set article(value) {
12
12
  super.set("article", value);
13
13
  }
14
- get end() {
15
- return super.get("end");
14
+ get articlename() {
15
+ return super.get("articlename");
16
16
  }
17
- set end(value) {
18
- super.set("end", value);
17
+ set articlename(value) {
18
+ super.set("articlename", value);
19
+ }
20
+ get articlenr() {
21
+ return super.get("articlenr");
22
+ }
23
+ set articlenr(value) {
24
+ super.set("articlenr", value);
25
+ }
26
+ get duration() {
27
+ return super.get("duration");
28
+ }
29
+ set duration(value) {
30
+ super.set("duration", value);
19
31
  }
20
32
  get order_quantity() {
21
33
  return super.get("order_quantity");
@@ -29,12 +41,6 @@ class MES_Order extends Parse.Object {
29
41
  set ordernr(value) {
30
42
  super.set("ordernr", value);
31
43
  }
32
- get rikutec_cycletime() {
33
- return super.get("rikutec_cycletime");
34
- }
35
- set rikutec_cycletime(value) {
36
- super.set("rikutec_cycletime", value);
37
- }
38
44
  get setup_time() {
39
45
  return super.get("setup_time");
40
46
  }
@@ -59,18 +65,24 @@ class MES_Order extends Parse.Object {
59
65
  set status(value) {
60
66
  super.set("status", value);
61
67
  }
68
+ get tag() {
69
+ return super.get("tag");
70
+ }
71
+ set tag(value) {
72
+ super.set("tag", value);
73
+ }
74
+ get targettime() {
75
+ return super.get("targettime");
76
+ }
77
+ set targettime(value) {
78
+ super.set("targettime", value);
79
+ }
62
80
  get tenant() {
63
81
  return super.get("tenant");
64
82
  }
65
83
  set tenant(value) {
66
84
  super.set("tenant", value);
67
85
  }
68
- get unitInfo() {
69
- return super.get("unitInfo");
70
- }
71
- set unitInfo(value) {
72
- super.set("unitInfo", value);
73
- }
74
86
  }
75
87
  exports.MES_Order = MES_Order;
76
88
  MES_Order.className = "OD3_MES_Order";
@@ -0,0 +1,33 @@
1
+ import type { MES_Article } from "./MES_Article";
2
+ import type { Source } from "./Source";
3
+ export interface MES_OrderPlanAttributes {
4
+ id: string;
5
+ objectId: string;
6
+ createdAt: Date;
7
+ updatedAt: Date;
8
+ article?: MES_Article;
9
+ ordernr: string;
10
+ planEnd?: Date;
11
+ planStart?: Date;
12
+ setup_time: number;
13
+ source?: Source;
14
+ target_quantity: number;
15
+ }
16
+ export declare class MES_OrderPlan extends Parse.Object<MES_OrderPlanAttributes> {
17
+ static className: string;
18
+ constructor(data?: Partial<MES_OrderPlanAttributes>);
19
+ get article(): MES_Article | undefined;
20
+ set article(value: MES_Article | undefined);
21
+ get ordernr(): string;
22
+ set ordernr(value: string);
23
+ get planEnd(): Date | undefined;
24
+ set planEnd(value: Date | undefined);
25
+ get planStart(): Date | undefined;
26
+ set planStart(value: Date | undefined);
27
+ get setup_time(): number;
28
+ set setup_time(value: number);
29
+ get source(): Source | undefined;
30
+ set source(value: Source | undefined);
31
+ get target_quantity(): number;
32
+ set target_quantity(value: number);
33
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MES_OrderPlan = void 0;
4
+ class MES_OrderPlan extends Parse.Object {
5
+ constructor(data) {
6
+ super("OD3_MES_OrderPlan", data);
7
+ }
8
+ get article() {
9
+ return super.get("article");
10
+ }
11
+ set article(value) {
12
+ super.set("article", value);
13
+ }
14
+ get ordernr() {
15
+ return super.get("ordernr");
16
+ }
17
+ set ordernr(value) {
18
+ super.set("ordernr", value);
19
+ }
20
+ get planEnd() {
21
+ return super.get("planEnd");
22
+ }
23
+ set planEnd(value) {
24
+ super.set("planEnd", value);
25
+ }
26
+ get planStart() {
27
+ return super.get("planStart");
28
+ }
29
+ set planStart(value) {
30
+ super.set("planStart", value);
31
+ }
32
+ get setup_time() {
33
+ return super.get("setup_time");
34
+ }
35
+ set setup_time(value) {
36
+ super.set("setup_time", value);
37
+ }
38
+ get source() {
39
+ return super.get("source");
40
+ }
41
+ set source(value) {
42
+ super.set("source", value);
43
+ }
44
+ get target_quantity() {
45
+ return super.get("target_quantity");
46
+ }
47
+ set target_quantity(value) {
48
+ super.set("target_quantity", value);
49
+ }
50
+ }
51
+ exports.MES_OrderPlan = MES_OrderPlan;
52
+ MES_OrderPlan.className = "OD3_MES_OrderPlan";
53
+ Parse.Object.registerSubclass("OD3_MES_OrderPlan", MES_OrderPlan);
@@ -84,6 +84,8 @@ export { MES_Article } from "./MES_Article";
84
84
  export type { MES_ArticleAttributes } from "./MES_Article";
85
85
  export { MES_Order } from "./MES_Order";
86
86
  export type { MES_OrderAttributes } from "./MES_Order";
87
+ export { MES_OrderPlan } from "./MES_OrderPlan";
88
+ export type { MES_OrderPlanAttributes } from "./MES_OrderPlan";
87
89
  export { MIAAS_MDSEndpoint } from "./MIAAS_MDSEndpoint";
88
90
  export type { MIAAS_MDSEndpointAttributes } from "./MIAAS_MDSEndpoint";
89
91
  export { MailTemplate } from "./MailTemplate";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Maintenance_Issuecategory = exports.Maintenance_Frequency = exports.Maintenance_Duedate = exports.Maintenance_Downtime = exports.Maintenance_DailySchedule = exports.MailTemplate = exports.MIAAS_MDSEndpoint = 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.Group = 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_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.AlarmWebhook = exports.AlarmAction = exports.Alarm = void 0;
4
- exports.WidgetPreset = exports.Widget = exports.WebPush = exports.VirtualKPI = exports.UserData = exports.TenantTrustedDomain = exports.TenantMeta = exports.Tenant = exports.SourceMeta = exports.Source = exports.Share = exports.Report = exports.Push = exports.Permission = 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_Kanban_State_Current = exports.Maintenance_Ticket_Kanban_State = exports.Maintenance_Ticket_Issuecategory = exports.Maintenance_Ticket_Assignment = exports.Maintenance_Ticket = exports.Maintenance_Source_File = exports.Maintenance_SourceMeta = exports.Maintenance_Schedule_Template = exports.Maintenance_Schedule_Step = exports.Maintenance_Schedule_Execution_Step = exports.Maintenance_Schedule_Execution = exports.Maintenance_Restriction = exports.Maintenance_Priority = exports.Maintenance_Order = exports.Maintenance_Message_Body = exports.Maintenance_Message = exports.Maintenance_Media = exports.Maintenance_Kanban_State = exports.Maintenance_Item = void 0;
3
+ exports.Maintenance_Frequency = exports.Maintenance_Duedate = exports.Maintenance_Downtime = exports.Maintenance_DailySchedule = exports.MailTemplate = 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.Group = 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_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.AlarmWebhook = exports.AlarmAction = exports.Alarm = void 0;
4
+ exports.WidgetPreset = exports.Widget = exports.WebPush = exports.VirtualKPI = exports.UserData = exports.TenantTrustedDomain = exports.TenantMeta = exports.Tenant = exports.SourceMeta = exports.Source = exports.Share = exports.Report = exports.Push = exports.Permission = 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_Kanban_State_Current = exports.Maintenance_Ticket_Kanban_State = exports.Maintenance_Ticket_Issuecategory = exports.Maintenance_Ticket_Assignment = exports.Maintenance_Ticket = exports.Maintenance_Source_File = exports.Maintenance_SourceMeta = exports.Maintenance_Schedule_Template = exports.Maintenance_Schedule_Step = exports.Maintenance_Schedule_Execution_Step = exports.Maintenance_Schedule_Execution = exports.Maintenance_Restriction = exports.Maintenance_Priority = exports.Maintenance_Order = exports.Maintenance_Message_Body = exports.Maintenance_Message = exports.Maintenance_Media = exports.Maintenance_Kanban_State = exports.Maintenance_Item = exports.Maintenance_Issuecategory = void 0;
5
5
  var Alarm_1 = require("./Alarm");
6
6
  Object.defineProperty(exports, "Alarm", { enumerable: true, get: function () { return Alarm_1.Alarm; } });
7
7
  var AlarmAction_1 = require("./AlarmAction");
@@ -88,6 +88,8 @@ var MES_Article_1 = require("./MES_Article");
88
88
  Object.defineProperty(exports, "MES_Article", { enumerable: true, get: function () { return MES_Article_1.MES_Article; } });
89
89
  var MES_Order_1 = require("./MES_Order");
90
90
  Object.defineProperty(exports, "MES_Order", { enumerable: true, get: function () { return MES_Order_1.MES_Order; } });
91
+ var MES_OrderPlan_1 = require("./MES_OrderPlan");
92
+ Object.defineProperty(exports, "MES_OrderPlan", { enumerable: true, get: function () { return MES_OrderPlan_1.MES_OrderPlan; } });
91
93
  var MIAAS_MDSEndpoint_1 = require("./MIAAS_MDSEndpoint");
92
94
  Object.defineProperty(exports, "MIAAS_MDSEndpoint", { enumerable: true, get: function () { return MIAAS_MDSEndpoint_1.MIAAS_MDSEndpoint; } });
93
95
  var MailTemplate_1 = require("./MailTemplate");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openinc/parse-server-opendash",
3
- "version": "2.4.66",
3
+ "version": "2.4.68",
4
4
  "description": "Parse Server Cloud Code for open.DASH",
5
5
  "keywords": [
6
6
  "parse",
@@ -20,13 +20,14 @@
20
20
  "schema-up": "parse-server-schema up --prefix OD3_ ./schema",
21
21
  "schema-ts": "parse-server-schema typescript --prefix OD3_ --global-sdk ./src/types",
22
22
  "typedoc": "typedoc --plugin typedoc-plugin-markdown --hideBreadcrumbs --out docs src/index.ts",
23
- "predevstart": "cd /usr/src/app && pnpm config set strict-ssl false && echo 'Installing additional packages: ' ${OPENINC_PARSE_ADDITIONAL_PACKAGES} && pnpm install ${OPENINC_PARSE_ADDITIONAL_PACKAGES} && echo 'Fetching schema from parse' && pnpm parse-server-schema down --prefix OD3_ ./packages/schema/",
23
+ "predevstart": "cd /usr/src/app && pnpm config set strict-ssl false && echo 'Installing additional packages: ' ${OPENINC_PARSE_ADDITIONAL_PACKAGES} && pnpm install ${OPENINC_PARSE_ADDITIONAL_PACKAGES}",
24
24
  "devstart": "parse-server ./config.js",
25
25
  "featuremap": "node ./scripts/create-featuremap.js",
26
26
  "hooks": "node ./scripts/create-hooks.js"
27
27
  },
28
28
  "dependencies": {
29
29
  "@openinc/parse-server-schema": "^1.7.8",
30
+ "bree": "^9.2.4",
30
31
  "fast-equals": "^5.0.1",
31
32
  "jsonwebtoken": "^9.0.2",
32
33
  "node-fetch": "^2.7.0",
@@ -7,6 +7,11 @@
7
7
  "name": {
8
8
  "type": "String",
9
9
  "required": true
10
+ },
11
+ "targettime": {
12
+ "type": "Number",
13
+ "required": true,
14
+ "defaultValue": 0
10
15
  }
11
16
  },
12
17
  "classLevelPermissions": {
@@ -5,10 +5,19 @@
5
5
  "targetClass": "{{PREFIX}}MES_Article",
6
6
  "required": false
7
7
  },
8
- "end": {
9
- "type": "Date",
8
+ "articlename": {
9
+ "type": "String",
10
+ "required": false
11
+ },
12
+ "articlenr": {
13
+ "type": "String",
10
14
  "required": false
11
15
  },
16
+ "duration": {
17
+ "type": "Number",
18
+ "required": true,
19
+ "defaultValue": 0
20
+ },
12
21
  "order_quantity": {
13
22
  "type": "Number",
14
23
  "required": false,
@@ -18,11 +27,6 @@
18
27
  "type": "String",
19
28
  "required": true
20
29
  },
21
- "rikutec_cycletime": {
22
- "type": "Number",
23
- "required": true,
24
- "defaultValue": 0
25
- },
26
30
  "setup_time": {
27
31
  "type": "Number",
28
32
  "required": false,
@@ -41,15 +45,18 @@
41
45
  "type": "String",
42
46
  "required": false
43
47
  },
48
+ "tag": {
49
+ "type": "String",
50
+ "required": false
51
+ },
52
+ "targettime": {
53
+ "type": "Number",
54
+ "required": true
55
+ },
44
56
  "tenant": {
45
57
  "type": "Pointer",
46
58
  "targetClass": "{{PREFIX}}Tenant",
47
59
  "required": true
48
- },
49
- "unitInfo": {
50
- "type": "Object",
51
- "required": true,
52
- "defaultValue": {}
53
60
  }
54
61
  },
55
62
  "classLevelPermissions": {
@@ -0,0 +1,62 @@
1
+ {
2
+ "fields": {
3
+ "article": {
4
+ "type": "Pointer",
5
+ "targetClass": "{{PREFIX}}MES_Article",
6
+ "required": false
7
+ },
8
+ "ordernr": {
9
+ "type": "String",
10
+ "required": true
11
+ },
12
+ "planEnd": {
13
+ "type": "Date",
14
+ "required": false
15
+ },
16
+ "planStart": {
17
+ "type": "Date",
18
+ "required": false
19
+ },
20
+ "setup_time": {
21
+ "type": "Number",
22
+ "required": true,
23
+ "defaultValue": 0
24
+ },
25
+ "source": {
26
+ "type": "Pointer",
27
+ "targetClass": "{{PREFIX}}Source",
28
+ "required": false
29
+ },
30
+ "target_quantity": {
31
+ "type": "Number",
32
+ "required": true,
33
+ "defaultValue": 0
34
+ }
35
+ },
36
+ "classLevelPermissions": {
37
+ "find": {
38
+ "*": true
39
+ },
40
+ "count": {
41
+ "*": true
42
+ },
43
+ "get": {
44
+ "*": true
45
+ },
46
+ "create": {
47
+ "*": true
48
+ },
49
+ "update": {
50
+ "*": true
51
+ },
52
+ "delete": {
53
+ "*": true
54
+ },
55
+ "addField": {
56
+ "*": true
57
+ },
58
+ "protectedFields": {
59
+ "*": []
60
+ }
61
+ }
62
+ }