@oneuptime/common 7.0.3129 → 7.0.3139

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.
Files changed (89) hide show
  1. package/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.ts +1 -1
  2. package/Models/AnalyticsModels/Index.ts +28 -1
  3. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +4 -0
  4. package/Models/DatabaseModels/Incident.ts +5 -0
  5. package/Models/DatabaseModels/Index.ts +35 -1
  6. package/Server/Middleware/ProjectAuthorization.ts +5 -3
  7. package/Server/Middleware/UserAuthorization.ts +32 -5
  8. package/Server/Services/AccessTokenService.ts +10 -154
  9. package/Server/Services/AnalyticsDatabaseService.ts +2 -2
  10. package/Server/Services/DatabaseService.ts +77 -4
  11. package/Server/Services/StatusPageService.ts +1 -1
  12. package/Server/Types/Permission/PermissionNamespace.ts +6 -0
  13. package/Server/Utils/APIKey/AccessPermission.ts +111 -0
  14. package/Server/Utils/Cookie.ts +15 -1
  15. package/Server/Utils/Monitor/MonitorResource.ts +57 -23
  16. package/Server/Utils/Realtime.ts +288 -79
  17. package/Server/Utils/UserPermission/UserPermission.ts +81 -0
  18. package/Tests/Server/Middleware/ProjectAuthorization.test.ts +3 -3
  19. package/Tests/Server/Middleware/UserAuthorization.test.ts +14 -10
  20. package/Tests/Server/Services/ScheduledMaintenanceService.test.ts +4 -2
  21. package/Tests/Server/Utils/Cookie.test.ts +1 -1
  22. package/Types/Database/TableMetadata.ts +5 -0
  23. package/Types/Realtime/EnableRealtimeEventsOn.ts +5 -0
  24. package/Types/Realtime/EventName.ts +5 -0
  25. package/Types/Realtime/ListenToModelEventJSON.ts +10 -0
  26. package/Types/Realtime/ModelEventType.ts +7 -0
  27. package/UI/Components/HeaderAlert/HeaderModelAlert.tsx +1 -1
  28. package/UI/Components/ModelList/ModelList.tsx +1 -1
  29. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  30. package/UI/Utils/Realtime.ts +29 -19
  31. package/Utils/Realtime.ts +10 -29
  32. package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
  33. package/build/dist/Models/AnalyticsModels/Index.js +14 -0
  34. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  35. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  36. package/build/dist/Models/DatabaseModels/Incident.js +5 -0
  37. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  38. package/build/dist/Models/DatabaseModels/Index.js +16 -1
  39. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  40. package/build/dist/Server/Middleware/ProjectAuthorization.js +3 -3
  41. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  42. package/build/dist/Server/Middleware/UserAuthorization.js +13 -5
  43. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  44. package/build/dist/Server/Services/AccessTokenService.js +6 -108
  45. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  46. package/build/dist/Server/Services/AnalyticsDatabaseService.js +2 -2
  47. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  48. package/build/dist/Server/Services/DatabaseService.js +43 -4
  49. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  50. package/build/dist/Server/Services/StatusPageService.js +1 -1
  51. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  52. package/build/dist/Server/Types/Permission/PermissionNamespace.js +7 -0
  53. package/build/dist/Server/Types/Permission/PermissionNamespace.js.map +1 -0
  54. package/build/dist/Server/Utils/APIKey/AccessPermission.js +78 -0
  55. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -0
  56. package/build/dist/Server/Utils/Cookie.js +11 -1
  57. package/build/dist/Server/Utils/Cookie.js.map +1 -1
  58. package/build/dist/Server/Utils/Monitor/MonitorResource.js +58 -32
  59. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  60. package/build/dist/Server/Utils/Realtime.js +181 -51
  61. package/build/dist/Server/Utils/Realtime.js.map +1 -1
  62. package/build/dist/Server/Utils/UserPermission/UserPermission.js +47 -0
  63. package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -0
  64. package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js +3 -3
  65. package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js.map +1 -1
  66. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +9 -8
  67. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
  68. package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js +2 -2
  69. package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js.map +1 -1
  70. package/build/dist/Tests/Server/Utils/Cookie.test.js +1 -1
  71. package/build/dist/Tests/Server/Utils/Cookie.test.js.map +1 -1
  72. package/build/dist/Types/Database/TableMetadata.js +3 -0
  73. package/build/dist/Types/Database/TableMetadata.js.map +1 -1
  74. package/build/dist/Types/Realtime/EnableRealtimeEventsOn.js +2 -0
  75. package/build/dist/Types/Realtime/EnableRealtimeEventsOn.js.map +1 -0
  76. package/build/dist/Types/Realtime/EventName.js +6 -0
  77. package/build/dist/Types/Realtime/EventName.js.map +1 -0
  78. package/build/dist/Types/Realtime/ListenToModelEventJSON.js +2 -0
  79. package/build/dist/Types/Realtime/ListenToModelEventJSON.js.map +1 -0
  80. package/build/dist/Types/Realtime/ModelEventType.js +8 -0
  81. package/build/dist/Types/Realtime/ModelEventType.js.map +1 -0
  82. package/build/dist/UI/Utils/Realtime.js +16 -11
  83. package/build/dist/UI/Utils/Realtime.js.map +1 -1
  84. package/build/dist/Utils/Realtime.js +6 -12
  85. package/build/dist/Utils/Realtime.js.map +1 -1
  86. package/package.json +2 -2
  87. package/Models/Permissions/Permission.ts +0 -0
  88. package/build/dist/Models/Permissions/Permission.js +0 -2
  89. package/build/dist/Models/Permissions/Permission.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import EnableRealtimeEventsOn from "../../../Types/Realtime/EnableRealtimeEventsOn";
