@oneuptime/common 12.0.2 → 12.0.3

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 (228) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +14 -0
  2. package/Models/DatabaseModels/Index.ts +2 -0
  3. package/Models/DatabaseModels/LogDropFilter.ts +9 -20
  4. package/Models/DatabaseModels/StatusPageMonitorRule.ts +911 -0
  5. package/Models/DatabaseModels/StatusPageResource.ts +73 -0
  6. package/Models/DatabaseModels/TraceDropFilter.ts +9 -20
  7. package/Server/API/BaseAPI.ts +13 -2
  8. package/Server/API/DashboardAPI.ts +39 -0
  9. package/Server/EnvironmentConfig.ts +31 -1
  10. package/Server/Infrastructure/GlobalCache.ts +115 -0
  11. package/Server/Infrastructure/Postgres/DataSourceOptions.ts +16 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.ts +123 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  14. package/Server/Services/AlertStateTimelineService.ts +20 -0
  15. package/Server/Services/CephClusterService.ts +26 -86
  16. package/Server/Services/CloudResourceService.ts +23 -83
  17. package/Server/Services/DatabaseService.ts +111 -0
  18. package/Server/Services/DockerHostService.ts +19 -79
  19. package/Server/Services/DockerSwarmClusterService.ts +27 -88
  20. package/Server/Services/HostService.ts +46 -99
  21. package/Server/Services/IncidentStateTimelineService.ts +20 -0
  22. package/Server/Services/Index.ts +2 -0
  23. package/Server/Services/IoTFleetService.ts +19 -79
  24. package/Server/Services/KubernetesClusterService.ts +17 -78
  25. package/Server/Services/LabelService.ts +57 -10
  26. package/Server/Services/MetricTypeService.ts +84 -0
  27. package/Server/Services/MonitorService.ts +89 -14
  28. package/Server/Services/MonitorStatusTimelineService.ts +29 -0
  29. package/Server/Services/MonitorTemplateService.ts +65 -0
  30. package/Server/Services/PodmanHostService.ts +19 -79
  31. package/Server/Services/ProxmoxClusterService.ts +23 -83
  32. package/Server/Services/RumApplicationService.ts +19 -80
  33. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +21 -0
  34. package/Server/Services/ServerlessFunctionService.ts +24 -85
  35. package/Server/Services/ServiceService.ts +299 -73
  36. package/Server/Services/StatusPageMonitorRuleEngineService.ts +752 -0
  37. package/Server/Services/StatusPageMonitorRuleService.ts +471 -0
  38. package/Server/Services/TelemetryEntityRelationshipService.ts +1 -0
  39. package/Server/Services/TelemetryEntityService.ts +1 -0
  40. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +170 -39
  41. package/Server/Utils/Monitor/MonitorResource.ts +63 -36
  42. package/Server/Utils/Monitor/MonitorStatusTimeline.ts +36 -0
  43. package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +148 -127
  44. package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +434 -0
  45. package/Server/Utils/SingleFlight.ts +83 -0
  46. package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +46 -0
  47. package/Server/Utils/Telemetry/EntityRegistry.ts +107 -26
  48. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +314 -0
  49. package/Server/Utils/Telemetry/Telemetry.ts +351 -122
  50. package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
  51. package/Tests/Models/DatabaseModels/ColumnTransformerInvariants.test.ts +306 -0
  52. package/Tests/Models/DatabaseModels/NumberColumnDeserialization.test.ts +333 -0
  53. package/Tests/Models/DatabaseModels/StatusPageMonitorRuleModel.test.ts +190 -0
  54. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +26 -0
  55. package/Tests/Server/Infrastructure/GlobalCache.test.ts +226 -0
  56. package/Tests/Server/Infrastructure/PostgresLockTimeoutOptions.test.ts +181 -0
  57. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlocked.test.ts +342 -0
  58. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +245 -0
  59. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +163 -15
  60. package/Tests/Server/Services/MetricTypeAttachServices.test.ts +222 -0
  61. package/Tests/Server/Services/MissingReferenceWriteGuard.test.ts +614 -0
  62. package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +23 -0
  63. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +305 -56
  64. package/Tests/Server/Services/ServiceUpdateLastSeenSplitGates.test.ts +705 -0
  65. package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +1719 -0
  66. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +1212 -0
  67. package/Tests/Server/Services/StatusPageMonitorRuleMonitorCreateHook.test.ts +228 -0
  68. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +267 -0
  69. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +260 -13
  70. package/Tests/Server/Utils/EntityRegistryRowFence.test.ts +302 -0
  71. package/Tests/Server/Utils/MetricTypeIndexConvergence.test.ts +598 -0
  72. package/Tests/Server/Utils/Monitor/MonitorStatusTimelineUnusableStatus.test.ts +154 -0
  73. package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +638 -92
  74. package/Tests/Server/Utils/Monitor/MonitorStepsReferenceExtractor.test.ts +724 -0
  75. package/Tests/Server/Utils/SingleFlight.test.ts +221 -0
  76. package/Tests/Types/Dashboard/NetworkDashboardTemplate.test.ts +793 -0
  77. package/Tests/Types/Database/BigIntColumnTransformer.test.ts +147 -0
  78. package/Tests/Types/Database/DatabasePropertyTransformer.test.ts +140 -0
  79. package/Tests/Types/Database/NumericColumnValue.test.ts +127 -0
  80. package/Tests/Types/Decimal.test.ts +37 -0
  81. package/Tests/Types/Monitor/SnmpVersionParsing.test.ts +152 -0
  82. package/Tests/Types/Port.test.ts +38 -0
  83. package/Tests/UI/Components/LogsHistogram.test.tsx +276 -0
  84. package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +489 -0
  85. package/Tests/UI/Components/UseLogsHistogram.test.tsx +500 -0
  86. package/Tests/Utils/Dashboard/Components/DashboardComponentsUtil.test.ts +120 -0
  87. package/Tests/Utils/Dashboard/DashboardNetworkMapComponent.test.ts +327 -0
  88. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  89. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  90. package/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.ts +40 -0
  91. package/Types/Dashboard/DashboardTemplates.ts +397 -0
  92. package/Types/Database/BigIntColumnTransformer.ts +74 -0
  93. package/Types/Database/DatabaseProperty.ts +26 -0
  94. package/Types/Database/NumericColumnValue.ts +128 -0
  95. package/Types/Decimal.ts +16 -4
  96. package/Types/Permission.ts +48 -0
  97. package/Types/Port.ts +16 -4
  98. package/UI/Components/LogsViewer/useLiveLogsRefresh.ts +86 -0
  99. package/UI/Components/LogsViewer/useLogsHistogram.ts +113 -0
  100. package/Utils/Dashboard/Components/DashboardNetworkMapComponent.ts +136 -0
  101. package/Utils/Dashboard/Components/Index.ts +7 -0
  102. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +12 -0
  103. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  104. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  105. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  106. package/build/dist/Models/DatabaseModels/LogDropFilter.js +9 -20
  107. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  108. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +925 -0
  109. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -0
  110. package/build/dist/Models/DatabaseModels/StatusPageResource.js +72 -0
  111. package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
  112. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +9 -20
  113. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  114. package/build/dist/Server/API/BaseAPI.js +11 -1
  115. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  116. package/build/dist/Server/API/DashboardAPI.js +39 -0
  117. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  118. package/build/dist/Server/EnvironmentConfig.js +27 -1
  119. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  120. package/build/dist/Server/Infrastructure/GlobalCache.js +91 -0
  121. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  122. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +5 -3
  123. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
  124. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js +48 -0
  125. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786005052769-AddStatusPageMonitorRule.js.map +1 -0
  126. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  127. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  128. package/build/dist/Server/Services/AlertStateTimelineService.js +19 -0
  129. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  130. package/build/dist/Server/Services/CephClusterService.js +26 -76
  131. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  132. package/build/dist/Server/Services/CloudResourceService.js +23 -73
  133. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  134. package/build/dist/Server/Services/DatabaseService.js +86 -0
  135. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  136. package/build/dist/Server/Services/DockerHostService.js +19 -69
  137. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  138. package/build/dist/Server/Services/DockerSwarmClusterService.js +27 -78
  139. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  140. package/build/dist/Server/Services/HostService.js +58 -102
  141. package/build/dist/Server/Services/HostService.js.map +1 -1
  142. package/build/dist/Server/Services/IncidentStateTimelineService.js +19 -0
  143. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  144. package/build/dist/Server/Services/Index.js +2 -0
  145. package/build/dist/Server/Services/Index.js.map +1 -1
  146. package/build/dist/Server/Services/IoTFleetService.js +19 -69
  147. package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
  148. package/build/dist/Server/Services/KubernetesClusterService.js +17 -68
  149. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  150. package/build/dist/Server/Services/LabelService.js +42 -7
  151. package/build/dist/Server/Services/LabelService.js.map +1 -1
  152. package/build/dist/Server/Services/MetricTypeService.js +74 -0
  153. package/build/dist/Server/Services/MetricTypeService.js.map +1 -1
  154. package/build/dist/Server/Services/MonitorService.js +81 -9
  155. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  156. package/build/dist/Server/Services/MonitorStatusTimelineService.js +28 -0
  157. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  158. package/build/dist/Server/Services/MonitorTemplateService.js +60 -0
  159. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  160. package/build/dist/Server/Services/PodmanHostService.js +19 -69
  161. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  162. package/build/dist/Server/Services/ProxmoxClusterService.js +23 -73
  163. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  164. package/build/dist/Server/Services/RumApplicationService.js +19 -70
  165. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  166. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +20 -0
  167. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  168. package/build/dist/Server/Services/ServerlessFunctionService.js +24 -75
  169. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  170. package/build/dist/Server/Services/ServiceService.js +236 -61
  171. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  172. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +603 -0
  173. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -0
  174. package/build/dist/Server/Services/StatusPageMonitorRuleService.js +401 -0
  175. package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -0
  176. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +1 -0
  177. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
  178. package/build/dist/Server/Services/TelemetryEntityService.js +1 -0
  179. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
  180. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +105 -29
  181. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
  182. package/build/dist/Server/Utils/Monitor/MonitorResource.js +56 -32
  183. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  184. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +30 -3
  185. package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
  186. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +110 -98
  187. package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
  188. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +312 -0
  189. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -0
  190. package/build/dist/Server/Utils/SingleFlight.js +76 -0
  191. package/build/dist/Server/Utils/SingleFlight.js.map +1 -0
  192. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +29 -0
  193. package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -0
  194. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +78 -19
  195. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  196. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +160 -0
  197. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -0
  198. package/build/dist/Server/Utils/Telemetry/Telemetry.js +279 -104
  199. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  200. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  201. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  202. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  203. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  204. package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js +2 -0
  205. package/build/dist/Types/Dashboard/DashboardComponents/DashboardNetworkMapComponent.js.map +1 -0
  206. package/build/dist/Types/Dashboard/DashboardTemplates.js +368 -0
  207. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  208. package/build/dist/Types/Database/BigIntColumnTransformer.js +66 -0
  209. package/build/dist/Types/Database/BigIntColumnTransformer.js.map +1 -0
  210. package/build/dist/Types/Database/DatabaseProperty.js +25 -0
  211. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  212. package/build/dist/Types/Database/NumericColumnValue.js +97 -0
  213. package/build/dist/Types/Database/NumericColumnValue.js.map +1 -0
  214. package/build/dist/Types/Decimal.js +14 -3
  215. package/build/dist/Types/Decimal.js.map +1 -1
  216. package/build/dist/Types/Permission.js +42 -0
  217. package/build/dist/Types/Permission.js.map +1 -1
  218. package/build/dist/Types/Port.js +15 -5
  219. package/build/dist/Types/Port.js.map +1 -1
  220. package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js +44 -0
  221. package/build/dist/UI/Components/LogsViewer/useLiveLogsRefresh.js.map +1 -0
  222. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +75 -0
  223. package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -0
  224. package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js +114 -0
  225. package/build/dist/Utils/Dashboard/Components/DashboardNetworkMapComponent.js.map +1 -0
  226. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  227. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  228. package/package.json +1 -1
