@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.
- package/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.ts +1 -1
- package/Models/AnalyticsModels/Index.ts +28 -1
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +4 -0
- package/Models/DatabaseModels/Incident.ts +5 -0
- package/Models/DatabaseModels/Index.ts +35 -1
- package/Server/Middleware/ProjectAuthorization.ts +5 -3
- package/Server/Middleware/UserAuthorization.ts +32 -5
- package/Server/Services/AccessTokenService.ts +10 -154
- package/Server/Services/AnalyticsDatabaseService.ts +2 -2
- package/Server/Services/DatabaseService.ts +77 -4
- package/Server/Services/StatusPageService.ts +1 -1
- package/Server/Types/Permission/PermissionNamespace.ts +6 -0
- package/Server/Utils/APIKey/AccessPermission.ts +111 -0
- package/Server/Utils/Cookie.ts +15 -1
- package/Server/Utils/Monitor/MonitorResource.ts +57 -23
- package/Server/Utils/Realtime.ts +288 -79
- package/Server/Utils/UserPermission/UserPermission.ts +81 -0
- package/Tests/Server/Middleware/ProjectAuthorization.test.ts +3 -3
- package/Tests/Server/Middleware/UserAuthorization.test.ts +14 -10
- package/Tests/Server/Services/ScheduledMaintenanceService.test.ts +4 -2
- package/Tests/Server/Utils/Cookie.test.ts +1 -1
- package/Types/Database/TableMetadata.ts +5 -0
- package/Types/Realtime/EnableRealtimeEventsOn.ts +5 -0
- package/Types/Realtime/EventName.ts +5 -0
- package/Types/Realtime/ListenToModelEventJSON.ts +10 -0
- package/Types/Realtime/ModelEventType.ts +7 -0
- package/UI/Components/HeaderAlert/HeaderModelAlert.tsx +1 -1
- package/UI/Components/ModelList/ModelList.tsx +1 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Utils/Realtime.ts +29 -19
- package/Utils/Realtime.ts +10 -29
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Index.js +14 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +5 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -1
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +3 -3
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +13 -5
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +6 -108
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +2 -2
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +43 -4
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +1 -1
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Types/Permission/PermissionNamespace.js +7 -0
- package/build/dist/Server/Types/Permission/PermissionNamespace.js.map +1 -0
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +78 -0
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -0
- package/build/dist/Server/Utils/Cookie.js +11 -1
- package/build/dist/Server/Utils/Cookie.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +58 -32
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Realtime.js +181 -51
- package/build/dist/Server/Utils/Realtime.js.map +1 -1
- package/build/dist/Server/Utils/UserPermission/UserPermission.js +47 -0
- package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -0
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js +3 -3
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js.map +1 -1
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +9 -8
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
- package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js +2 -2
- package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js.map +1 -1
- package/build/dist/Tests/Server/Utils/Cookie.test.js +1 -1
- package/build/dist/Tests/Server/Utils/Cookie.test.js.map +1 -1
- package/build/dist/Types/Database/TableMetadata.js +3 -0
- package/build/dist/Types/Database/TableMetadata.js.map +1 -1
- package/build/dist/Types/Realtime/EnableRealtimeEventsOn.js +2 -0
- package/build/dist/Types/Realtime/EnableRealtimeEventsOn.js.map +1 -0
- package/build/dist/Types/Realtime/EventName.js +6 -0
- package/build/dist/Types/Realtime/EventName.js.map +1 -0
- package/build/dist/Types/Realtime/ListenToModelEventJSON.js +2 -0
- package/build/dist/Types/Realtime/ListenToModelEventJSON.js.map +1 -0
- package/build/dist/Types/Realtime/ModelEventType.js +8 -0
- package/build/dist/Types/Realtime/ModelEventType.js.map +1 -0
- package/build/dist/UI/Utils/Realtime.js +16 -11
- package/build/dist/UI/Utils/Realtime.js.map +1 -1
- package/build/dist/Utils/Realtime.js +6 -12
- package/build/dist/Utils/Realtime.js.map +1 -1
- package/package.json +2 -2
- package/Models/Permissions/Permission.ts +0 -0
- package/build/dist/Models/Permissions/Permission.js +0 -2
- 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<
|
|
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
|
-
|
|
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
|
|
97
|
+
await APIKeyAccessPermission.getDefaultApiGlobalPermission(
|
|
98
|
+
tenantId,
|
|
99
|
+
);
|
|
98
100
|
|
|
99
101
|
const userTenantAccessPermission: UserTenantAccessPermission | null =
|
|
100
|
-
await
|
|
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
|
|
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 (
|
|
47
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
243
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
)
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
316
|
+
const token: string | undefined = CookieUtil.getCookieFromExpressRequest(
|
|
317
317
|
req,
|
|
318
318
|
CookieUtil.getUserTokenKey(statusPageId),
|
|
319
319
|
);
|