1
2
  import Route from "../../../Types/API/Route";
2
3
  import AnalyticsTableEngine from "../../../Types/AnalyticsDatabase/AnalyticsTableEngine";
3
4
  import AnalyticsTableColumn from "../../../Types/AnalyticsDatabase/TableColumn";
@@ -19,7 +20,6 @@ import Permission, {
19
20
  UserTenantAccessPermission,
20
21
  } from "../../../Types/Permission";
21
22
  import Text from "../../../Types/Text";
22
- import { EnableRealtimeEventsOn } from "../../../Utils/Realtime";
23
23
  import CommonModel from "./CommonModel";
24
24
 
25
25
  export type AnalyticsBaseModelType = { new (): AnalyticsBaseModel };
@@ -6,7 +6,7 @@ import Span from "./Span";
6
6
  import TelemetryAttribute from "./TelemetryAttribute";
7
7
  import ExceptionInstance from "./ExceptionInstance";
8
8
 
9
- const AnalyticsModels: Array<typeof AnalyticsBaseModel> = [
9
+ const AnalyticsModels: Array<{ new (): AnalyticsBaseModel }> = [
10
10
  Log,
11
11
  Span,
12
12
  Metric,
@@ -15,4 +15,31 @@ const AnalyticsModels: Array<typeof AnalyticsBaseModel> = [
15
15
  ExceptionInstance,
16
16
  ];
17
17
 
18
+ const modelTypeMap: { [key: string]: { new (): AnalyticsBaseModel } } = {};
19
+
20
+ type GetModelTypeByName = (
21
+ tableName: string,
22
+ ) => (new () => AnalyticsBaseModel) | null;
23
+
24
+ export const getModelTypeByName: GetModelTypeByName = (
25
+ tableName: string,
26
+ ): (new () => AnalyticsBaseModel) | null => {
27
+ if (modelTypeMap[tableName]) {
28
+ return modelTypeMap[tableName] || null;
29
+ }
30
+
31
+ const modelType: { new (): AnalyticsBaseModel } | undefined =
32
+ AnalyticsModels.find((modelType: { new (): AnalyticsBaseModel }) => {
33
+ return new modelType().tableName === tableName;
34
+ });
35
+
36
+ if (!modelType) {
37
+ return null;
38
+ }
39
+
40
+ modelTypeMap[tableName] = modelType;
41
+
42
+ return modelType;
43
+ };
44
+
18
45
  export default AnalyticsModels;
@@ -1,3 +1,4 @@
1
+ import EnableRealtimeEventsOn from "../../../Types/Realtime/EnableRealtimeEventsOn";
1
2
  import Route from "../../../Types/API/Route";
2
3
  import { ColumnAccessControl } from "../../../Types/BaseDatabase/AccessControl";
3
4
  import ColumnBillingAccessControl from "../../../Types/BaseDatabase/ColumnBillingAccessControl";
@@ -122,6 +123,9 @@ export default class DatabaseBaseModel extends BaseEntity {
122
123
  public singularName!: string | null;
123
124
  public pluralName!: string | null;
124
125
 
126
+ // realtime events.
127
+ public enableRealtimeEventsOn!: EnableRealtimeEventsOn | null;
128
+
125
129
  // total items by
126
130
  public totalItemsByColumnName!: string | null;
127
131
  public totalItemsNumber!: number | null;
@@ -94,6 +94,11 @@ export interface TelemetryIncidentQuery {
94
94
  pluralName: "Incidents",
95
95
  icon: IconProp.Alert,
96
96
  tableDescription: "Manage incidents for your project",
97
+ enableRealtimeEventsOn: {
98
+ create: true,
99
+ update: true,
100
+ delete: true,
101
+ },
97
102
  })
98
103
  export default class Incident extends BaseModel {
99
104
  @ColumnAccessControl({
@@ -141,7 +141,11 @@ import ScheduledMaintenanceTemplate from "./ScheduledMaintenanceTemplate";
141
141
  import ScheduledMaintenanceTemplateOwnerTeam from "./ScheduledMaintenanceTemplateOwnerTeam";
142
142
  import ScheduledMaintenanceTemplateOwnerUser from "./ScheduledMaintenanceTemplateOwnerUser";
143
143
 
144
- export default [
144
+ import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
145
+
146
+ const AllModelTypes: Array<{
147
+ new (): BaseModel;
148
+ }> = [
145
149
  User,
146
150
  Probe,
147
151
  Project,
@@ -302,3 +306,33 @@ export default [
302
306
 
303
307
  TelemetryException,
304
308
  ];
309
+
310
+ const modelTypeMap: { [key: string]: { new (): BaseModel } } = {};
311
+
312
+ type GetModelTypeByNameFunction = (
313
+ tableName: string,
314
+ ) => { new (): BaseModel } | null;
315
+
316
+ export const getModelTypeByName: GetModelTypeByNameFunction = (
317
+ tableName: string,
318
+ ): { new (): BaseModel } | null => {
319
+ if (modelTypeMap[tableName]) {
320
+ return modelTypeMap[tableName] || null;
321
+ }
322
+
323
+ const modelType: { new (): BaseModel } | undefined = AllModelTypes.find(
324
+ (modelType: { new (): BaseModel }) => {
325
+ return new modelType().tableName === tableName;
326
+ },
327
+ );
328
+
329
+ if (!modelType) {
330
+ return null;
331
+ }
332
+
333
+ modelTypeMap[tableName] = modelType;
334
+
335
+ return modelType;
336
+ };
337
+
338
+ export default AllModelTypes;
@@ -1,4 +1,3 @@
1
- import AccessTokenService from "../Services/AccessTokenService";
2
1
  import ApiKeyService from "../Services/ApiKeyService";
3
2
  import GlobalConfigService from "../Services/GlobalConfigService";
4
3
  import UserService from "../Services/UserService";
@@ -18,6 +17,7 @@ import UserType from "Common/Types/UserType";
18
17
  import ApiKey from "Common/Models/DatabaseModels/ApiKey";
19
18
  import GlobalConfig from "Common/Models/DatabaseModels/GlobalConfig";
20
19
  import User from "Common/Models/DatabaseModels/User";
20
+ import APIKeyAccessPermission from "../Utils/APIKey/AccessPermission";
21
21
 
22
22
  export default class ProjectMiddleware {
23
23
  public static getProjectId(req: ExpressRequest): ObjectID | null {
@@ -94,10 +94,12 @@ export default class ProjectMiddleware {
94
94
  // (req as OneUptimeRequest).permissions =
95
95
  // apiKeyModel.permissions || [];
96
96
  (req as OneUptimeRequest).userGlobalAccessPermission =
97
- await AccessTokenService.getDefaultApiGlobalPermission(tenantId);
97
+ await APIKeyAccessPermission.getDefaultApiGlobalPermission(
98
+ tenantId,
99
+ );
98
100
 
99
101
  const userTenantAccessPermission: UserTenantAccessPermission | null =
100
- await AccessTokenService.getApiTenantAccessPermission(
102
+ await APIKeyAccessPermission.getApiTenantAccessPermission(
101
103
  tenantId,
102
104
  apiKeyModel.id!,
103
105
  );
@@ -31,6 +31,7 @@ import {
31
31
  } from "Common/Types/Permission";
32
32
  import UserType from "Common/Types/UserType";
33
33
  import Project from "Common/Models/DatabaseModels/Project";
34
+ import UserPermissionUtil from "../Utils/UserPermission/UserPermission";
34
35
 
35
36
  export default class UserMiddleware {
36
37
  /*
@@ -40,11 +41,35 @@ export default class UserMiddleware {
40
41
  * Returns: 401: User is unauthorized since unauthorized token was present.
41
42
  */
42
43
 
43
- public static getAccessToken(req: ExpressRequest): string | undefined {
44
+ public static getAccessTokenFromCookie(
45
+ req: ExpressRequest,
46
+ ): string | undefined {
47
+ let accessToken: string | undefined = undefined;
48
+
49
+ if (
50
+ CookieUtil.getCookieFromExpressRequest(req, CookieUtil.getUserTokenKey())
51
+ ) {
52
+ accessToken = CookieUtil.getCookieFromExpressRequest(
53
+ req,
54
+ CookieUtil.getUserTokenKey(),
55
+ );
56
+ }
57
+
58
+ return accessToken;
59
+ }
60
+
61
+ public static getAccessTokenFromExpressRequest(
62
+ req: ExpressRequest,
63
+ ): string | undefined {
44
64
  let accessToken: string | undefined = undefined;
45
65
 
46
- if (CookieUtil.getCookie(req, CookieUtil.getUserTokenKey())) {
47
- accessToken = CookieUtil.getCookie(req, CookieUtil.getUserTokenKey());
66
+ if (
67
+ CookieUtil.getCookieFromExpressRequest(req, CookieUtil.getUserTokenKey())
68
+ ) {
69
+ accessToken = CookieUtil.getCookieFromExpressRequest(
70
+ req,
71
+ CookieUtil.getUserTokenKey(),
72
+ );
48
73
  }
49
74
 
50
75
  return accessToken;
@@ -130,7 +155,8 @@ export default class UserMiddleware {
130
155
  );
131
156
  }
132
157
 
133
- const accessToken: string | undefined = UserMiddleware.getAccessToken(req);
158
+ const accessToken: string | undefined =
159
+ UserMiddleware.getAccessTokenFromExpressRequest(req);
134
160
 
135
161
  if (!accessToken) {
136
162
  oneuptimeRequest.userType = UserType.Public;
@@ -202,6 +228,7 @@ export default class UserMiddleware {
202
228
  new ObjectID(userId),
203
229
  userGlobalAccessPermission.projectIds,
204
230
  );
231
+
205
232
  if (userTenantAccessPermission) {
206
233
  oneuptimeRequest.userTenantAccessPermission =
207
234
  userTenantAccessPermission;
@@ -340,7 +367,7 @@ export default class UserMiddleware {
340
367
  ) {
341
368
  // Add default permissions.
342
369
  userTenantAccessPermission =
343
- AccessTokenService.getDefaultUserTenantAccessPermission(projectId);
370
+ UserPermissionUtil.getDefaultUserTenantAccessPermission(projectId);
344
371
  } else {
345
372
  // get project level permissions if projectid exists in request.
346
373
  userTenantAccessPermission =
@@ -1,26 +1,20 @@
1
1
  import GlobalCache from "../Infrastructure/GlobalCache";
2
2
  import QueryHelper from "../Types/Database/QueryHelper";
3
- import ApiKeyPermissionService from "./ApiKeyPermissionService";
4
3
  import BaseService from "./BaseService";
5
4
  import TeamMemberService from "./TeamMemberService";
6
5
  import TeamPermissionService from "./TeamPermissionService";
7
6
  import LIMIT_MAX from "../../Types/Database/LimitMax";
8
- import { JSONObject } from "../../Types/JSON";
9
7
  import ObjectID from "../../Types/ObjectID";
10
8
  import Permission, {
11
9
  UserGlobalAccessPermission,
12
10
  UserPermission,
13
11
  UserTenantAccessPermission,
14
12
  } from "../../Types/Permission";
15
- import APIKeyPermission from "Common/Models/DatabaseModels/ApiKeyPermission";
16
13
  import Label from "Common/Models/DatabaseModels/Label";
17
14
  import TeamMember from "Common/Models/DatabaseModels/TeamMember";
18
15
  import TeamPermission from "Common/Models/DatabaseModels/TeamPermission";
19
-
20
- enum PermissionNamespace {
21
- GlobalPermission = "global-permissions",
22
- ProjectPermission = "project-permissions",
23
- }
16
+ import UserPermissionUtil from "../Utils/UserPermission/UserPermission";
17
+ import PermissionNamespace from "../Types/Permission/PermissionNamespace";
24
18
 
25
19
  export class AccessTokenService extends BaseService {
26
20
  public constructor() {
@@ -65,104 +59,6 @@ export class AccessTokenService extends BaseService {
65
59
  }
66
60
  }
67
61
 
68
- public async getDefaultApiGlobalPermission(
69
- projectId: ObjectID,
70
- ): Promise<UserGlobalAccessPermission> {
71
- return {
72
- projectIds: [projectId],
73
- globalPermissions: [
74
- Permission.Public,
75
- Permission.User,
76
- Permission.CurrentUser,
77
- ],
78
- _type: "UserGlobalAccessPermission",
79
- };
80
- }
81
-
82
- public async getMasterKeyApiGlobalPermission(
83
- projectId: ObjectID,
84
- ): Promise<UserGlobalAccessPermission> {
85
- return {
86
- projectIds: [projectId],
87
- globalPermissions: [
88
- Permission.Public,
89
- Permission.User,
90
- Permission.CurrentUser,
91
- Permission.ProjectOwner,
92
- ],
93
- _type: "UserGlobalAccessPermission",
94
- };
95
- }
96
-
97
- public async getMasterApiTenantAccessPermission(
98
- projectId: ObjectID,
99
- ): Promise<UserTenantAccessPermission> {
100
- const userPermissions: Array<UserPermission> = [];
101
-
102
- userPermissions.push({
103
- permission: Permission.ProjectOwner,
104
- labelIds: [],
105
- _type: "UserPermission",
106
- });
107
-
108
- const permission: UserTenantAccessPermission =
109
- this.getDefaultUserTenantAccessPermission(projectId);
110
-
111
- permission.permissions = permission.permissions.concat(userPermissions);
112
-
113
- return permission;
114
- }
115
-
116
- public async getApiTenantAccessPermission(
117
- projectId: ObjectID,
118
- apiKeyId: ObjectID,
119
- ): Promise<UserTenantAccessPermission> {
120
- // get team permissions.
121
- const apiKeyPermission: Array<APIKeyPermission> =
122
- await ApiKeyPermissionService.findBy({
123
- query: {
124
- apiKeyId: apiKeyId,
125
- },
126
- select: {
127
- permission: true,
128
- labels: {
129
- _id: true,
130
- },
131
- isBlockPermission: true,
132
- },
133
-
134
- limit: LIMIT_MAX,
135
- skip: 0,
136
- props: {
137
- isRoot: true,
138
- },
139
- });
140
-
141
- const userPermissions: Array<UserPermission> = [];
142
-
143
- for (const apiPermission of apiKeyPermission) {
144
- if (!apiPermission.labels) {
145
- apiPermission.labels = [];
146
- }
147
-
148
- userPermissions.push({
149
- permission: apiPermission.permission!,
150
- labelIds: apiPermission.labels.map((label: Label) => {
151
- return label.id!;
152
- }),
153
- isBlockPermission: apiPermission.isBlockPermission,
154
- _type: "UserPermission",
155
- });
156
- }
157
-
158
- const permission: UserTenantAccessPermission =
159
- this.getDefaultUserTenantAccessPermission(projectId);
160
-
161
- permission.permissions = permission.permissions.concat(userPermissions);
162
-
163
- return permission;
164
- }
165
-
166
62
  public async refreshUserGlobalAccessPermission(
167
63
  userId: ObjectID,
168
64
  ): Promise<UserGlobalAccessPermission> {
@@ -207,53 +103,17 @@ export class AccessTokenService extends BaseService {
207
103
  return permissionToStore;
208
104
  }
209
105
 
210
- public getDefaultUserTenantAccessPermission(
211
- projectId: ObjectID,
212
- ): UserTenantAccessPermission {
213
- const userPermissions: Array<UserPermission> = [];
214
-
215
- userPermissions.push({
216
- permission: Permission.CurrentUser,
217
- labelIds: [],
218
- isBlockPermission: false,
219
- _type: "UserPermission",
220
- });
221
-
222
- userPermissions.push({
223
- permission: Permission.UnAuthorizedSsoUser,
224
- labelIds: [],
225
- isBlockPermission: false,
226
- _type: "UserPermission",
227
- });
228
-
229
- const permission: UserTenantAccessPermission = {
230
- projectId,
231
- permissions: userPermissions,
232
- isBlockPermission: false,
233
- _type: "UserTenantAccessPermission",
234
- };
235
-
236
- return permission;
237
- }
238
-
239
106
  public async getUserGlobalAccessPermission(
240
107
  userId: ObjectID,
241
108
  ): Promise<UserGlobalAccessPermission | null> {
242
- const json: JSONObject | null = await GlobalCache.getJSONObject(
243
- "user",
244
- userId.toString(),
245
- );
109
+ const json: UserGlobalAccessPermission | null =
110
+ await UserPermissionUtil.getUserGlobalAccessPermissionFromCache(userId);
246
111
 
247
112
  if (!json) {
248
113
  return await this.refreshUserGlobalAccessPermission(userId);
249
114
  }
250
115
 
251
- const accessPermission: UserGlobalAccessPermission =
252
- json as UserGlobalAccessPermission;
253
-
254
- accessPermission._type = "UserGlobalAccessPermission";
255
-
256
- return accessPermission;
116
+ return json;
257
117
  }
258
118
 
259
119
  public async refreshUserTenantAccessPermission(
@@ -325,7 +185,7 @@ export class AccessTokenService extends BaseService {
325
185
  }
326
186
 
327
187
  const permission: UserTenantAccessPermission =
328
- this.getDefaultUserTenantAccessPermission(projectId);
188
+ UserPermissionUtil.getDefaultUserTenantAccessPermission(projectId);
329
189
 
330
190
  permission.permissions = permission.permissions.concat(userPermissions);
331
191
 
@@ -343,14 +203,10 @@ export class AccessTokenService extends BaseService {
343
203
  projectId: ObjectID,
344
204
  ): Promise<UserTenantAccessPermission | null> {
345
205
  const json: UserTenantAccessPermission | null =
346
- (await GlobalCache.getJSONObject(
347
- PermissionNamespace.ProjectPermission,
348
- userId.toString() + projectId.toString(),
349
- )) as UserTenantAccessPermission;
350
-
351
- if (json) {
352
- json._type = "UserTenantAccessPermission";
353
- }
206
+ await UserPermissionUtil.getUserTenantAccessPermissionFromCache(
207
+ userId,
208
+ projectId,
209
+ );
354
210
 
355
211
  if (!json) {
356
212
  return await this.refreshUserTenantAccessPermission(userId, projectId);
@@ -47,12 +47,12 @@ import PositiveNumber from "../../Types/PositiveNumber";
47
47
  import Text from "../../Types/Text";
48
48
  import Typeof from "../../Types/Typeof";
49
49
  import API from "Common/Utils/API";
50
- import { ModelEventType } from "Common/Utils/Realtime";
51
50
  import { Stream } from "node:stream";
52
51
  import AggregateBy from "../Types/AnalyticsDatabase/AggregateBy";
53
52
  import AggregatedResult from "../../Types/BaseDatabase/AggregatedResult";
54
53
  import Sort from "../Types/AnalyticsDatabase/Sort";
55
54
  import AggregatedModel from "../../Types/BaseDatabase/AggregatedModel";
55
+ import ModelEventType from "../../Types/Realtime/ModelEventType";
56
56
 
57
57
  export default class AnalyticsDatabaseService<
58
58
  TBaseModel extends AnalyticsBaseModel,
@@ -967,7 +967,7 @@ export default class AnalyticsDatabaseService<
967
967
 
968
968
  promises.push(
969
969
  Realtime.emitModelEvent({
970
- model: item,
970
+ modelId: item.id!,
971
971
  tenantId: tenantId,
972
972
  eventType: ModelEventType.Create,
973
973
  modelType: this.modelType,
@@ -60,6 +60,8 @@ import API from "Common/Utils/API";
60
60
  import Slug from "Common/Utils/Slug";
61
61
  import { DataSource, Repository, SelectQueryBuilder } from "typeorm";
62
62
  import { FindWhere } from "../../Types/BaseDatabase/Query";
63
+ import Realtime from "../Utils/Realtime";
64
+ import ModelEventType from "../../Types/Realtime/ModelEventType";
63
65
 
64
66
  class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
65
67
  public modelType!: { new (): TBaseModel };
@@ -516,7 +518,58 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
516
518
  return data;
517
519
  }
518
520
 
519
- public async onTrigger(
521
+ public async onTriggerRealtime(
522
+ modelId: ObjectID,
523
+ projectId: ObjectID,
524
+ modelEventType: ModelEventType,
525
+ ): Promise<void> {
526
+ logger.debug("Realtime Events Enabled");
527
+ logger.debug(this.model.enableRealtimeEventsOn);
528
+
529
+ if (Realtime.isInitialized() && this.model.enableRealtimeEventsOn) {
530
+ logger.debug("Emitting realtime event");
531
+ let shouldEmitEvent: boolean = false;
532
+
533
+ if (
534
+ this.model.enableRealtimeEventsOn.create &&
535
+ modelEventType === ModelEventType.Create
536
+ ) {
537
+ shouldEmitEvent = true;
538
+ }
539
+
540
+ if (
541
+ this.model.enableRealtimeEventsOn.update &&
542
+ modelEventType === ModelEventType.Update
543
+ ) {
544
+ shouldEmitEvent = true;
545
+ }
546
+
547
+ if (
548
+ this.model.enableRealtimeEventsOn.delete &&
549
+ modelEventType === ModelEventType.Delete
550
+ ) {
551
+ shouldEmitEvent = true;
552
+ }
553
+
554
+ if (!shouldEmitEvent) {
555
+ logger.debug("Realtime event not enabled for this event type");
556
+ return;
557
+ }
558
+
559
+ logger.debug("Emitting realtime event");
560
+ Realtime.emitModelEvent({
561
+ tenantId: projectId,
562
+ eventType: modelEventType,
563
+ modelId: modelId,
564
+ modelType: this.modelType,
565
+ }).catch((err: Error) => {
566
+ logger.error("Cannot emit realtime event");
567
+ logger.error(err);
568
+ });
569
+ }
570
+ }
571
+
572
+ public async onTriggerWorkflow(
520
573
  id: ObjectID,
521
574
  projectId: ObjectID,
522
575
  triggerType: DatabaseTriggerType,
@@ -629,7 +682,16 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
629
682
  }
630
683
 
631
684
  if (tenantId) {
632
- await this.onTrigger(createBy.data.id!, tenantId, "on-create");
685
+ await this.onTriggerWorkflow(
686
+ createBy.data.id!,
687
+ tenantId,
688
+ "on-create",
689
+ );
690
+ await this.onTriggerRealtime(
691
+ createBy.data.id!,
692
+ tenantId,
693
+ ModelEventType.Create,
694
+ );
633
695
  }
634
696
  }
635
697
 
@@ -1031,7 +1093,12 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
1031
1093
  }
1032
1094
 
1033
1095
  if (tenantId) {
1034
- await this.onTrigger(item.id!, tenantId, "on-delete");
1096
+ await this.onTriggerWorkflow(item.id!, tenantId, "on-delete");
1097
+ await this.onTriggerRealtime(
1098
+ item.id!,
1099
+ tenantId,
1100
+ ModelEventType.Delete,
1101
+ );
1035
1102
  }
1036
1103
  }
1037
1104
  }
@@ -1337,9 +1404,15 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
1337
1404
  }
1338
1405
 
1339
1406
  if (tenantId) {
1340
- await this.onTrigger(item.id!, tenantId, "on-update", {
1407
+ await this.onTriggerWorkflow(item.id!, tenantId, "on-update", {
1341
1408
  updatedFields: JSONFunctions.serialize(data as JSONObject),
1342
1409
  });
1410
+
1411
+ await this.onTriggerRealtime(
1412
+ item.id!,
1413
+ tenantId,
1414
+ ModelEventType.Update,
1415
+ );
1343
1416
  }
1344
1417
  }
1345
1418
  }
@@ -313,7 +313,7 @@ export class Service extends DatabaseService<StatusPage> {
313
313
  ): Promise<boolean> {
314
314
  try {
315
315
  // token decode.
316
- const token: string | undefined = CookieUtil.getCookie(
316
+ const token: string | undefined = CookieUtil.getCookieFromExpressRequest(
317
317
  req,
318
318
  CookieUtil.getUserTokenKey(statusPageId),
319
319
  );
@@ -0,0 +1,6 @@
1
+ enum PermissionNamespace {
2
+ GlobalPermission = "global-permissions",
3
+ ProjectPermission = "project-permissions",
4
+ }
5
+
6
+ export default PermissionNamespace;