@oneuptime/common 10.0.31 → 10.0.33

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 (130) hide show
  1. package/Models/AnalyticsModels/ExceptionInstance.ts +29 -4
  2. package/Models/AnalyticsModels/Log.ts +110 -4
  3. package/Models/AnalyticsModels/Metric.ts +16 -9
  4. package/Models/AnalyticsModels/MonitorLog.ts +4 -2
  5. package/Models/AnalyticsModels/Span.ts +79 -6
  6. package/Models/DatabaseModels/Index.ts +8 -0
  7. package/Models/DatabaseModels/LogDropFilter.ts +480 -0
  8. package/Models/DatabaseModels/LogPipeline.ts +412 -0
  9. package/Models/DatabaseModels/LogPipelineProcessor.ts +430 -0
  10. package/Models/DatabaseModels/LogScrubRule.ts +516 -0
  11. package/Server/API/TelemetryAPI.ts +261 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1773402621107-MigrationName.ts +131 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.ts +79 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.ts +41 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1773676206197-MigrationName.ts +57 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  17. package/Server/Services/AnalyticsDatabaseService.ts +61 -0
  18. package/Server/Services/LogAggregationService.ts +238 -1
  19. package/Server/Services/LogDropFilterService.ts +10 -0
  20. package/Server/Services/LogPipelineProcessorService.ts +10 -0
  21. package/Server/Services/LogPipelineService.ts +10 -0
  22. package/Server/Services/LogScrubRuleService.ts +10 -0
  23. package/Server/Services/TelemetryAttributeService.ts +4 -6
  24. package/Server/Utils/AnalyticsDatabase/Statement.ts +15 -1
  25. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +126 -11
  26. package/Tests/Server/Services/LogAggregationService.test.ts +3 -2
  27. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +9 -0
  28. package/Types/AnalyticsDatabase/TableColumnType.ts +4 -0
  29. package/Types/Date.ts +22 -0
  30. package/Types/Log/LogDropFilterAction.ts +6 -0
  31. package/Types/Log/LogPipelineProcessorType.ts +44 -0
  32. package/Types/Log/LogScrubAction.ts +7 -0
  33. package/Types/Log/LogScrubPatternType.ts +10 -0
  34. package/Types/Permission.ts +174 -0
  35. package/UI/Components/LogsViewer/LogsViewer.tsx +152 -4
  36. package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +92 -0
  37. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +332 -117
  38. package/UI/Components/LogsViewer/components/LogSearchBar.tsx +294 -274
  39. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +513 -234
  40. package/UI/Components/LogsViewer/components/LogsFilterCard.tsx +37 -29
  41. package/UI/Components/LogsViewer/components/LogsTable.tsx +6 -1
  42. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +106 -0
  43. package/UI/Utils/LogExport.ts +160 -0
  44. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +28 -4
  45. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  46. package/build/dist/Models/AnalyticsModels/Log.js +97 -4
  47. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  48. package/build/dist/Models/AnalyticsModels/Metric.js +16 -9
  49. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  50. package/build/dist/Models/AnalyticsModels/MonitorLog.js +4 -2
  51. package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
  52. package/build/dist/Models/AnalyticsModels/Span.js +73 -6
  53. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  54. package/build/dist/Models/DatabaseModels/Index.js +8 -0
  55. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  56. package/build/dist/Models/DatabaseModels/LogDropFilter.js +508 -0
  57. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -0
  58. package/build/dist/Models/DatabaseModels/LogPipeline.js +438 -0
  59. package/build/dist/Models/DatabaseModels/LogPipeline.js.map +1 -0
  60. package/build/dist/Models/DatabaseModels/LogPipelineProcessor.js +452 -0
  61. package/build/dist/Models/DatabaseModels/LogPipelineProcessor.js.map +1 -0
  62. package/build/dist/Models/DatabaseModels/LogScrubRule.js +545 -0
  63. package/build/dist/Models/DatabaseModels/LogScrubRule.js.map +1 -0
  64. package/build/dist/Server/API/TelemetryAPI.js +155 -0
  65. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  66. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773402621107-MigrationName.js +52 -0
  67. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773402621107-MigrationName.js.map +1 -0
  68. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.js +34 -0
  69. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.js.map +1 -0
  70. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.js +22 -0
  71. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.js.map +1 -0
  72. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773676206197-MigrationName.js +26 -0
  73. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773676206197-MigrationName.js.map +1 -0
  74. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  75. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  76. package/build/dist/Server/Services/AnalyticsDatabaseService.js +30 -0
  77. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  78. package/build/dist/Server/Services/LogAggregationService.js +188 -1
  79. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  80. package/build/dist/Server/Services/LogDropFilterService.js +9 -0
  81. package/build/dist/Server/Services/LogDropFilterService.js.map +1 -0
  82. package/build/dist/Server/Services/LogPipelineProcessorService.js +9 -0
  83. package/build/dist/Server/Services/LogPipelineProcessorService.js.map +1 -0
  84. package/build/dist/Server/Services/LogPipelineService.js +9 -0
  85. package/build/dist/Server/Services/LogPipelineService.js.map +1 -0
  86. package/build/dist/Server/Services/LogScrubRuleService.js +9 -0
  87. package/build/dist/Server/Services/LogScrubRuleService.js.map +1 -0
  88. package/build/dist/Server/Services/TelemetryAttributeService.js +4 -6
  89. package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
  90. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +13 -1
  91. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  92. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +89 -2
  93. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  94. package/build/dist/Tests/Server/Services/LogAggregationService.test.js +3 -2
  95. package/build/dist/Tests/Server/Services/LogAggregationService.test.js.map +1 -1
  96. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  97. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -0
  98. package/build/dist/Types/AnalyticsDatabase/TableColumnType.js +4 -0
  99. package/build/dist/Types/AnalyticsDatabase/TableColumnType.js.map +1 -1
  100. package/build/dist/Types/Date.js +16 -0
  101. package/build/dist/Types/Date.js.map +1 -1
  102. package/build/dist/Types/Log/LogDropFilterAction.js +7 -0
  103. package/build/dist/Types/Log/LogDropFilterAction.js.map +1 -0
  104. package/build/dist/Types/Log/LogPipelineProcessorType.js +9 -0
  105. package/build/dist/Types/Log/LogPipelineProcessorType.js.map +1 -0
  106. package/build/dist/Types/Log/LogScrubAction.js +8 -0
  107. package/build/dist/Types/Log/LogScrubAction.js.map +1 -0
  108. package/build/dist/Types/Log/LogScrubPatternType.js +11 -0
  109. package/build/dist/Types/Log/LogScrubPatternType.js.map +1 -0
  110. package/build/dist/Types/Permission.js +152 -0
  111. package/build/dist/Types/Permission.js.map +1 -1
  112. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +124 -11
  113. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  114. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +36 -0
  115. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -0
  116. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +114 -4
  117. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  118. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +17 -5
  119. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
  120. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +229 -122
  121. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  122. package/build/dist/UI/Components/LogsViewer/components/LogsFilterCard.js +5 -4
  123. package/build/dist/UI/Components/LogsViewer/components/LogsFilterCard.js.map +1 -1
  124. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +4 -1
  125. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
  126. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +28 -0
  127. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  128. package/build/dist/UI/Utils/LogExport.js +129 -0
  129. package/build/dist/UI/Utils/LogExport.js.map +1 -0
  130. package/package.json +1 -1
