@oneuptime/common 7.0.5029 → 7.0.5041

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.
@@ -1,336 +0,0 @@
1
- import Project from "./Project";
2
- import Team from "./Team";
3
- import User from "./User";
4
- import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
5
- import Route from "../../Types/API/Route";
6
- import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
7
- import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
8
- import AllowUserQueryWithoutTenant from "../../Types/Database/AllowUserQueryWithoutTenant";
9
- import ColumnType from "../../Types/Database/ColumnType";
10
- import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
11
- import CurrentUserCanAccessRecordBy from "../../Types/Database/CurrentUserCanAccessRecordBy";
12
- import MultiTenentQueryAllowed from "../../Types/Database/MultiTenentQueryAllowed";
13
- import TableColumn from "../../Types/Database/TableColumn";
14
- import TableColumnType from "../../Types/Database/TableColumnType";
15
- import TableMetadata from "../../Types/Database/TableMetadata";
16
- import TenantColumn from "../../Types/Database/TenantColumn";
17
- import IconProp from "../../Types/Icon/IconProp";
18
- import ObjectID from "../../Types/ObjectID";
19
- import Permission from "../../Types/Permission";
20
- import {
21
- Column,
22
- Entity,
23
- Index,
24
- JoinColumn,
25
- JoinTable,
26
- ManyToMany,
27
- ManyToOne,
28
- } from "typeorm";
29
-
30
- @TableAccessControl({
31
- create: [],
32
- read: [
33
- Permission.ProjectOwner,
34
- Permission.ProjectAdmin,
35
- Permission.ProjectMember,
36
- Permission.ReadProjectTeam,
37
- Permission.CurrentUser,
38
- ],
39
- delete: [],
40
- update: [],
41
- })
42
- @MultiTenentQueryAllowed(true)
43
- @AllowUserQueryWithoutTenant(true)
44
- @CurrentUserCanAccessRecordBy("userId")
45
- @TenantColumn("projectId")
46
- @CrudApiEndpoint(new Route("/project-user"))
47
- @Entity({
48
- name: "ProjectUser",
49
- })
50
- @TableMetadata({
51
- tableName: "ProjectUser",
52
- singularName: "Project User",
53
- pluralName: "Project Users",
54
- icon: IconProp.User,
55
- tableDescription:
56
- "This model connects users and teams. This is an internal table. Its a view on TeamMembers table.",
57
- })
58
- export default class ProjectUser extends BaseModel {
59
- @ColumnAccessControl({
60
- create: [],
61
- read: [
62
- Permission.ProjectOwner,
63
- Permission.ProjectAdmin,
64
- Permission.ProjectMember,
65
- Permission.ReadProjectTeam,
66
- Permission.CurrentUser,
67
- ],
68
- update: [],
69
- })
70
- @TableColumn({
71
- required: false,
72
- type: TableColumnType.EntityArray,
73
- modelType: Team,
74
- title: "Teams",
75
- description: "Teams to which this user belongs.",
76
- })
77
- @ManyToMany(
78
- () => {
79
- return Team;
80
- },
81
- { eager: false },
82
- )
83
- @JoinTable({
84
- name: "ProjectUserAcceptedTeams",
85
- inverseJoinColumn: {
86
- name: "teamId",
87
- referencedColumnName: "_id",
88
- },
89
- joinColumn: {
90
- name: "projectUserId",
91
- referencedColumnName: "_id",
92
- },
93
- })
94
- public acceptedTeams?: Array<Team> = undefined; // user is accepted to these teams. This is a view on TeamMembers table.
95
-
96
- @ColumnAccessControl({
97
- create: [],
98
- read: [
99
- Permission.ProjectOwner,
100
- Permission.ProjectAdmin,
101
- Permission.ProjectMember,
102
- Permission.ReadProjectTeam,
103
- Permission.CurrentUser,
104
- ],
105
- update: [],
106
- })
107
- @TableColumn({
108
- required: false,
109
- type: TableColumnType.EntityArray,
110
- modelType: Team,
111
- title: "Teams",
112
- description: "Teams to which this user belongs.",
113
- })
114
- @ManyToMany(
115
- () => {
116
- return Team;
117
- },
118
- { eager: false },
119
- )
120
- @JoinTable({
121
- name: "ProjectUserInvitedTeams",
122
- inverseJoinColumn: {
123
- name: "teamId",
124
- referencedColumnName: "_id",
125
- },
126
- joinColumn: {
127
- name: "projectUserId",
128
- referencedColumnName: "_id",
129
- },
130
- })
131
- public invitedTeams?: Array<Team> = undefined; // user is invited to these teams.
132
-
133
- @ColumnAccessControl({
134
- create: [],
135
- read: [
136
- Permission.ProjectOwner,
137
- Permission.ProjectAdmin,
138
- Permission.ProjectMember,
139
- Permission.ReadProjectTeam,
140
- Permission.CurrentUser,
141
- ],
142
- update: [],
143
- })
144
- @TableColumn({
145
- manyToOneRelationColumn: "projectId",
146
- type: TableColumnType.Entity,
147
- modelType: Project,
148
- title: "Project",
149
- description: "Relation to Project Resource in which this object belongs",
150
- })
151
- @ManyToOne(
152
- () => {
153
- return Project;
154
- },
155
- {
156
- eager: false,
157
- nullable: true,
158
- onDelete: "CASCADE",
159
- orphanedRowAction: "nullify",
160
- },
161
- )
162
- @JoinColumn({ name: "projectId" })
163
- public project?: Project = undefined;
164
-
165
- @ColumnAccessControl({
166
- create: [],
167
- read: [
168
- Permission.ProjectOwner,
169
- Permission.ProjectAdmin,
170
- Permission.ProjectMember,
171
- Permission.ReadProjectTeam,
172
- Permission.CurrentUser,
173
- ],
174
- update: [],
175
- })
176
- @Index()
177
- @TableColumn({
178
- type: TableColumnType.ObjectID,
179
- required: true,
180
- canReadOnRelationQuery: true,
181
- title: "Project ID",
182
- description: "ID of your OneUptime Project in which this object belongs",
183
- })
184
- @Column({
185
- type: ColumnType.ObjectID,
186
- nullable: false,
187
- transformer: ObjectID.getDatabaseTransformer(),
188
- })
189
- public projectId?: ObjectID = undefined;
190
-
191
- @ColumnAccessControl({
192
- create: [],
193
- read: [
194
- Permission.ProjectOwner,
195
- Permission.ProjectAdmin,
196
- Permission.ReadProjectTeam,
197
- Permission.ProjectMember,
198
- ],
199
- update: [],
200
- })
201
- @TableColumn({
202
- manyToOneRelationColumn: "userId",
203
- type: TableColumnType.Entity,
204
- modelType: User,
205
- title: "User",
206
- description: "User who belongs to this team.",
207
- })
208
- @ManyToOne(
209
- () => {
210
- return User;
211
- },
212
- {
213
- eager: false,
214
- nullable: false,
215
- onDelete: "CASCADE",
216
- orphanedRowAction: "nullify",
217
- },
218
- )
219
- @JoinColumn({ name: "userId" })
220
- public user?: User = undefined;
221
-
222
- @ColumnAccessControl({
223
- create: [],
224
- read: [
225
- Permission.ProjectOwner,
226
- Permission.ProjectAdmin,
227
- Permission.ProjectMember,
228
- Permission.ReadProjectTeam,
229
- Permission.CurrentUser,
230
- ],
231
- update: [],
232
- })
233
- @TableColumn({
234
- type: TableColumnType.ObjectID,
235
- required: true,
236
- title: "User ID",
237
- description: "ID of User who belongs to this team",
238
- })
239
- @Column({
240
- type: ColumnType.ObjectID,
241
- nullable: false,
242
- transformer: ObjectID.getDatabaseTransformer(),
243
- })
244
- public userId?: ObjectID = undefined;
245
-
246
- @ColumnAccessControl({
247
- create: [],
248
- read: [],
249
- update: [],
250
- })
251
- @TableColumn({
252
- manyToOneRelationColumn: "createdByUserId",
253
- type: TableColumnType.Entity,
254
- modelType: User,
255
- title: "Created by User",
256
- description:
257
- "Relation to User who created this object (if this object was created by a User)",
258
- })
259
- @ManyToOne(
260
- () => {
261
- return User;
262
- },
263
- {
264
- eager: false,
265
- nullable: true,
266
- onDelete: "SET NULL",
267
- orphanedRowAction: "nullify",
268
- },
269
- )
270
- @JoinColumn({ name: "createdByUserId" })
271
- public createdByUser?: User = undefined;
272
-
273
- @ColumnAccessControl({
274
- create: [],
275
- read: [],
276
- update: [],
277
- })
278
- @TableColumn({
279
- type: TableColumnType.ObjectID,
280
- title: "Created by User ID",
281
- description:
282
- "User ID who created this object (if this object was created by a User)",
283
- })
284
- @Column({
285
- type: ColumnType.ObjectID,
286
- nullable: true,
287
- transformer: ObjectID.getDatabaseTransformer(),
288
- })
289
- public createdByUserId?: ObjectID = undefined;
290
-
291
- @ColumnAccessControl({
292
- create: [],
293
- read: [],
294
- update: [],
295
- })
296
- @TableColumn({
297
- manyToOneRelationColumn: "deletedByUserId",
298
- type: TableColumnType.Entity,
299
- title: "Deleted by User",
300
- modelType: User,
301
- description:
302
- "Relation to User who deleted this object (if this object was deleted by a User)",
303
- })
304
- @ManyToOne(
305
- () => {
306
- return User;
307
- },
308
- {
309
- cascade: false,
310
- eager: false,
311
- nullable: true,
312
- onDelete: "SET NULL",
313
- orphanedRowAction: "nullify",
314
- },
315
- )
316
- @JoinColumn({ name: "deletedByUserId" })
317
- public deletedByUser?: User = undefined;
318
-
319
- @ColumnAccessControl({
320
- create: [],
321
- read: [],
322
- update: [],
323
- })
324
- @TableColumn({
325
- type: TableColumnType.ObjectID,
326
- title: "Deleted by User ID",
327
- description:
328
- "User ID who deleted this object (if this object was deleted by a User)",
329
- })
330
- @Column({
331
- type: ColumnType.ObjectID,
332
- nullable: true,
333
- transformer: ObjectID.getDatabaseTransformer(),
334
- })
335
- public deletedByUserId?: ObjectID = undefined;
336
- }
@@ -1,132 +0,0 @@
1
- import TeamMember from "../../Models/DatabaseModels/TeamMember";
2
- import LIMIT_MAX from "../../Types/Database/LimitMax";
3
- import ObjectID from "../../Types/ObjectID";
4
- import DatabaseService from "./DatabaseService";
5
- import Model from "../../Models/DatabaseModels/ProjectUser";
6
- import TeamMemberService from "./TeamMemberService";
7
- import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
8
-
9
- export class Service extends DatabaseService<Model> {
10
- public constructor() {
11
- super(Model);
12
- }
13
-
14
- @CaptureSpan()
15
- public async refreshProjectUsersByProject(data: {
16
- projectId: ObjectID;
17
- }): Promise<void> {
18
- // get all team members by user
19
-
20
- // first delete all project users by project id.
21
- await this.deleteBy({
22
- query: {
23
- projectId: data.projectId,
24
- },
25
- limit: LIMIT_MAX,
26
- skip: 0,
27
- props: {
28
- isRoot: true,
29
- },
30
- });
31
-
32
- // get all team members by project.
33
- const teamMembers: Array<TeamMember> = await TeamMemberService.findBy({
34
- query: {
35
- projectId: data.projectId,
36
- },
37
- limit: LIMIT_MAX,
38
- skip: 0,
39
- props: {
40
- isRoot: true,
41
- },
42
- select: {
43
- userId: true,
44
- teamId: true,
45
- team: {
46
- _id: true,
47
- },
48
- hasAcceptedInvitation: true,
49
- },
50
- });
51
-
52
- // create project users by team members.
53
-
54
- const projectUsersToCreate: Array<Model> = [];
55
-
56
- for (const teamMember of teamMembers) {
57
- // check if the user already exists in the project users.
58
-
59
- // if yes then add the team to the project user acceptedTeams, if the invitation is accepted.
60
-
61
- // if no then create a new project user.
62
-
63
- // if the user is not accepted the invitation then add the team to invitedTeams of the project user.
64
-
65
- // if the user is accepted the invitation then add the team to acceptedTeams of the project user.
66
-
67
- let doesProjectUserExist: boolean = false;
68
-
69
- for (const item of projectUsersToCreate) {
70
- if (item.userId?.toString() === teamMember.userId?.toString()) {
71
- doesProjectUserExist = true;
72
- break;
73
- }
74
- }
75
-
76
- if (doesProjectUserExist) {
77
- // add the team to the project user acceptedTeams, if the invitation is accepted.
78
- if (teamMember.hasAcceptedInvitation) {
79
- for (const projectUser of projectUsersToCreate) {
80
- if (
81
- projectUser.userId?.toString() === teamMember.userId?.toString()
82
- ) {
83
- if (!projectUser.acceptedTeams) {
84
- projectUser.acceptedTeams = [];
85
- }
86
-
87
- projectUser.acceptedTeams?.push(teamMember.team!);
88
- }
89
- }
90
- } else {
91
- for (const projectUser of projectUsersToCreate) {
92
- if (
93
- projectUser.userId?.toString() === teamMember.userId?.toString()
94
- ) {
95
- if (!projectUser.invitedTeams) {
96
- projectUser.invitedTeams = [];
97
- }
98
-
99
- projectUser.invitedTeams?.push(teamMember.team!);
100
- }
101
- }
102
- }
103
- } else {
104
- // create a new project user.
105
- const projectUser: Model = new Model();
106
- projectUser.userId = teamMember.userId!;
107
- projectUser.projectId = data.projectId;
108
-
109
- if (teamMember.hasAcceptedInvitation) {
110
- projectUser.acceptedTeams = [teamMember.team!];
111
- } else {
112
- projectUser.invitedTeams = [teamMember.team!];
113
- }
114
-
115
- projectUsersToCreate.push(projectUser);
116
- }
117
- }
118
-
119
- // now create the project users.
120
-
121
- for (const projectUser of projectUsersToCreate) {
122
- await this.create({
123
- data: projectUser,
124
- props: {
125
- isRoot: true,
126
- },
127
- });
128
- }
129
- }
130
- }
131
-
132
- export default new Service();