@oneuptime/common 9.2.16 → 9.2.18

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 (133) hide show
  1. package/Models/DatabaseModels/CodeRepository.ts +664 -0
  2. package/Models/DatabaseModels/Index.ts +8 -0
  3. package/Models/DatabaseModels/LlmLog.ts +818 -0
  4. package/Models/DatabaseModels/LlmProvider.ts +21 -0
  5. package/Models/DatabaseModels/Project.ts +206 -0
  6. package/Models/DatabaseModels/ServiceCatalogCodeRepository.ts +549 -0
  7. package/Server/API/AIBillingAPI.ts +126 -0
  8. package/Server/API/AlertAPI.ts +139 -0
  9. package/Server/API/GitHubAPI.ts +360 -0
  10. package/Server/API/IncidentAPI.ts +258 -0
  11. package/Server/API/ScheduledMaintenanceAPI.ts +164 -0
  12. package/Server/EnvironmentConfig.ts +44 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.ts +79 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.ts +75 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.ts +32 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.ts +69 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.ts +111 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  20. package/Server/Services/AIBillingService.ts +247 -0
  21. package/Server/Services/AIService.ts +238 -0
  22. package/Server/Services/CodeRepositoryService.ts +10 -0
  23. package/Server/Services/IncidentService.ts +88 -0
  24. package/Server/Services/Index.ts +2 -0
  25. package/Server/Services/LlmLogService.ts +14 -0
  26. package/Server/Services/LlmProviderService.ts +58 -0
  27. package/Server/Services/ServiceCatalogCodeRepositoryService.ts +55 -0
  28. package/Server/Utils/AI/AlertAIContextBuilder.ts +264 -0
  29. package/Server/Utils/AI/IncidentAIContextBuilder.ts +710 -0
  30. package/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.ts +345 -0
  31. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +226 -0
  32. package/Server/Utils/LLM/LLMService.ts +276 -0
  33. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +166 -0
  34. package/Server/Utils/Workspace/Slack/Slack.ts +134 -0
  35. package/Server/Utils/Workspace/Workspace.ts +126 -0
  36. package/Tests/Types/Domain.test.ts +24 -3
  37. package/Types/CodeRepository/CodeRepositoryType.ts +1 -1
  38. package/Types/Domain.ts +21 -24
  39. package/Types/LlmLogStatus.ts +7 -0
  40. package/Types/Permission.ts +87 -0
  41. package/Types/ServiceCatalog/CodeRepositoryImprovementAction.ts +9 -0
  42. package/UI/Components/AI/AILoader.tsx +95 -0
  43. package/UI/Components/AI/GenerateFromAIModal.tsx +432 -0
  44. package/UI/Components/Modal/Modal.tsx +6 -1
  45. package/build/dist/Models/DatabaseModels/CodeRepository.js +689 -0
  46. package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -0
  47. package/build/dist/Models/DatabaseModels/Index.js +7 -0
  48. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  49. package/build/dist/Models/DatabaseModels/LlmLog.js +856 -0
  50. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -0
  51. package/build/dist/Models/DatabaseModels/LlmProvider.js +22 -0
  52. package/build/dist/Models/DatabaseModels/LlmProvider.js.map +1 -1
  53. package/build/dist/Models/DatabaseModels/Project.js +220 -0
  54. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  55. package/build/dist/Models/DatabaseModels/ServiceCatalogCodeRepository.js +565 -0
  56. package/build/dist/Models/DatabaseModels/ServiceCatalogCodeRepository.js.map +1 -0
  57. package/build/dist/Server/API/AIBillingAPI.js +58 -0
  58. package/build/dist/Server/API/AIBillingAPI.js.map +1 -0
  59. package/build/dist/Server/API/AlertAPI.js +94 -0
  60. package/build/dist/Server/API/AlertAPI.js.map +1 -0
  61. package/build/dist/Server/API/GitHubAPI.js +207 -0
  62. package/build/dist/Server/API/GitHubAPI.js.map +1 -0
  63. package/build/dist/Server/API/IncidentAPI.js +171 -1
  64. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  65. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +103 -0
  66. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -0
  67. package/build/dist/Server/EnvironmentConfig.js +31 -0
  68. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  69. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.js +34 -0
  70. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765580181582-MigrationName.js.map +1 -0
  71. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.js +32 -0
  72. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765633554715-MigrationName.js.map +1 -0
  73. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.js +38 -0
  74. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765801357168-MigrationName.js.map +1 -0
  75. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.js +30 -0
  76. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765810218488-MigrationName.js.map +1 -0
  77. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.js +44 -0
  78. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765830758857-MigrationName.js.map +1 -0
  79. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.js +22 -0
  80. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1765834537501-MigrationName.js.map +1 -0
  81. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  82. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  83. package/build/dist/Server/Services/AIBillingService.js +187 -0
  84. package/build/dist/Server/Services/AIBillingService.js.map +1 -0
  85. package/build/dist/Server/Services/AIService.js +184 -0
  86. package/build/dist/Server/Services/AIService.js.map +1 -0
  87. package/build/dist/Server/Services/CodeRepositoryService.js +9 -0
  88. package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -0
  89. package/build/dist/Server/Services/IncidentService.js +60 -0
  90. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  91. package/build/dist/Server/Services/Index.js +2 -0
  92. package/build/dist/Server/Services/Index.js.map +1 -1
  93. package/build/dist/Server/Services/LlmLogService.js +13 -0
  94. package/build/dist/Server/Services/LlmLogService.js.map +1 -0
  95. package/build/dist/Server/Services/LlmProviderService.js +65 -0
  96. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  97. package/build/dist/Server/Services/ServiceCatalogCodeRepositoryService.js +54 -0
  98. package/build/dist/Server/Services/ServiceCatalogCodeRepositoryService.js.map +1 -0
  99. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +238 -0
  100. package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -0
  101. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +597 -0
  102. package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -0
  103. package/build/dist/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.js +311 -0
  104. package/build/dist/Server/Utils/AI/ScheduledMaintenanceAIContextBuilder.js.map +1 -0
  105. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +163 -0
  106. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  107. package/build/dist/Server/Utils/LLM/LLMService.js +225 -0
  108. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -0
  109. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +110 -0
  110. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  111. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +89 -0
  112. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  113. package/build/dist/Server/Utils/Workspace/Workspace.js +80 -0
  114. package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
  115. package/build/dist/Tests/Types/Domain.test.js +19 -3
  116. package/build/dist/Tests/Types/Domain.test.js.map +1 -1
  117. package/build/dist/Types/CodeRepository/CodeRepositoryType.js +1 -1
  118. package/build/dist/Types/CodeRepository/CodeRepositoryType.js.map +1 -1
  119. package/build/dist/Types/Domain.js +18 -16
  120. package/build/dist/Types/Domain.js.map +1 -1
  121. package/build/dist/Types/LlmLogStatus.js +8 -0
  122. package/build/dist/Types/LlmLogStatus.js.map +1 -0
  123. package/build/dist/Types/Permission.js +74 -0
  124. package/build/dist/Types/Permission.js.map +1 -1
  125. package/build/dist/Types/ServiceCatalog/CodeRepositoryImprovementAction.js +10 -0
  126. package/build/dist/Types/ServiceCatalog/CodeRepositoryImprovementAction.js.map +1 -0
  127. package/build/dist/UI/Components/AI/AILoader.js +64 -0
  128. package/build/dist/UI/Components/AI/AILoader.js.map +1 -0
  129. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +320 -0
  130. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -0
  131. package/build/dist/UI/Components/Modal/Modal.js +6 -1
  132. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  133. package/package.json +1 -1
