@openinc/parse-server-opendash 3.4.2 → 3.5.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.
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getAllPermissions = getAllPermissions;
4
4
  exports.default = initPermissions;
5
5
  const __1 = require("..");
6
+ const catchError_1 = require("../../../helper/catchError");
6
7
  const types_1 = require("../../../types");
7
8
  /**
8
9
  * Returns all permissions defined in types/Permissions.ts as an array of Permission objects.
@@ -47,34 +48,63 @@ function createPermission(input) {
47
48
  */
48
49
  async function registerPermissions(tenant) {
49
50
  console.log("[@openinc/parse-server-opendash] Register all permissions");
50
- getAllPermissions().forEach((permission) => {
51
- new Parse.Query(types_1.Permission)
51
+ return getAllPermissions().map(async (permission) => {
52
+ const [resultError, result] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Permission)
52
53
  .equalTo("key", permission.key)
53
54
  .equalTo("tenant", tenant)
54
- .first({ useMasterKey: true })
55
- .then((result) => {
56
- if (!result) {
57
- console.log("[@openinc/parse-server-opendash] Create permission", permission.key);
58
- const newPermission = new types_1.Permission();
59
- newPermission.set("key", permission.key);
60
- newPermission.set("label", permission.label);
61
- newPermission.set("tenant", tenant);
62
- newPermission.set("description", permission.description);
63
- newPermission.save({}, { useMasterKey: true });
64
- }
65
- else {
66
- console.log("[@openinc/parse-server-opendash] Permission already exists", permission.key);
67
- }
68
- });
55
+ .first({ useMasterKey: true }));
56
+ if (resultError) {
57
+ console.error("[@openinc/parse-server-opendash] Error while checking permission", permission.key, resultError);
58
+ return;
59
+ }
60
+ if (!result) {
61
+ console.log("[@openinc/parse-server-opendash] Create permission", permission.key);
62
+ const newPermission = new types_1.Permission();
63
+ newPermission.set("key", permission.key);
64
+ newPermission.set("label", permission.label);
65
+ newPermission.set("tenant", tenant);
66
+ newPermission.set("description", permission.description);
67
+ await newPermission.save({}, { useMasterKey: true });
68
+ }
69
+ else {
70
+ console.log("[@openinc/parse-server-opendash] Permission already exists", permission.key);
71
+ }
69
72
  });
70
73
  }
74
+ /**
75
+ * Set read access for all admin roles to admin overview permission
76
+ */
77
+ async function ensureDefaultAdminAccess(tenant) {
78
+ console.log("[@openinc/parse-server-opendash] Ensure default admin access permissions");
79
+ const [resultError, result] = await (0, catchError_1.catchError)(new Parse.Query(types_1.Permission)
80
+ .equalTo("key", __1.Permissions.OpenINCStack.adminoverview)
81
+ .equalTo("tenant", tenant)
82
+ .first({ useMasterKey: true }));
83
+ if (resultError) {
84
+ console.error("[@openinc/parse-server-opendash] Error while checking permission", __1.Permissions.OpenINCStack.adminoverview, resultError);
85
+ return;
86
+ }
87
+ if (result) {
88
+ const acl = result.getACL() || new Parse.ACL();
89
+ acl.setRoleReadAccess(`od-tenant-admin-${tenant.id}`, true);
90
+ acl.setRoleReadAccess(`od-tenant-admin`, true);
91
+ acl.setRoleReadAccess(`od-admin`, true);
92
+ acl.setRoleWriteAccess(`od-admin`, true);
93
+ result.setACL(acl);
94
+ await result.save(null, { useMasterKey: true });
95
+ }
96
+ else {
97
+ console.log("[@openinc/parse-server-opendash] Permission not found", __1.Permissions.OpenINCStack.adminoverview);
98
+ }
99
+ }
71
100
  async function initPermissions() {
72
101
  const tenants = await new Parse.Query(types_1.Tenant)
73
102
  .descending("createdAt")
74
103
  .find({ useMasterKey: true });
75
104
  if (tenants) {
76
105
  for await (const tenant of tenants) {
77
- await registerPermissions(tenant);
106
+ await Promise.all(await registerPermissions(tenant));
107
+ await ensureDefaultAdminAccess(tenant);
78
108
  }
79
109
  }
80
110
  }
@@ -39,4 +39,7 @@ export declare namespace Permissions {
39
39
  monitorstate = "maintenance:can-update-monitorstate",
40
40
  kanban_view = "maintenance:can-update-kanban-view"
41
41
  }
42
+ enum OpenINCStack {
43
+ adminoverview = "opendash:can-access-admin-overview"
44
+ }
42
45
  }
@@ -48,6 +48,11 @@ var Permissions;
48
48
  OpenService["monitorstate"] = "maintenance:can-update-monitorstate";
49
49
  OpenService["kanban_view"] = "maintenance:can-update-kanban-view";
50
50
  })(OpenService = Permissions.OpenService || (Permissions.OpenService = {}));