@@ -0,0 +1,412 @@
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 ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
6
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
7
+ import TableBillingAccessControl from "../../Types/Database/AccessControl/TableBillingAccessControl";
8
+ import ColumnLength from "../../Types/Database/ColumnLength";
9
+ import ColumnType from "../../Types/Database/ColumnType";
10
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
11
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
12
+ import TableColumn from "../../Types/Database/TableColumn";
13
+ import TableColumnType from "../../Types/Database/TableColumnType";
14
+ import TableMetadata from "../../Types/Database/TableMetadata";
15
+ import TenantColumn from "../../Types/Database/TenantColumn";
16
+ import IconProp from "../../Types/Icon/IconProp";
17
+ import ObjectID from "../../Types/ObjectID";
18
+ import Permission from "../../Types/Permission";
19
+ import { PlanType } from "../../Types/Billing/SubscriptionPlan";
20
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
21
+
22
+ @EnableDocumentation()
23
+ @TableBillingAccessControl({
24
+ create: PlanType.Free,
25
+ read: PlanType.Free,
26
+ update: PlanType.Free,
27
+ delete: PlanType.Free,
28
+ })
29
+ @TenantColumn("projectId")
30
+ @CrudApiEndpoint(new Route("/log-pipeline"))
31
+ @Entity({
32
+ name: "LogPipeline",
33
+ })
34
+ @TableMetadata({
35
+ tableName: "LogPipeline",
36
+ singularName: "Log Pipeline",
37
+ pluralName: "Log Pipelines",
38
+ icon: IconProp.Logs,
39
+ tableDescription:
40
+ "Configure server-side log processing pipelines that transform logs at ingest time.",
41
+ })
42
+ @TableAccessControl({
43
+ create: [
44
+ Permission.ProjectOwner,
45
+ Permission.ProjectAdmin,
46
+ Permission.CreateProjectLogPipeline,
47
+ ],
48
+ read: [
49
+ Permission.ProjectOwner,
50
+ Permission.ProjectAdmin,
51
+ Permission.ProjectMember,
52
+ Permission.ReadProjectLogPipeline,
53
+ Permission.ReadAllProjectResources,
54
+ ],
55
+ delete: [
56
+ Permission.ProjectOwner,
57
+ Permission.ProjectAdmin,
58
+ Permission.DeleteProjectLogPipeline,
59
+ ],
60
+ update: [
61
+ Permission.ProjectOwner,
62
+ Permission.ProjectAdmin,
63
+ Permission.EditProjectLogPipeline,
64
+ ],
65
+ })
66
+ export default class LogPipeline extends BaseModel {
67
+ @ColumnAccessControl({
68
+ create: [
69
+ Permission.ProjectOwner,
70
+ Permission.ProjectAdmin,
71
+ Permission.CreateProjectLogPipeline,
72
+ ],
73
+ read: [
74
+ Permission.ProjectOwner,
75
+ Permission.ProjectAdmin,
76
+ Permission.ProjectMember,
77
+ Permission.ReadProjectLogPipeline,
78
+ Permission.ReadAllProjectResources,
79
+ ],
80
+ update: [],
81
+ })
82
+ @TableColumn({
83
+ manyToOneRelationColumn: "projectId",
84
+ type: TableColumnType.Entity,
85
+ modelType: Project,
86
+ title: "Project",
87
+ description: "Relation to the project this log pipeline belongs to.",
88
+ })
89
+ @ManyToOne(
90
+ () => {
91
+ return Project;
92
+ },
93
+ {
94
+ eager: false,
95
+ nullable: true,
96
+ onDelete: "CASCADE",
97
+ orphanedRowAction: "nullify",
98
+ },
99
+ )
100
+ @JoinColumn({ name: "projectId" })
101
+ public project?: Project = undefined;
102
+
103
+ @ColumnAccessControl({
104
+ create: [
105
+ Permission.ProjectOwner,
106
+ Permission.ProjectAdmin,
107
+ Permission.CreateProjectLogPipeline,
108
+ ],
109
+ read: [
110
+ Permission.ProjectOwner,
111
+ Permission.ProjectAdmin,
112
+ Permission.ProjectMember,
113
+ Permission.ReadProjectLogPipeline,
114
+ Permission.ReadAllProjectResources,
115
+ ],
116
+ update: [],
117
+ })
118
+ @Index()
119
+ @TableColumn({
120
+ type: TableColumnType.ObjectID,
121
+ required: true,
122
+ canReadOnRelationQuery: true,
123
+ title: "Project ID",
124
+ description: "ID of the project this log pipeline belongs to.",
125
+ })
126
+ @Column({
127
+ type: ColumnType.ObjectID,
128
+ nullable: false,
129
+ transformer: ObjectID.getDatabaseTransformer(),
130
+ })
131
+ public projectId?: ObjectID = undefined;
132
+
133
+ @ColumnAccessControl({
134
+ create: [
135
+ Permission.ProjectOwner,
136
+ Permission.ProjectAdmin,
137
+ Permission.CreateProjectLogPipeline,
138
+ ],
139
+ read: [
140
+ Permission.ProjectOwner,
141
+ Permission.ProjectAdmin,
142
+ Permission.ProjectMember,
143
+ Permission.ReadProjectLogPipeline,
144
+ Permission.ReadAllProjectResources,
145
+ ],
146
+ update: [
147
+ Permission.ProjectOwner,
148
+ Permission.ProjectAdmin,
149
+ Permission.EditProjectLogPipeline,
150
+ ],
151
+ })
152
+ @TableColumn({
153
+ required: true,
154
+ type: TableColumnType.Name,
155
+ canReadOnRelationQuery: true,
156
+ title: "Name",
157
+ description: "Friendly name for this log pipeline.",
158
+ })
159
+ @Column({
160
+ nullable: false,
161
+ type: ColumnType.Name,
162
+ length: ColumnLength.Name,
163
+ })
164
+ public name?: string = undefined;
165
+
166
+ @ColumnAccessControl({
167
+ create: [
168
+ Permission.ProjectOwner,
169
+ Permission.ProjectAdmin,
170
+ Permission.CreateProjectLogPipeline,
171
+ ],
172
+ read: [
173
+ Permission.ProjectOwner,
174
+ Permission.ProjectAdmin,
175
+ Permission.ProjectMember,
176
+ Permission.ReadProjectLogPipeline,
177
+ Permission.ReadAllProjectResources,
178
+ ],
179
+ update: [
180
+ Permission.ProjectOwner,
181
+ Permission.ProjectAdmin,
182
+ Permission.EditProjectLogPipeline,
183
+ ],
184
+ })
185
+ @TableColumn({
186
+ required: false,
187
+ type: TableColumnType.LongText,
188
+ canReadOnRelationQuery: true,
189
+ title: "Description",
190
+ description: "Description of what this log pipeline does.",
191
+ })
192
+ @Column({
193
+ nullable: true,
194
+ type: ColumnType.LongText,
195
+ length: ColumnLength.LongText,
196
+ })
197
+ public description?: string = undefined;
198
+
199
+ @ColumnAccessControl({
200
+ create: [
201
+ Permission.ProjectOwner,
202
+ Permission.ProjectAdmin,
203
+ Permission.CreateProjectLogPipeline,
204
+ ],
205
+ read: [
206
+ Permission.ProjectOwner,
207
+ Permission.ProjectAdmin,
208
+ Permission.ProjectMember,
209
+ Permission.ReadProjectLogPipeline,
210
+ Permission.ReadAllProjectResources,
211
+ ],
212
+ update: [
213
+ Permission.ProjectOwner,
214
+ Permission.ProjectAdmin,
215
+ Permission.EditProjectLogPipeline,
216
+ ],
217
+ })
218
+ @TableColumn({
219
+ required: false,
220
+ type: TableColumnType.LongText,
221
+ canReadOnRelationQuery: true,
222
+ title: "Filter Query",
223
+ description:
224
+ "Filter expression that determines which logs this pipeline applies to.",
225
+ })
226
+ @Column({
227
+ nullable: true,
228
+ type: ColumnType.LongText,
229
+ length: ColumnLength.LongText,
230
+ })
231
+ public filterQuery?: string = undefined;
232
+
233
+ @ColumnAccessControl({
234
+ create: [
235
+ Permission.ProjectOwner,
236
+ Permission.ProjectAdmin,
237
+ Permission.CreateProjectLogPipeline,
238
+ ],
239
+ read: [
240
+ Permission.ProjectOwner,
241
+ Permission.ProjectAdmin,
242
+ Permission.ProjectMember,
243
+ Permission.ReadProjectLogPipeline,
244
+ Permission.ReadAllProjectResources,
245
+ ],
246
+ update: [
247
+ Permission.ProjectOwner,
248
+ Permission.ProjectAdmin,
249
+ Permission.EditProjectLogPipeline,
250
+ ],
251
+ })
252
+ @Index()
253
+ @TableColumn({
254
+ required: true,
255
+ type: TableColumnType.Boolean,
256
+ canReadOnRelationQuery: true,
257
+ title: "Enabled",
258
+ description: "Whether this log pipeline is active.",
259
+ defaultValue: true,
260
+ })
261
+ @Column({
262
+ nullable: false,
263
+ type: ColumnType.Boolean,
264
+ default: true,
265
+ })
266
+ public isEnabled?: boolean = undefined;
267
+
268
+ @ColumnAccessControl({
269
+ create: [
270
+ Permission.ProjectOwner,
271
+ Permission.ProjectAdmin,
272
+ Permission.CreateProjectLogPipeline,
273
+ ],
274
+ read: [
275
+ Permission.ProjectOwner,
276
+ Permission.ProjectAdmin,
277
+ Permission.ProjectMember,
278
+ Permission.ReadProjectLogPipeline,
279
+ Permission.ReadAllProjectResources,
280
+ ],
281
+ update: [
282
+ Permission.ProjectOwner,
283
+ Permission.ProjectAdmin,
284
+ Permission.EditProjectLogPipeline,
285
+ ],
286
+ })
287
+ @TableColumn({
288
+ title: "Sort Order",
289
+ required: true,
290
+ type: TableColumnType.Number,
291
+ canReadOnRelationQuery: true,
292
+ description:
293
+ "Determines the execution order of this pipeline relative to others.",
294
+ defaultValue: 0,
295
+ })
296
+ @Column({
297
+ type: ColumnType.Number,
298
+ nullable: false,
299
+ default: 0,
300
+ })
301
+ public sortOrder?: number = undefined;
302
+
303
+ @ColumnAccessControl({
304
+ create: [],
305
+ read: [
306
+ Permission.ProjectOwner,
307
+ Permission.ProjectAdmin,
308
+ Permission.ProjectMember,
309
+ Permission.ReadProjectLogPipeline,
310
+ Permission.ReadAllProjectResources,
311
+ ],
312
+ update: [],
313
+ })
314
+ @TableColumn({
315
+ manyToOneRelationColumn: "createdByUserId",
316
+ type: TableColumnType.Entity,
317
+ modelType: User,
318
+ title: "Created By User",
319
+ description: "Relation to the user who created this log pipeline.",
320
+ })
321
+ @ManyToOne(
322
+ () => {
323
+ return User;
324
+ },
325
+ {
326
+ eager: false,
327
+ nullable: true,
328
+ onDelete: "SET NULL",
329
+ orphanedRowAction: "nullify",
330
+ },
331
+ )
332
+ @JoinColumn({ name: "createdByUserId" })
333
+ public createdByUser?: User = undefined;
334
+
335
+ @ColumnAccessControl({
336
+ create: [],
337
+ read: [
338
+ Permission.ProjectOwner,
339
+ Permission.ProjectAdmin,
340
+ Permission.ProjectMember,
341
+ Permission.ReadProjectLogPipeline,
342
+ Permission.ReadAllProjectResources,
343
+ ],
344
+ update: [],
345
+ })
346
+ @TableColumn({
347
+ type: TableColumnType.ObjectID,
348
+ title: "Created By User ID",
349
+ description: "ID of the user who created this log pipeline.",
350
+ })
351
+ @Column({
352
+ type: ColumnType.ObjectID,
353
+ nullable: true,
354
+ transformer: ObjectID.getDatabaseTransformer(),
355
+ })
356
+ public createdByUserId?: ObjectID = undefined;
357
+
358
+ @ColumnAccessControl({
359
+ create: [],
360
+ read: [
361
+ Permission.ProjectOwner,
362
+ Permission.ProjectAdmin,
363
+ Permission.ProjectMember,
364
+ Permission.ReadProjectLogPipeline,
365
+ Permission.ReadAllProjectResources,
366
+ ],
367
+ update: [],
368
+ })
369
+ @TableColumn({
370
+ manyToOneRelationColumn: "deletedByUserId",
371
+ type: TableColumnType.Entity,
372
+ modelType: User,
373
+ title: "Deleted By User",
374
+ description: "Relation to the user who deleted this log pipeline.",
375
+ })
376
+ @ManyToOne(
377
+ () => {
378
+ return User;
379
+ },
380
+ {
381
+ eager: false,
382
+ nullable: true,
383
+ onDelete: "SET NULL",
384
+ orphanedRowAction: "nullify",
385
+ },
386
+ )
387
+ @JoinColumn({ name: "deletedByUserId" })
388
+ public deletedByUser?: User = undefined;
389
+
390
+ @ColumnAccessControl({
391
+ create: [],
392
+ read: [
393
+ Permission.ProjectOwner,
394
+ Permission.ProjectAdmin,
395
+ Permission.ProjectMember,
396
+ Permission.ReadProjectLogPipeline,
397
+ Permission.ReadAllProjectResources,
398
+ ],
399
+ update: [],
400
+ })
401
+ @TableColumn({
402
+ type: TableColumnType.ObjectID,
403
+ title: "Deleted By User ID",
404
+ description: "ID of the user who deleted this log pipeline.",
405
+ })
406
+ @Column({
407
+ type: ColumnType.ObjectID,
408
+ nullable: true,
409
+ transformer: ObjectID.getDatabaseTransformer(),
410
+ })
411
+ public deletedByUserId?: ObjectID = undefined;
412
+ }