@@ -0,0 +1,549 @@
1
+ import Project from "./Project";
2
+ import User from "./User";
3
+ import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
4
+ import Route from "../../Types/API/Route";
5
+ import { PlanType } from "../../Types/Billing/SubscriptionPlan";
6
+ import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
7
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
8
+ import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl";
9
+ import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
10
+ import ColumnType from "../../Types/Database/ColumnType";
11
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
12
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
13
+ import EnableWorkflow from "../../Types/Database/EnableWorkflow";
14
+ import TableColumn from "../../Types/Database/TableColumn";
15
+ import TableColumnType from "../../Types/Database/TableColumnType";
16
+ import TableMetadata from "../../Types/Database/TableMetadata";
17
+ import TenantColumn from "../../Types/Database/TenantColumn";
18
+ import IconProp from "../../Types/Icon/IconProp";
19
+ import ObjectID from "../../Types/ObjectID";
20
+ import Permission from "../../Types/Permission";
21
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
22
+ import ServiceCatalog from "./ServiceCatalog";
23
+ import CodeRepository from "./CodeRepository";
24
+ import CodeRepositoryImprovementAction from "../../Types/ServiceCatalog/CodeRepositoryImprovementAction";
25
+
26
+ @CanAccessIfCanReadOn("serviceCatalog")
27
+ @EnableDocumentation()
28
+ @TenantColumn("projectId")
29
+ @TableBillingAccessControl({
30
+ create: PlanType.Growth,
31
+ read: PlanType.Growth,
32
+ update: PlanType.Growth,
33
+ delete: PlanType.Growth,
34
+ })
35
+ @TableAccessControl({
36
+ create: [
37
+ Permission.ProjectOwner,
38
+ Permission.ProjectAdmin,
39
+ Permission.ProjectMember,
40
+ Permission.CreateServiceCatalogCodeRepository,
41
+ ],
42
+ read: [
43
+ Permission.ProjectOwner,
44
+ Permission.ProjectAdmin,
45
+ Permission.ProjectMember,
46
+ Permission.ReadServiceCatalogCodeRepository,
47
+ ],
48
+ delete: [
49
+ Permission.ProjectOwner,
50
+ Permission.ProjectAdmin,
51
+ Permission.ProjectMember,
52
+ Permission.DeleteServiceCatalogCodeRepository,
53
+ ],
54
+ update: [
55
+ Permission.ProjectOwner,
56
+ Permission.ProjectAdmin,
57
+ Permission.ProjectMember,
58
+ Permission.EditServiceCatalogCodeRepository,
59
+ ],
60
+ })
61
+ @EnableWorkflow({
62
+ create: true,
63
+ delete: true,
64
+ update: true,
65
+ read: true,
66
+ })
67
+ @CrudApiEndpoint(new Route("/service-catalog-code-repository"))
68
+ @TableMetadata({
69
+ tableName: "ServiceCatalogCodeRepository",
70
+ singularName: "Service Catalog Code Repository",
71
+ pluralName: "Service Catalog Code Repositories",
72
+ icon: IconProp.Code,
73
+ tableDescription:
74
+ "Link code repositories to service catalog items with the path where the service code lives.",
75
+ })
76
+ @Entity({
77
+ name: "ServiceCatalogCodeRepository",
78
+ })
79
+ export default class ServiceCatalogCodeRepository extends BaseModel {
80
+ @ColumnAccessControl({
81
+ create: [
82
+ Permission.ProjectOwner,
83
+ Permission.ProjectAdmin,
84
+ Permission.ProjectMember,
85
+ Permission.CreateServiceCatalogCodeRepository,
86
+ ],
87
+ read: [
88
+ Permission.ProjectOwner,
89
+ Permission.ProjectAdmin,
90
+ Permission.ProjectMember,
91
+ Permission.ReadServiceCatalogCodeRepository,
92
+ ],
93
+ update: [],
94
+ })
95
+ @TableColumn({
96
+ manyToOneRelationColumn: "projectId",
97
+ type: TableColumnType.Entity,
98
+ modelType: Project,
99
+ title: "Project",
100
+ description: "Relation to Project Resource in which this object belongs",
101
+ example: "5f8b9c0d-e1a2-4b3c-8d5e-6f7a8b9c0d1e",
102
+ })
103
+ @ManyToOne(
104
+ () => {
105
+ return Project;
106
+ },
107
+ {
108
+ eager: false,
109
+ nullable: false,
110
+ onDelete: "CASCADE",
111
+ orphanedRowAction: "nullify",
112
+ },
113
+ )
114
+ @JoinColumn({ name: "projectId" })
115
+ public project?: Project = undefined;
116
+
117
+ @ColumnAccessControl({
118
+ create: [
119
+ Permission.ProjectOwner,
120
+ Permission.ProjectAdmin,
121
+ Permission.ProjectMember,
122
+ Permission.CreateServiceCatalogCodeRepository,
123
+ ],
124
+ read: [
125
+ Permission.ProjectOwner,
126
+ Permission.ProjectAdmin,
127
+ Permission.ProjectMember,
128
+ Permission.ReadServiceCatalogCodeRepository,
129
+ ],
130
+ update: [],
131
+ })
132
+ @Index()
133
+ @TableColumn({
134
+ type: TableColumnType.ObjectID,
135
+ required: true,
136
+ canReadOnRelationQuery: true,
137
+ title: "Project ID",
138
+ description: "ID of your OneUptime Project in which this object belongs",
139
+ example: "5f8b9c0d-e1a2-4b3c-8d5e-6f7a8b9c0d1e",
140
+ })
141
+ @Column({
142
+ type: ColumnType.ObjectID,
143
+ nullable: false,
144
+ transformer: ObjectID.getDatabaseTransformer(),
145
+ })
146
+ public projectId?: ObjectID = undefined;
147
+
148
+ @ColumnAccessControl({
149
+ create: [
150
+ Permission.ProjectOwner,
151
+ Permission.ProjectAdmin,
152
+ Permission.ProjectMember,
153
+ Permission.CreateServiceCatalogCodeRepository,
154
+ ],
155
+ read: [
156
+ Permission.ProjectOwner,
157
+ Permission.ProjectAdmin,
158
+ Permission.ProjectMember,
159
+ Permission.ReadServiceCatalogCodeRepository,
160
+ ],
161
+ update: [],
162
+ })
163
+ @TableColumn({
164
+ manyToOneRelationColumn: "serviceCatalogId",
165
+ type: TableColumnType.Entity,
166
+ modelType: ServiceCatalog,
167
+ title: "Service Catalog",
168
+ description:
169
+ "Relation to Service Catalog Resource in which this object belongs",
170
+ example: "f6a7b8c9-d0e1-2345-fa67-bc89de012345",
171
+ })
172
+ @ManyToOne(
173
+ () => {
174
+ return ServiceCatalog;
175
+ },
176
+ {
177
+ eager: false,
178
+ nullable: false,
179
+ onDelete: "CASCADE",
180
+ orphanedRowAction: "nullify",
181
+ },
182
+ )
183
+ @JoinColumn({ name: "serviceCatalogId" })
184
+ public serviceCatalog?: ServiceCatalog = undefined;
185
+
186
+ @ColumnAccessControl({
187
+ create: [
188
+ Permission.ProjectOwner,
189
+ Permission.ProjectAdmin,
190
+ Permission.ProjectMember,
191
+ Permission.CreateServiceCatalogCodeRepository,
192
+ ],
193
+ read: [
194
+ Permission.ProjectOwner,
195
+ Permission.ProjectAdmin,
196
+ Permission.ProjectMember,
197
+ Permission.ReadServiceCatalogCodeRepository,
198
+ ],
199
+ update: [],
200
+ })
201
+ @Index()
202
+ @TableColumn({
203
+ type: TableColumnType.ObjectID,
204
+ required: true,
205
+ canReadOnRelationQuery: true,
206
+ title: "Service Catalog ID",
207
+ description:
208
+ "ID of your OneUptime Service Catalog in which this object belongs",
209
+ example: "f6a7b8c9-d0e1-2345-fa67-bc89de012345",
210
+ })
211
+ @Column({
212
+ type: ColumnType.ObjectID,
213
+ nullable: false,
214
+ transformer: ObjectID.getDatabaseTransformer(),
215
+ })
216
+ public serviceCatalogId?: ObjectID = undefined;
217
+
218
+ @ColumnAccessControl({
219
+ create: [
220
+ Permission.ProjectOwner,
221
+ Permission.ProjectAdmin,
222
+ Permission.ProjectMember,
223
+ Permission.CreateServiceCatalogCodeRepository,
224
+ ],
225
+ read: [
226
+ Permission.ProjectOwner,
227
+ Permission.ProjectAdmin,
228
+ Permission.ProjectMember,
229
+ Permission.ReadServiceCatalogCodeRepository,
230
+ ],
231
+ update: [],
232
+ })
233
+ @TableColumn({
234
+ manyToOneRelationColumn: "codeRepositoryId",
235
+ type: TableColumnType.Entity,
236
+ modelType: CodeRepository,
237
+ title: "Code Repository",
238
+ description: "Relation to Code Repository in which this object belongs",
239
+ example: "b8c9d0e1-f2a3-4567-bc89-de01fa234567",
240
+ })
241
+ @ManyToOne(
242
+ () => {
243
+ return CodeRepository;
244
+ },
245
+ {
246
+ eager: false,
247
+ nullable: false,
248
+ onDelete: "CASCADE",
249
+ orphanedRowAction: "nullify",
250
+ },
251
+ )
252
+ @JoinColumn({ name: "codeRepositoryId" })
253
+ public codeRepository?: CodeRepository = undefined;
254
+
255
+ @ColumnAccessControl({
256
+ create: [
257
+ Permission.ProjectOwner,
258
+ Permission.ProjectAdmin,
259
+ Permission.ProjectMember,
260
+ Permission.CreateServiceCatalogCodeRepository,
261
+ ],
262
+ read: [
263
+ Permission.ProjectOwner,
264
+ Permission.ProjectAdmin,
265
+ Permission.ProjectMember,
266
+ Permission.ReadServiceCatalogCodeRepository,
267
+ ],
268
+ update: [],
269
+ })
270
+ @Index()
271
+ @TableColumn({
272
+ type: TableColumnType.ObjectID,
273
+ required: true,
274
+ canReadOnRelationQuery: true,
275
+ title: "Code Repository ID",
276
+ description: "ID of your Code Repository in which this object belongs",
277
+ example: "b8c9d0e1-f2a3-4567-bc89-de01fa234567",
278
+ })
279
+ @Column({
280
+ type: ColumnType.ObjectID,
281
+ nullable: false,
282
+ transformer: ObjectID.getDatabaseTransformer(),
283
+ })
284
+ public codeRepositoryId?: ObjectID = undefined;
285
+
286
+ @ColumnAccessControl({
287
+ create: [
288
+ Permission.ProjectOwner,
289
+ Permission.ProjectAdmin,
290
+ Permission.ProjectMember,
291
+ Permission.CreateServiceCatalogCodeRepository,
292
+ ],
293
+ read: [
294
+ Permission.ProjectOwner,
295
+ Permission.ProjectAdmin,
296
+ Permission.ProjectMember,
297
+ Permission.ReadServiceCatalogCodeRepository,
298
+ ],
299
+ update: [
300
+ Permission.ProjectOwner,
301
+ Permission.ProjectAdmin,
302
+ Permission.ProjectMember,
303
+ Permission.EditServiceCatalogCodeRepository,
304
+ ],
305
+ })
306
+ @TableColumn({
307
+ type: TableColumnType.LongText,
308
+ required: false,
309
+ title: "Service Path in Repository",
310
+ description:
311
+ "The path in the repository where the service code lives (e.g., /services/api or /src/backend)",
312
+ example: "/services/api",
313
+ })
314
+ @Column({
315
+ type: ColumnType.LongText,
316
+ nullable: true,
317
+ })
318
+ public servicePathInRepository?: string = undefined;
319
+
320
+ @ColumnAccessControl({
321
+ create: [
322
+ Permission.ProjectOwner,
323
+ Permission.ProjectAdmin,
324
+ Permission.ProjectMember,
325
+ Permission.CreateServiceCatalogCodeRepository,
326
+ ],
327
+ read: [
328
+ Permission.ProjectOwner,
329
+ Permission.ProjectAdmin,
330
+ Permission.ProjectMember,
331
+ Permission.ReadServiceCatalogCodeRepository,
332
+ ],
333
+ update: [],
334
+ })
335
+ @TableColumn({
336
+ manyToOneRelationColumn: "createdByUserId",
337
+ type: TableColumnType.Entity,
338
+ modelType: User,
339
+ title: "Created by User",
340
+ description:
341
+ "Relation to User who created this object (if this object was created by a User)",
342
+ example: "c3d4e5f6-a7b8-9012-cd34-ef56ab789012",
343
+ })
344
+ @ManyToOne(
345
+ () => {
346
+ return User;
347
+ },
348
+ {
349
+ eager: false,
350
+ nullable: true,
351
+ onDelete: "SET NULL",
352
+ orphanedRowAction: "nullify",
353
+ },
354
+ )
355
+ @JoinColumn({ name: "createdByUserId" })
356
+ public createdByUser?: User = undefined;
357
+
358
+ @ColumnAccessControl({
359
+ create: [
360
+ Permission.ProjectOwner,
361
+ Permission.ProjectAdmin,
362
+ Permission.ProjectMember,
363
+ Permission.CreateServiceCatalogCodeRepository,
364
+ ],
365
+ read: [
366
+ Permission.ProjectOwner,
367
+ Permission.ProjectAdmin,
368
+ Permission.ProjectMember,
369
+ Permission.ReadServiceCatalogCodeRepository,
370
+ ],
371
+ update: [],
372
+ })
373
+ @TableColumn({
374
+ type: TableColumnType.ObjectID,
375
+ title: "Created by User ID",
376
+ description:
377
+ "User ID who created this object (if this object was created by a User)",
378
+ example: "c3d4e5f6-a7b8-9012-cd34-ef56ab789012",
379
+ })
380
+ @Column({
381
+ type: ColumnType.ObjectID,
382
+ nullable: true,
383
+ transformer: ObjectID.getDatabaseTransformer(),
384
+ })
385
+ public createdByUserId?: ObjectID = undefined;
386
+
387
+ @ColumnAccessControl({
388
+ create: [],
389
+ read: [
390
+ Permission.ProjectOwner,
391
+ Permission.ProjectAdmin,
392
+ Permission.ProjectMember,
393
+ Permission.ReadServiceCatalogCodeRepository,
394
+ ],
395
+ update: [],
396
+ })
397
+ @TableColumn({
398
+ manyToOneRelationColumn: "deletedByUserId",
399
+ type: TableColumnType.Entity,
400
+ title: "Deleted by User",
401
+ modelType: User,
402
+ description:
403
+ "Relation to User who deleted this object (if this object was deleted by a User)",
404
+ example: "d4e5f6a7-b8c9-0123-de45-fa67bc890123",
405
+ })
406
+ @ManyToOne(
407
+ () => {
408
+ return User;
409
+ },
410
+ {
411
+ cascade: false,
412
+ eager: false,
413
+ nullable: true,
414
+ onDelete: "SET NULL",
415
+ orphanedRowAction: "nullify",
416
+ },
417
+ )
418
+ @JoinColumn({ name: "deletedByUserId" })
419
+ public deletedByUser?: User = undefined;
420
+
421
+ @ColumnAccessControl({
422
+ create: [],
423
+ read: [
424
+ Permission.ProjectOwner,
425
+ Permission.ProjectAdmin,
426
+ Permission.ProjectMember,
427
+ Permission.ReadServiceCatalogCodeRepository,
428
+ ],
429
+ update: [],
430
+ })
431
+ @TableColumn({
432
+ type: TableColumnType.ObjectID,
433
+ title: "Deleted by User ID",
434
+ description:
435
+ "User ID who deleted this object (if this object was deleted by a User)",
436
+ example: "d4e5f6a7-b8c9-0123-de45-fa67bc890123",
437
+ })
438
+ @Column({
439
+ type: ColumnType.ObjectID,
440
+ nullable: true,
441
+ transformer: ObjectID.getDatabaseTransformer(),
442
+ })
443
+ public deletedByUserId?: ObjectID = undefined;
444
+
445
+ @ColumnAccessControl({
446
+ create: [
447
+ Permission.ProjectOwner,
448
+ Permission.ProjectAdmin,
449
+ Permission.ProjectMember,
450
+ Permission.CreateServiceCatalogCodeRepository,
451
+ ],
452
+ read: [
453
+ Permission.ProjectOwner,
454
+ Permission.ProjectAdmin,
455
+ Permission.ProjectMember,
456
+ Permission.ReadServiceCatalogCodeRepository,
457
+ ],
458
+ update: [
459
+ Permission.ProjectOwner,
460
+ Permission.ProjectAdmin,
461
+ Permission.ProjectMember,
462
+ Permission.EditServiceCatalogCodeRepository,
463
+ ],
464
+ })
465
+ @TableColumn({
466
+ type: TableColumnType.Boolean,
467
+ required: false,
468
+ isDefaultValueColumn: true,
469
+ title: "Enable Automatic Code Improvements",
470
+ description:
471
+ "Enable OneUptime to automatically create pull requests to improve the code for this service.",
472
+ })
473
+ @Column({
474
+ type: ColumnType.Boolean,
475
+ nullable: false,
476
+ default: true,
477
+ })
478
+ public enableAutomaticImprovements?: boolean = undefined;
479
+
480
+ @ColumnAccessControl({
481
+ create: [
482
+ Permission.ProjectOwner,
483
+ Permission.ProjectAdmin,
484
+ Permission.ProjectMember,
485
+ Permission.CreateServiceCatalogCodeRepository,
486
+ ],
487
+ read: [
488
+ Permission.ProjectOwner,
489
+ Permission.ProjectAdmin,
490
+ Permission.ProjectMember,
491
+ Permission.ReadServiceCatalogCodeRepository,
492
+ ],
493
+ update: [
494
+ Permission.ProjectOwner,
495
+ Permission.ProjectAdmin,
496
+ Permission.ProjectMember,
497
+ Permission.EditServiceCatalogCodeRepository,
498
+ ],
499
+ })
500
+ @TableColumn({
501
+ type: TableColumnType.Number,
502
+ required: false,
503
+ isDefaultValueColumn: true,
504
+ title: "Max Open Pull Requests",
505
+ description:
506
+ "Maximum number of open pull requests that OneUptime can create for this service at any given time.",
507
+ })
508
+ @Column({
509
+ type: ColumnType.Number,
510
+ nullable: false,
511
+ default: 3,
512
+ })
513
+ public maxOpenPullRequests?: number = undefined;
514
+
515
+ @ColumnAccessControl({
516
+ create: [
517
+ Permission.ProjectOwner,
518
+ Permission.ProjectAdmin,
519
+ Permission.ProjectMember,
520
+ Permission.CreateServiceCatalogCodeRepository,
521
+ ],
522
+ read: [
523
+ Permission.ProjectOwner,
524
+ Permission.ProjectAdmin,
525
+ Permission.ProjectMember,
526
+ Permission.ReadServiceCatalogCodeRepository,
527
+ ],
528
+ update: [
529
+ Permission.ProjectOwner,
530
+ Permission.ProjectAdmin,
531
+ Permission.ProjectMember,
532
+ Permission.EditServiceCatalogCodeRepository,
533
+ ],
534
+ })
535
+ @TableColumn({
536
+ type: TableColumnType.JSON,
537
+ required: false,
538
+ isDefaultValueColumn: false,
539
+ title: "Restricted Improvement Actions",
540
+ description:
541
+ "Restrict code improvements to only these actions. If empty, all improvement actions are allowed.",
542
+ })
543
+ @Column({
544
+ type: ColumnType.JSON,
545
+ nullable: true,
546
+ })
547
+ public restrictedImprovementActions?: Array<CodeRepositoryImprovementAction> =
548
+ undefined;
549
+ }
@@ -0,0 +1,126 @@
1
+ import UserMiddleware from "../Middleware/UserAuthorization";
2
+ import AIBillingService from "../Services/AIBillingService";
3
+ import { IsBillingEnabled } from "../EnvironmentConfig";
4
+ import Express, {
5
+ ExpressRequest,
6
+ ExpressResponse,
7
+ ExpressRouter,
8
+ NextFunction,
9
+ OneUptimeRequest,
10
+ } from "../Utils/Express";
11
+ import Response from "../Utils/Response";
12
+ import BadDataException from "../../Types/Exception/BadDataException";
13
+ import JSONFunctions from "../../Types/JSONFunctions";
14
+ import ObjectID from "../../Types/ObjectID";
15
+ import Permission, { UserPermission } from "../../Types/Permission";
16
+ import PositiveNumber from "../../Types/PositiveNumber";
17
+
18
+ const router: ExpressRouter = Express.getRouter();
19
+
20
+ router.post(
21
+ "/ai/recharge",
22
+ UserMiddleware.getUserMiddleware,
23
+ async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
24
+ try {
25
+ if (!IsBillingEnabled) {
26
+ return Response.sendErrorResponse(
27
+ req,
28
+ res,
29
+ new BadDataException("Billing is not enabled"),
30
+ );
31
+ }
32
+
33
+ let amount: number | PositiveNumber = JSONFunctions.deserializeValue(
34
+ req.body.amount,
35
+ ) as number | PositiveNumber;
36
+
37
+ if (amount instanceof PositiveNumber) {
38
+ amount = amount.toNumber();
39
+ }
40
+
41
+ if (typeof amount === "string") {
42
+ amount = parseInt(amount);
43
+ }
44
+
45
+ const projectId: ObjectID = JSONFunctions.deserializeValue(
46
+ req.body.projectId,
47
+ ) as ObjectID;
48
+
49
+ if (!amount || typeof amount !== "number") {
50
+ return Response.sendErrorResponse(
51
+ req,
52
+ res,
53
+ new BadDataException("Invalid amount"),
54
+ );
55
+ }
56
+
57
+ if (amount > 1000) {
58
+ return Response.sendErrorResponse(
59
+ req,
60
+ res,
61
+ new BadDataException("Amount cannot be greater than 1000"),
62
+ );
63
+ }
64
+
65
+ if (amount < 20) {
66
+ return Response.sendErrorResponse(
67
+ req,
68
+ res,
69
+ new BadDataException("Amount cannot be less than 20"),
70
+ );
71
+ }
72
+
73
+ if (!projectId || !projectId.toString()) {
74
+ return Response.sendErrorResponse(
75
+ req,
76
+ res,
77
+ new BadDataException("Invalid projectId"),
78
+ );
79
+ }
80
+
81
+ // get permissions. if user has permission to recharge, then recharge
82
+
83
+ if (
84
+ !(req as OneUptimeRequest).userTenantAccessPermission ||
85
+ !(req as OneUptimeRequest).userTenantAccessPermission![
86
+ projectId.toString()
87
+ ]
88
+ ) {
89
+ return Response.sendErrorResponse(
90
+ req,
91
+ res,
92
+ new BadDataException("Permission for this user not found"),
93
+ );
94
+ }
95
+
96
+ const permissions: Array<Permission> = (
97
+ req as OneUptimeRequest
98
+ ).userTenantAccessPermission![projectId.toString()]!.permissions.map(
99
+ (permission: UserPermission) => {
100
+ return permission.permission;
101
+ },
102
+ );
103
+
104
+ if (
105
+ permissions.includes(Permission.ProjectOwner) ||
106
+ permissions.includes(Permission.ManageProjectBilling)
107
+ ) {
108
+ await AIBillingService.rechargeBalance(projectId, amount);
109
+ } else {
110
+ return Response.sendErrorResponse(
111
+ req,
112
+ res,
113
+ new BadDataException(
114
+ "User does not have permission to recharge. You need any one of these permissions - ProjectOwner, CanManageProjectBilling",
115
+ ),
116
+ );
117
+ }
118
+ } catch (err) {
119
+ return next(err);
120
+ }
121
+
122
+ return Response.sendEmptySuccessResponse(req, res);
123
+ },
124
+ );
125
+
126
+ export default router;