51
+ let OpenINCStack;
52
+ (function (OpenINCStack) {
53
+ //Access
54
+ OpenINCStack["adminoverview"] = "opendash:can-access-admin-overview";
55
+ })(OpenINCStack = Permissions.OpenINCStack || (Permissions.OpenINCStack = {}));
51
56
  // can also be used for nested permissions
52
57
  // Example:
53
58
  // export namespace TestPlugin {
@@ -1,5 +1,5 @@
1
1
  import { SaveValues } from "../features/openservice";
2
- import { Maintenance_Ticket, _User } from "../types";
2
+ 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): Promise<Maintenance_Ticket>;
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getUsername = getUsername;
4
4
  exports.init = init;
5
5
  exports.saveTicketData = saveTicketData;
6
+ const openservice_1 = require("../features/openservice");
6
7
  const openware_1 = require("../features/openware");
7
8
  const catchError_1 = require("../helper/catchError");
8
- const openservice_1 = require("../features/openservice");
9
9
  const types_1 = require("../types");
10
10
  function getUsername(user) {
11
11
  if (!user)
@@ -0,0 +1 @@
1
+ export declare function init(): Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.init = init;
4
+ const __1 = require("..");
5
+ async function init() {
6
+ (0, __1.beforeSaveHook)("_Role", async (request) => {
7
+ const role = request.object;
8
+ let tenantId = null;
9
+ if (request.user && request.user.get("tenant")) {
10
+ tenantId = request.user.get("tenant").id;
11
+ }
12
+ if (!role.get("name")) {
13
+ role.set("name", crypto.randomUUID());
14
+ }
15
+ //Set ACL to od-tenant-admin-{id_of_tenant}
16
+ if (role.isNew()) {
17
+ role.setACL(new Parse.ACL({
18
+ ...(tenantId && {
19
+ [`role:od-tenant-user-${tenantId}`]: { read: true },
20
+ [`role:od-tenant-admin-${tenantId}`]: { read: true, write: true },
21
+ }),
22
+ public: { read: false, write: false },
23
+ "role:od-admin": { read: true, write: true },
24
+ }));
25
+ }
26
+ });
27
+ // afterSaveHook("_Role", async (request) => {});
28
+ }
@@ -9,6 +9,7 @@ async function init() {
9
9
  const classNames = [
10
10
  "_beforeLogin",
11
11
  "_User",
12
+ "_Role",
12
13
  ...fs_1.default
13
14
  .readdirSync(__dirname)
14
15
  .filter((filename) => !filename.startsWith("_"))
@@ -1,11 +1,11 @@
1
- import type { _Role } from "./_Role";
1
+ import type { Tenant } from "./Tenant";
2
2
  export interface Maintenance_Ticket_FormConfigAttributes {
3
3
  id: string;
4
4
  objectId: string;
5
5
  createdAt: Date;
6
6
  updatedAt: Date;
7
7
  config: any;
8
- roles: Parse.Relation<Maintenance_Ticket_FormConfig, _Role>;
8
+ tenant?: Tenant;
9
9
  view: string;
10
10
  }
11
11
  export declare class Maintenance_Ticket_FormConfig extends Parse.Object<Maintenance_Ticket_FormConfigAttributes> {
@@ -13,7 +13,8 @@ export declare class Maintenance_Ticket_FormConfig extends Parse.Object<Maintena
13
13
  constructor(data?: Partial<Maintenance_Ticket_FormConfigAttributes>);
14
14
  get config(): any;
15
15
  set config(value: any);
16
- get roles(): Parse.Relation<Maintenance_Ticket_FormConfig, _Role>;
16
+ get tenant(): Tenant | undefined;
17
+ set tenant(value: Tenant | undefined);
17
18
  get view(): string;
18
19
  set view(value: string);
19
20
  }
@@ -11,8 +11,11 @@ class Maintenance_Ticket_FormConfig extends Parse.Object {
11
11
  set config(value) {
12
12
  super.set("config", value);
13
13
  }
14
- get roles() {
15
- return super.relation("roles");
14
+ get tenant() {
15
+ return super.get("tenant");
16
+ }
17
+ set tenant(value) {
18
+ super.set("tenant", value);
16
19
  }
17
20
  get view() {
18
21
  return super.get("view");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openinc/parse-server-opendash",
3
- "version": "3.4.2",
3
+ "version": "3.5.0",
4
4
  "description": "Parse Server Cloud Code for open.INC Stack.",
5
5
  "packageManager": "pnpm@10.8.1",
6
6
  "keywords": [
@@ -4,9 +4,9 @@
4
4
  "type": "Object",
5
5
  "required": true
6
6
  },
7
- "roles": {
8
- "type": "Relation",
9
- "targetClass": "_Role",
7
+ "tenant": {
8
+ "type": "Pointer",
9
+ "targetClass": "{{PREFIX}}Tenant",
10
10
  "required": false
11
11
  },
12
12
  "view": {