@@ -0,0 +1,911 @@
1
+ import Label from "./Label";
2
+ import Project from "./Project";
3
+ import StatusPage from "./StatusPage";
4
+ import StatusPageGroup from "./StatusPageGroup";
5
+ import User from "./User";
6
+ import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
7
+ import Route from "../../Types/API/Route";
8
+ import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
9
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
10
+ import CanAccessIfCanReadOn from "../../Types/Database/CanAccessIfCanReadOn";
11
+ import ColumnLength from "../../Types/Database/ColumnLength";
12
+ import ColumnType from "../../Types/Database/ColumnType";
13
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
14
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
15
+ import EnableWorkflow from "../../Types/Database/EnableWorkflow";
16
+ import TableColumn from "../../Types/Database/TableColumn";
17
+ import TableColumnType from "../../Types/Database/TableColumnType";
18
+ import TableMetadata from "../../Types/Database/TableMetadata";
19
+ import TenantColumn from "../../Types/Database/TenantColumn";
20
+ import IconProp from "../../Types/Icon/IconProp";
21
+ import ObjectID from "../../Types/ObjectID";
22
+ import Permission from "../../Types/Permission";
23
+ import UptimePrecision from "../../Types/StatusPage/UptimePrecision";
24
+ import {
25
+ Column,
26
+ Entity,
27
+ Index,
28
+ JoinColumn,
29
+ JoinTable,
30
+ ManyToMany,
31
+ ManyToOne,
32
+ } from "typeorm";
33
+
34
+ @EnableDocumentation()
35
+ @CanAccessIfCanReadOn("statusPage")
36
+ @TenantColumn("projectId")
37
+ @TableAccessControl({
38
+ create: [
39
+ Permission.ProjectOwner,
40
+ Permission.ProjectAdmin,
41
+ Permission.ProjectMember,
42
+ Permission.StatusPageAdmin,
43
+ Permission.StatusPageMember,
44
+ Permission.CreateStatusPageMonitorRule,
45
+ ],
46
+ read: [
47
+ Permission.ProjectOwner,
48
+ Permission.ProjectAdmin,
49
+ Permission.ProjectMember,
50
+ Permission.Viewer,
51
+ Permission.StatusPageAdmin,
52
+ Permission.StatusPageMember,
53
+ Permission.StatusPageViewer,
54
+ Permission.ReadStatusPageMonitorRule,
55
+ ],
56
+ delete: [
57
+ Permission.ProjectOwner,
58
+ Permission.ProjectAdmin,
59
+ Permission.ProjectMember,
60
+ Permission.StatusPageAdmin,
61
+ Permission.StatusPageMember,
62
+ Permission.DeleteStatusPageMonitorRule,
63
+ ],
64
+ update: [
65
+ Permission.ProjectOwner,
66
+ Permission.ProjectAdmin,
67
+ Permission.ProjectMember,
68
+ Permission.StatusPageAdmin,
69
+ Permission.StatusPageMember,
70
+ Permission.EditStatusPageMonitorRule,
71
+ ],
72
+ })
73
+ @CrudApiEndpoint(new Route("/status-page-monitor-rule"))
74
+ @Entity({
75
+ name: "StatusPageMonitorRule",
76
+ })
77
+ @EnableWorkflow({
78
+ create: true,
79
+ delete: true,
80
+ update: true,
81
+ read: true,
82
+ })
83
+ @TableMetadata({
84
+ tableName: "StatusPageMonitorRule",
85
+ singularName: "Status Page Monitor Rule",
86
+ pluralName: "Status Page Monitor Rules",
87
+ icon: IconProp.Filter,
88
+ tableDescription:
89
+ "Configure rules that automatically add matching monitors to a status page group, instead of picking every monitor by hand",
90
+ })
91
+ export default class StatusPageMonitorRule extends BaseModel {
92
+ @ColumnAccessControl({
93
+ create: [
94
+ Permission.ProjectOwner,
95
+ Permission.ProjectAdmin,
96
+ Permission.ProjectMember,
97
+ Permission.StatusPageAdmin,
98
+ Permission.StatusPageMember,
99
+ Permission.CreateStatusPageMonitorRule,
100
+ ],
101
+ read: [
102
+ Permission.ProjectOwner,
103
+ Permission.ProjectAdmin,
104
+ Permission.ProjectMember,
105
+ Permission.Viewer,
106
+ Permission.StatusPageAdmin,
107
+ Permission.StatusPageMember,
108
+ Permission.StatusPageViewer,
109
+ Permission.ReadStatusPageMonitorRule,
110
+ ],
111
+ update: [],
112
+ })
113
+ @TableColumn({
114
+ manyToOneRelationColumn: "projectId",
115
+ type: TableColumnType.Entity,
116
+ modelType: Project,
117
+ title: "Project",
118
+ description: "Relation to Project Resource in which this object belongs",
119
+ })
120
+ @ManyToOne(
121
+ () => {
122
+ return Project;
123
+ },
124
+ {
125
+ eager: false,
126
+ nullable: true,
127
+ onDelete: "CASCADE",
128
+ orphanedRowAction: "nullify",
129
+ },
130
+ )
131
+ @JoinColumn({ name: "projectId" })
132
+ public project?: Project = undefined;
133
+
134
+ @ColumnAccessControl({
135
+ create: [
136
+ Permission.ProjectOwner,
137
+ Permission.ProjectAdmin,
138
+ Permission.ProjectMember,
139
+ Permission.StatusPageAdmin,
140
+ Permission.StatusPageMember,
141
+ Permission.CreateStatusPageMonitorRule,
142
+ ],
143
+ read: [
144
+ Permission.ProjectOwner,
145
+ Permission.ProjectAdmin,
146
+ Permission.ProjectMember,
147
+ Permission.Viewer,
148
+ Permission.StatusPageAdmin,
149
+ Permission.StatusPageMember,
150
+ Permission.StatusPageViewer,
151
+ Permission.ReadStatusPageMonitorRule,
152
+ ],
153
+ update: [],
154
+ })
155
+ @Index()
156
+ @TableColumn({
157
+ type: TableColumnType.ObjectID,
158
+ required: true,
159
+ canReadOnRelationQuery: true,
160
+ title: "Project ID",
161
+ description: "ID of your OneUptime Project in which this object belongs",
162
+ })
163
+ @Column({
164
+ type: ColumnType.ObjectID,
165
+ nullable: false,
166
+ transformer: ObjectID.getDatabaseTransformer(),
167
+ })
168
+ public projectId?: ObjectID = undefined;
169
+
170
+ @ColumnAccessControl({
171
+ create: [
172
+ Permission.ProjectOwner,
173
+ Permission.ProjectAdmin,
174
+ Permission.ProjectMember,
175
+ Permission.StatusPageAdmin,
176
+ Permission.StatusPageMember,
177
+ Permission.CreateStatusPageMonitorRule,
178
+ ],
179
+ read: [
180
+ Permission.ProjectOwner,
181
+ Permission.ProjectAdmin,
182
+ Permission.ProjectMember,
183
+ Permission.Viewer,
184
+ Permission.StatusPageAdmin,
185
+ Permission.StatusPageMember,
186
+ Permission.StatusPageViewer,
187
+ Permission.ReadStatusPageMonitorRule,
188
+ ],
189
+ update: [],
190
+ })
191
+ @TableColumn({
192
+ manyToOneRelationColumn: "statusPageId",
193
+ type: TableColumnType.Entity,
194
+ modelType: StatusPage,
195
+ title: "Status Page",
196
+ description: "Status page this rule adds matching monitors to",
197
+ })
198
+ @ManyToOne(
199
+ () => {
200
+ return StatusPage;
201
+ },
202
+ {
203
+ eager: false,
204
+ nullable: true,
205
+ onDelete: "CASCADE",
206
+ orphanedRowAction: "nullify",
207
+ },
208
+ )
209
+ @JoinColumn({ name: "statusPageId" })
210
+ public statusPage?: StatusPage = undefined;
211
+
212
+ @ColumnAccessControl({
213
+ create: [
214
+ Permission.ProjectOwner,
215
+ Permission.ProjectAdmin,
216
+ Permission.ProjectMember,
217
+ Permission.StatusPageAdmin,
218
+ Permission.StatusPageMember,
219
+ Permission.CreateStatusPageMonitorRule,
220
+ ],
221
+ read: [
222
+ Permission.ProjectOwner,
223
+ Permission.ProjectAdmin,
224
+ Permission.ProjectMember,
225
+ Permission.Viewer,
226
+ Permission.StatusPageAdmin,
227
+ Permission.StatusPageMember,
228
+ Permission.StatusPageViewer,
229
+ Permission.ReadStatusPageMonitorRule,
230
+ ],
231
+ update: [],
232
+ })
233
+ @Index()
234
+ @TableColumn({
235
+ type: TableColumnType.ObjectID,
236
+ required: true,
237
+ canReadOnRelationQuery: true,
238
+ title: "Status Page ID",
239
+ description: "ID of the status page this rule adds matching monitors to",
240
+ example: "a1b2c3d4-e5f6-4789-abcd-ef0123456789",
241
+ })
242
+ @Column({
243
+ type: ColumnType.ObjectID,
244
+ nullable: false,
245
+ transformer: ObjectID.getDatabaseTransformer(),
246
+ })
247
+ public statusPageId?: ObjectID = undefined;
248
+
249
+ @ColumnAccessControl({
250
+ create: [
251
+ Permission.ProjectOwner,
252
+ Permission.ProjectAdmin,
253
+ Permission.ProjectMember,
254
+ Permission.StatusPageAdmin,
255
+ Permission.StatusPageMember,
256
+ Permission.CreateStatusPageMonitorRule,
257
+ ],
258
+ read: [
259
+ Permission.ProjectOwner,
260
+ Permission.ProjectAdmin,
261
+ Permission.ProjectMember,
262
+ Permission.Viewer,
263
+ Permission.StatusPageAdmin,
264
+ Permission.StatusPageMember,
265
+ Permission.StatusPageViewer,
266
+ Permission.ReadStatusPageMonitorRule,
267
+ ],
268
+ update: [
269
+ Permission.ProjectOwner,
270
+ Permission.ProjectAdmin,
271
+ Permission.ProjectMember,
272
+ Permission.StatusPageAdmin,
273
+ Permission.StatusPageMember,
274
+ Permission.EditStatusPageMonitorRule,
275
+ ],
276
+ })
277
+ @Index()
278
+ @TableColumn({
279
+ required: true,
280
+ type: TableColumnType.ShortText,
281
+ canReadOnRelationQuery: true,
282
+ title: "Name",
283
+ description: "Name of this status page monitor rule",
284
+ })
285
+ @Column({
286
+ nullable: false,
287
+ type: ColumnType.ShortText,
288
+ length: ColumnLength.ShortText,
289
+ })
290
+ public name?: string = undefined;
291
+
292
+ @ColumnAccessControl({
293
+ create: [
294
+ Permission.ProjectOwner,
295
+ Permission.ProjectAdmin,
296
+ Permission.ProjectMember,
297
+ Permission.StatusPageAdmin,
298
+ Permission.StatusPageMember,
299
+ Permission.CreateStatusPageMonitorRule,
300
+ ],
301
+ read: [
302
+ Permission.ProjectOwner,
303
+ Permission.ProjectAdmin,
304
+ Permission.ProjectMember,
305
+ Permission.Viewer,
306
+ Permission.StatusPageAdmin,
307
+ Permission.StatusPageMember,
308
+ Permission.StatusPageViewer,
309
+ Permission.ReadStatusPageMonitorRule,
310
+ ],
311
+ update: [
312
+ Permission.ProjectOwner,
313
+ Permission.ProjectAdmin,
314
+ Permission.ProjectMember,
315
+ Permission.StatusPageAdmin,
316
+ Permission.StatusPageMember,
317
+ Permission.EditStatusPageMonitorRule,
318
+ ],
319
+ })
320
+ @TableColumn({
321
+ required: false,
322
+ type: TableColumnType.LongText,
323
+ title: "Description",
324
+ description: "Description of this status page monitor rule",
325
+ })
326
+ @Column({
327
+ nullable: true,
328
+ type: ColumnType.LongText,
329
+ length: ColumnLength.LongText,
330
+ })
331
+ public description?: string = undefined;
332
+
333
+ @ColumnAccessControl({
334
+ create: [
335
+ Permission.ProjectOwner,
336
+ Permission.ProjectAdmin,
337
+ Permission.ProjectMember,
338
+ Permission.StatusPageAdmin,
339
+ Permission.StatusPageMember,
340
+ Permission.CreateStatusPageMonitorRule,
341
+ ],
342
+ read: [
343
+ Permission.ProjectOwner,
344
+ Permission.ProjectAdmin,
345
+ Permission.ProjectMember,
346
+ Permission.Viewer,
347
+ Permission.StatusPageAdmin,
348
+ Permission.StatusPageMember,
349
+ Permission.StatusPageViewer,
350
+ Permission.ReadStatusPageMonitorRule,
351
+ ],
352
+ update: [
353
+ Permission.ProjectOwner,
354
+ Permission.ProjectAdmin,
355
+ Permission.ProjectMember,
356
+ Permission.StatusPageAdmin,
357
+ Permission.StatusPageMember,
358
+ Permission.EditStatusPageMonitorRule,
359
+ ],
360
+ })
361
+ @Index()
362
+ @TableColumn({
363
+ required: true,
364
+ type: TableColumnType.Boolean,
365
+ title: "Is Enabled",
366
+ description:
367
+ "Whether this rule is enabled. A disabled rule removes the monitors it had added.",
368
+ defaultValue: true,
369
+ isDefaultValueColumn: true,
370
+ })
371
+ @Column({
372
+ type: ColumnType.Boolean,
373
+ nullable: false,
374
+ default: true,
375
+ })
376
+ public isEnabled?: boolean = undefined;
377
+
378
+ // Match Criteria
379
+
380
+ @ColumnAccessControl({
381
+ create: [
382
+ Permission.ProjectOwner,
383
+ Permission.ProjectAdmin,
384
+ Permission.ProjectMember,
385
+ Permission.StatusPageAdmin,
386
+ Permission.StatusPageMember,
387
+ Permission.CreateStatusPageMonitorRule,
388
+ ],
389
+ read: [
390
+ Permission.ProjectOwner,
391
+ Permission.ProjectAdmin,
392
+ Permission.ProjectMember,
393
+ Permission.Viewer,
394
+ Permission.StatusPageAdmin,
395
+ Permission.StatusPageMember,
396
+ Permission.StatusPageViewer,
397
+ Permission.ReadStatusPageMonitorRule,
398
+ ],
399
+ update: [
400
+ Permission.ProjectOwner,
401
+ Permission.ProjectAdmin,
402
+ Permission.ProjectMember,
403
+ Permission.StatusPageAdmin,
404
+ Permission.StatusPageMember,
405
+ Permission.EditStatusPageMonitorRule,
406
+ ],
407
+ })
408
+ @TableColumn({
409
+ required: false,
410
+ type: TableColumnType.EntityArray,
411
+ modelType: Label,
412
+ title: "Monitor Labels",
413
+ description:
414
+ "Only match monitors that carry at least one of these labels. Leave empty to skip the label filter.",
415
+ })
416
+ @ManyToMany(
417
+ () => {
418
+ return Label;
419
+ },
420
+ { eager: false },
421
+ )
422
+ @JoinTable({
423
+ name: "StatusPageMonitorRuleMonitorLabel",
424
+ inverseJoinColumn: {
425
+ name: "labelId",
426
+ referencedColumnName: "_id",
427
+ },
428
+ joinColumn: {
429
+ name: "statusPageMonitorRuleId",
430
+ referencedColumnName: "_id",
431
+ },
432
+ })
433
+ public monitorLabels?: Array<Label> = undefined;
434
+
435
+ @ColumnAccessControl({
436
+ create: [
437
+ Permission.ProjectOwner,
438
+ Permission.ProjectAdmin,
439
+ Permission.ProjectMember,
440
+ Permission.StatusPageAdmin,
441
+ Permission.StatusPageMember,
442
+ Permission.CreateStatusPageMonitorRule,
443
+ ],
444
+ read: [
445
+ Permission.ProjectOwner,
446
+ Permission.ProjectAdmin,
447
+ Permission.ProjectMember,
448
+ Permission.Viewer,
449
+ Permission.StatusPageAdmin,
450
+ Permission.StatusPageMember,
451
+ Permission.StatusPageViewer,
452
+ Permission.ReadStatusPageMonitorRule,
453
+ ],
454
+ update: [
455
+ Permission.ProjectOwner,
456
+ Permission.ProjectAdmin,
457
+ Permission.ProjectMember,
458
+ Permission.StatusPageAdmin,
459
+ Permission.StatusPageMember,
460
+ Permission.EditStatusPageMonitorRule,
461
+ ],
462
+ })
463
+ @TableColumn({
464
+ required: false,
465
+ type: TableColumnType.LongText,
466
+ title: "Monitor Name Pattern",
467
+ description:
468
+ "Regex (case-insensitive) matched against the monitor name. Leave empty to skip the name filter. Use .* to match every monitor.",
469
+ })
470
+ @Column({
471
+ type: ColumnType.LongText,
472
+ nullable: true,
473
+ length: ColumnLength.LongText,
474
+ })
475
+ public monitorNamePattern?: string = undefined;
476
+
477
+ @ColumnAccessControl({
478
+ create: [
479
+ Permission.ProjectOwner,
480
+ Permission.ProjectAdmin,
481
+ Permission.ProjectMember,
482
+ Permission.StatusPageAdmin,
483
+ Permission.StatusPageMember,
484
+ Permission.CreateStatusPageMonitorRule,
485
+ ],
486
+ read: [
487
+ Permission.ProjectOwner,
488
+ Permission.ProjectAdmin,
489
+ Permission.ProjectMember,
490
+ Permission.Viewer,
491
+ Permission.StatusPageAdmin,
492
+ Permission.StatusPageMember,
493
+ Permission.StatusPageViewer,
494
+ Permission.ReadStatusPageMonitorRule,
495
+ ],
496
+ update: [
497
+ Permission.ProjectOwner,
498
+ Permission.ProjectAdmin,
499
+ Permission.ProjectMember,
500
+ Permission.StatusPageAdmin,
501
+ Permission.StatusPageMember,
502
+ Permission.EditStatusPageMonitorRule,
503
+ ],
504
+ })
505
+ @TableColumn({
506
+ required: false,
507
+ type: TableColumnType.LongText,
508
+ title: "Monitor Description Pattern",
509
+ description:
510
+ "Regex (case-insensitive) matched against the monitor description. Leave empty to skip the description filter.",
511
+ })
512
+ @Column({
513
+ type: ColumnType.LongText,
514
+ nullable: true,
515
+ length: ColumnLength.LongText,
516
+ })
517
+ public monitorDescriptionPattern?: string = undefined;
518
+
519
+ // Action: where matched monitors land, and how they are rendered.
520
+
521
+ @ColumnAccessControl({
522
+ create: [
523
+ Permission.ProjectOwner,
524
+ Permission.ProjectAdmin,
525
+ Permission.ProjectMember,
526
+ Permission.StatusPageAdmin,
527
+ Permission.StatusPageMember,
528
+ Permission.CreateStatusPageMonitorRule,
529
+ ],
530
+ read: [
531
+ Permission.ProjectOwner,
532
+ Permission.ProjectAdmin,
533
+ Permission.ProjectMember,
534
+ Permission.Viewer,
535
+ Permission.StatusPageAdmin,
536
+ Permission.StatusPageMember,
537
+ Permission.StatusPageViewer,
538
+ Permission.ReadStatusPageMonitorRule,
539
+ ],
540
+ update: [
541
+ Permission.ProjectOwner,
542
+ Permission.ProjectAdmin,
543
+ Permission.ProjectMember,
544
+ Permission.StatusPageAdmin,
545
+ Permission.StatusPageMember,
546
+ Permission.EditStatusPageMonitorRule,
547
+ ],
548
+ })
549
+ @TableColumn({
550
+ manyToOneRelationColumn: "statusPageGroupId",
551
+ type: TableColumnType.Entity,
552
+ modelType: StatusPageGroup,
553
+ title: "Status Page Group",
554
+ description:
555
+ "Group that matched monitors are added to. Leave empty to add them ungrouped.",
556
+ })
557
+ /*
558
+ * CASCADE, matching StatusPageResource.statusPageGroup: deleting a group
559
+ * takes the rules that target it with it. SET NULL would leave the rule
560
+ * alive and pointing nowhere, and its next run would re-publish the same
561
+ * monitors as UNGROUPED on a public page - a louder failure than losing a
562
+ * rule whose destination the user just deleted. The Groups page says so.
563
+ */
564
+ @ManyToOne(
565
+ () => {
566
+ return StatusPageGroup;
567
+ },
568
+ {
569
+ eager: false,
570
+ nullable: true,
571
+ onDelete: "CASCADE",
572
+ orphanedRowAction: "nullify",
573
+ },
574
+ )
575
+ @JoinColumn({ name: "statusPageGroupId" })
576
+ public statusPageGroup?: StatusPageGroup = undefined;
577
+
578
+ @ColumnAccessControl({
579
+ create: [
580
+ Permission.ProjectOwner,
581
+ Permission.ProjectAdmin,
582
+ Permission.ProjectMember,
583
+ Permission.StatusPageAdmin,
584
+ Permission.StatusPageMember,
585
+ Permission.CreateStatusPageMonitorRule,
586
+ ],
587
+ read: [
588
+ Permission.ProjectOwner,
589
+ Permission.ProjectAdmin,
590
+ Permission.ProjectMember,
591
+ Permission.Viewer,
592
+ Permission.StatusPageAdmin,
593
+ Permission.StatusPageMember,
594
+ Permission.StatusPageViewer,
595
+ Permission.ReadStatusPageMonitorRule,
596
+ ],
597
+ update: [
598
+ Permission.ProjectOwner,
599
+ Permission.ProjectAdmin,
600
+ Permission.ProjectMember,
601
+ Permission.StatusPageAdmin,
602
+ Permission.StatusPageMember,
603
+ Permission.EditStatusPageMonitorRule,
604
+ ],
605
+ })
606
+ @Index()
607
+ @TableColumn({
608
+ type: TableColumnType.ObjectID,
609
+ required: false,
610
+ title: "Status Page Group ID",
611
+ description:
612
+ "ID of the group that matched monitors are added to. Empty means ungrouped.",
613
+ example: "c9d0e1f2-a3b4-5678-9abc-def012345678",
614
+ })
615
+ @Column({
616
+ type: ColumnType.ObjectID,
617
+ nullable: true,
618
+ transformer: ObjectID.getDatabaseTransformer(),
619
+ })
620
+ public statusPageGroupId?: ObjectID = undefined;
621
+
622
+ @ColumnAccessControl({
623
+ create: [
624
+ Permission.ProjectOwner,
625
+ Permission.ProjectAdmin,
626
+ Permission.ProjectMember,
627
+ Permission.StatusPageAdmin,
628
+ Permission.StatusPageMember,
629
+ Permission.CreateStatusPageMonitorRule,
630
+ ],
631
+ read: [
632
+ Permission.ProjectOwner,
633
+ Permission.ProjectAdmin,
634
+ Permission.ProjectMember,
635
+ Permission.Viewer,
636
+ Permission.StatusPageAdmin,
637
+ Permission.StatusPageMember,
638
+ Permission.StatusPageViewer,
639
+ Permission.ReadStatusPageMonitorRule,
640
+ ],
641
+ update: [
642
+ Permission.ProjectOwner,
643
+ Permission.ProjectAdmin,
644
+ Permission.ProjectMember,
645
+ Permission.StatusPageAdmin,
646
+ Permission.StatusPageMember,
647
+ Permission.EditStatusPageMonitorRule,
648
+ ],
649
+ })
650
+ @TableColumn({
651
+ isDefaultValueColumn: true,
652
+ type: TableColumnType.Boolean,
653
+ title: "Show current status",
654
+ description:
655
+ "Show current status like offline, operational or degraded on the resources this rule adds.",
656
+ defaultValue: true,
657
+ })
658
+ @Column({
659
+ type: ColumnType.Boolean,
660
+ default: true,
661
+ })
662
+ public showCurrentStatus?: boolean = undefined;
663
+
664
+ @ColumnAccessControl({
665
+ create: [
666
+ Permission.ProjectOwner,
667
+ Permission.ProjectAdmin,
668
+ Permission.ProjectMember,
669
+ Permission.StatusPageAdmin,
670
+ Permission.StatusPageMember,
671
+ Permission.CreateStatusPageMonitorRule,
672
+ ],
673
+ read: [
674
+ Permission.ProjectOwner,
675
+ Permission.ProjectAdmin,
676
+ Permission.ProjectMember,
677
+ Permission.Viewer,
678
+ Permission.StatusPageAdmin,
679
+ Permission.StatusPageMember,
680
+ Permission.StatusPageViewer,
681
+ Permission.ReadStatusPageMonitorRule,
682
+ ],
683
+ update: [
684
+ Permission.ProjectOwner,
685
+ Permission.ProjectAdmin,
686
+ Permission.ProjectMember,
687
+ Permission.StatusPageAdmin,
688
+ Permission.StatusPageMember,
689
+ Permission.EditStatusPageMonitorRule,
690
+ ],
691
+ })
692
+ @TableColumn({
693
+ isDefaultValueColumn: true,
694
+ type: TableColumnType.Boolean,
695
+ title: "Show uptime percent",
696
+ description:
697
+ "Show uptime percent on the resources this rule adds to the status page.",
698
+ defaultValue: true,
699
+ })
700
+ @Column({
701
+ type: ColumnType.Boolean,
702
+ default: true,
703
+ })
704
+ public showUptimePercent?: boolean = undefined;
705
+
706
+ @ColumnAccessControl({
707
+ create: [
708
+ Permission.ProjectOwner,
709
+ Permission.ProjectAdmin,
710
+ Permission.ProjectMember,
711
+ Permission.StatusPageAdmin,
712
+ Permission.StatusPageMember,
713
+ Permission.CreateStatusPageMonitorRule,
714
+ ],
715
+ read: [
716
+ Permission.ProjectOwner,
717
+ Permission.ProjectAdmin,
718
+ Permission.ProjectMember,
719
+ Permission.Viewer,
720
+ Permission.StatusPageAdmin,
721
+ Permission.StatusPageMember,
722
+ Permission.StatusPageViewer,
723
+ Permission.ReadStatusPageMonitorRule,
724
+ ],
725
+ update: [
726
+ Permission.ProjectOwner,
727
+ Permission.ProjectAdmin,
728
+ Permission.ProjectMember,
729
+ Permission.StatusPageAdmin,
730
+ Permission.StatusPageMember,
731
+ Permission.EditStatusPageMonitorRule,
732
+ ],
733
+ })
734
+ @TableColumn({
735
+ type: TableColumnType.ShortText,
736
+ title: "Uptime Percent Precision",
737
+ required: false,
738
+ description:
739
+ "Precision of the uptime percent shown on the resources this rule adds",
740
+ })
741
+ @Column({
742
+ type: ColumnType.ShortText,
743
+ nullable: true,
744
+ })
745
+ public uptimePercentPrecision?: UptimePrecision = undefined;
746
+
747
+ @ColumnAccessControl({
748
+ create: [
749
+ Permission.ProjectOwner,
750
+ Permission.ProjectAdmin,
751
+ Permission.ProjectMember,
752
+ Permission.StatusPageAdmin,
753
+ Permission.StatusPageMember,
754
+ Permission.CreateStatusPageMonitorRule,
755
+ ],
756
+ read: [
757
+ Permission.ProjectOwner,
758
+ Permission.ProjectAdmin,
759
+ Permission.ProjectMember,
760
+ Permission.Viewer,
761
+ Permission.StatusPageAdmin,
762
+ Permission.StatusPageMember,
763
+ Permission.StatusPageViewer,
764
+ Permission.ReadStatusPageMonitorRule,
765
+ ],
766
+ update: [
767
+ Permission.ProjectOwner,
768
+ Permission.ProjectAdmin,
769
+ Permission.ProjectMember,
770
+ Permission.StatusPageAdmin,
771
+ Permission.StatusPageMember,
772
+ Permission.EditStatusPageMonitorRule,
773
+ ],
774
+ })
775
+ @TableColumn({
776
+ isDefaultValueColumn: true,
777
+ type: TableColumnType.Boolean,
778
+ title: "Show History Chart",
779
+ description:
780
+ "Show a 90 day uptime history on the resources this rule adds to the status page.",
781
+ defaultValue: true,
782
+ })
783
+ @Column({
784
+ type: ColumnType.Boolean,
785
+ default: true,
786
+ })
787
+ public showStatusHistoryChart?: boolean = undefined;
788
+
789
+ @ColumnAccessControl({
790
+ create: [
791
+ Permission.ProjectOwner,
792
+ Permission.ProjectAdmin,
793
+ Permission.ProjectMember,
794
+ Permission.StatusPageAdmin,
795
+ Permission.StatusPageMember,
796
+ Permission.CreateStatusPageMonitorRule,
797
+ ],
798
+ read: [
799
+ Permission.ProjectOwner,
800
+ Permission.ProjectAdmin,
801
+ Permission.ProjectMember,
802
+ Permission.Viewer,
803
+ Permission.StatusPageAdmin,
804
+ Permission.StatusPageMember,
805
+ Permission.StatusPageViewer,
806
+ Permission.ReadStatusPageMonitorRule,
807
+ ],
808
+ update: [],
809
+ })
810
+ @TableColumn({
811
+ manyToOneRelationColumn: "createdByUserId",
812
+ type: TableColumnType.Entity,
813
+ modelType: User,
814
+ title: "Created by User",
815
+ description:
816
+ "Relation to User who created this object (if this object was created by a User)",
817
+ })
818
+ @ManyToOne(
819
+ () => {
820
+ return User;
821
+ },
822
+ {
823
+ eager: false,
824
+ nullable: true,
825
+ onDelete: "SET NULL",
826
+ orphanedRowAction: "nullify",
827
+ },
828
+ )
829
+ @JoinColumn({ name: "createdByUserId" })
830
+ public createdByUser?: User = undefined;
831
+
832
+ @ColumnAccessControl({
833
+ create: [
834
+ Permission.ProjectOwner,
835
+ Permission.ProjectAdmin,
836
+ Permission.ProjectMember,
837
+ Permission.StatusPageAdmin,
838
+ Permission.StatusPageMember,
839
+ Permission.CreateStatusPageMonitorRule,
840
+ ],
841
+ read: [
842
+ Permission.ProjectOwner,
843
+ Permission.ProjectAdmin,
844
+ Permission.ProjectMember,
845
+ Permission.Viewer,
846
+ Permission.StatusPageAdmin,
847
+ Permission.StatusPageMember,
848
+ Permission.StatusPageViewer,
849
+ Permission.ReadStatusPageMonitorRule,
850
+ ],
851
+ update: [],
852
+ })
853
+ @TableColumn({
854
+ type: TableColumnType.ObjectID,
855
+ title: "Created by User ID",
856
+ description:
857
+ "User ID who created this object (if this object was created by a User)",
858
+ })
859
+ @Column({
860
+ type: ColumnType.ObjectID,
861
+ nullable: true,
862
+ transformer: ObjectID.getDatabaseTransformer(),
863
+ })
864
+ public createdByUserId?: ObjectID = undefined;
865
+
866
+ @ColumnAccessControl({
867
+ create: [],
868
+ read: [],
869
+ update: [],
870
+ })
871
+ @TableColumn({
872
+ manyToOneRelationColumn: "deletedByUserId",
873
+ type: TableColumnType.Entity,
874
+ title: "Deleted by User",
875
+ modelType: User,
876
+ description:
877
+ "Relation to User who deleted this object (if this object was deleted by a User)",
878
+ })
879
+ @ManyToOne(
880
+ () => {
881
+ return User;
882
+ },
883
+ {
884
+ cascade: false,
885
+ eager: false,
886
+ nullable: true,
887
+ onDelete: "SET NULL",
888
+ orphanedRowAction: "nullify",
889
+ },
890
+ )
891
+ @JoinColumn({ name: "deletedByUserId" })
892
+ public deletedByUser?: User = undefined;
893
+
894
+ @ColumnAccessControl({
895
+ create: [],
896
+ read: [],
897
+ update: [],
898
+ })
899
+ @TableColumn({
900
+ type: TableColumnType.ObjectID,
901
+ title: "Deleted by User ID",
902
+ description:
903
+ "User ID who deleted this object (if this object was deleted by a User)",
904
+ })
905
+ @Column({
906
+ type: ColumnType.ObjectID,
907
+ nullable: true,
908
+ transformer: ObjectID.getDatabaseTransformer(),
909
+ })
910
+ public deletedByUserId?: ObjectID = undefined;
911
+ }