@oneuptime/common 11.7.3 → 11.7.4

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 (365) hide show
  1. package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
  2. package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
  3. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  4. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  5. package/Models/DatabaseModels/Index.ts +5 -0
  6. package/Models/DatabaseModels/LogDropFilter.ts +89 -0
  7. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
  8. package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
  9. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  10. package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
  11. package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
  12. package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
  13. package/Server/API/AlertAPI.ts +32 -17
  14. package/Server/API/BaseAPI.ts +31 -2
  15. package/Server/API/BaseAnalyticsAPI.ts +36 -2
  16. package/Server/API/CommonAPI.ts +57 -0
  17. package/Server/API/IncidentAPI.ts +60 -33
  18. package/Server/API/IncidentEpisodeAPI.ts +31 -16
  19. package/Server/API/MonitorAPI.ts +30 -0
  20. package/Server/API/MonitorTemplateAPI.ts +8 -0
  21. package/Server/API/ProbeAPI.ts +196 -15
  22. package/Server/API/ProjectAPI.ts +79 -1
  23. package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
  24. package/Server/API/StatusPageAPI.ts +74 -37
  25. package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  31. package/Server/Services/AlertEpisodeService.ts +47 -0
  32. package/Server/Services/AlertService.ts +125 -0
  33. package/Server/Services/BillingService.ts +98 -0
  34. package/Server/Services/DatabaseService.ts +184 -20
  35. package/Server/Services/IncidentEpisodeService.ts +47 -0
  36. package/Server/Services/IncidentService.ts +123 -0
  37. package/Server/Services/IncidentTemplateService.ts +123 -1
  38. package/Server/Services/Index.ts +2 -0
  39. package/Server/Services/LogDropFilterService.ts +133 -0
  40. package/Server/Services/MonitorProbeService.ts +94 -4
  41. package/Server/Services/MonitorService.ts +48 -43
  42. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
  43. package/Server/Services/ProbeService.ts +66 -0
  44. package/Server/Services/ProjectService.ts +131 -7
  45. package/Server/Services/RecommendationDismissalService.ts +52 -0
  46. package/Server/Services/RunbookAgentJobService.ts +68 -7
  47. package/Server/Services/ScheduledMaintenanceService.ts +103 -0
  48. package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
  49. package/Server/Services/StatusPageGroupService.ts +186 -0
  50. package/Server/Services/TraceDropFilterService.ts +133 -0
  51. package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
  52. package/Server/Types/Workflow/Components/API/Get.ts +12 -0
  53. package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
  54. package/Server/Types/Workflow/Components/API/Post.ts +12 -0
  55. package/Server/Types/Workflow/Components/API/Put.ts +13 -0
  56. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
  57. package/Server/Utils/DropFilterValidation.ts +127 -0
  58. package/Server/Utils/Errors.ts +5 -0
  59. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  60. package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
  61. package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
  62. package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
  63. package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
  64. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
  65. package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
  66. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
  67. package/Tests/Server/API/ProbeAPI.test.ts +422 -53
  68. package/Tests/Server/API/ProjectAPI.test.ts +180 -0
  69. package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
  70. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
  71. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
  72. package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
  73. package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
  74. package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
  75. package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
  76. package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
  77. package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
  78. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
  79. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
  80. package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
  81. package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
  82. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
  83. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
  84. package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
  85. package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
  86. package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
  87. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
  88. package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
  89. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
  90. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
  91. package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
  92. package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
  93. package/Tests/Types/DateUserTimezone.test.ts +52 -0
  94. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
  95. package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
  96. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
  97. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
  98. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
  99. package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
  100. package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
  101. package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
  102. package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
  103. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
  104. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
  105. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
  106. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
  107. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
  108. package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
  109. package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
  110. package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
  111. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
  112. package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
  113. package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
  114. package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
  115. package/Tests/UI/Components/InfoCard.test.tsx +358 -0
  116. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
  117. package/Tests/UI/Components/Modal.test.tsx +43 -5
  118. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
  119. package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +427 -0
  120. package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
  121. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
  122. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
  123. package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
  124. package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
  125. package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
  126. package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
  127. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
  128. package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
  129. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
  130. package/Types/Date.ts +15 -6
  131. package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
  132. package/Types/Monitor/MonitorStep.ts +10 -1
  133. package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
  134. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
  135. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
  136. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
  137. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
  138. package/Types/Permission.ts +45 -0
  139. package/Types/Recommendation/RecommendationType.ts +20 -0
  140. package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
  141. package/Types/Runbook/RunbookStepTimeout.ts +202 -0
  142. package/Types/Telemetry/DropFilterSampling.ts +92 -0
  143. package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
  144. package/UI/Components/Accordion/Accordion.tsx +10 -2
  145. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
  146. package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
  147. package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
  148. package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
  149. package/UI/Components/Error/PageError.tsx +0 -4
  150. package/UI/Components/ErrorBoundary.tsx +252 -15
  151. package/UI/Components/InfoCard/InfoCard.tsx +58 -1
  152. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
  153. package/UI/Components/Modal/Modal.tsx +16 -60
  154. package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
  155. package/UI/Components/ModelTable/BaseModelTable.tsx +116 -67
  156. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +150 -47
  157. package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
  158. package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
  159. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
  160. package/UI/Utils/DropdownAlignment.ts +162 -0
  161. package/UI/Utils/TableFilterUrlState.ts +59 -20
  162. package/Utils/API.ts +106 -2
  163. package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
  164. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
  165. package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
  166. package/Utils/StatusPage/GroupTree.ts +307 -0
  167. package/Utils/StatusPage/ResourceUptime.ts +90 -17
  168. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
  169. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
  170. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
  171. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  172. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  173. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  174. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  175. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  176. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  177. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
  179. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
  181. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
  183. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
  184. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  185. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
  187. package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
  188. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
  189. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
  191. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  192. package/build/dist/Server/API/AlertAPI.js +22 -13
  193. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  194. package/build/dist/Server/API/BaseAPI.js +22 -1
  195. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  196. package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
  197. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  198. package/build/dist/Server/API/CommonAPI.js +42 -0
  199. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  200. package/build/dist/Server/API/IncidentAPI.js +43 -26
  201. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  202. package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
  203. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  204. package/build/dist/Server/API/MonitorAPI.js +23 -0
  205. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  206. package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
  207. package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
  208. package/build/dist/Server/API/ProbeAPI.js +131 -15
  209. package/build/dist/Server/API/ProbeAPI.js.map +1 -1
  210. package/build/dist/Server/API/ProjectAPI.js +62 -3
  211. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  212. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
  213. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  214. package/build/dist/Server/API/StatusPageAPI.js +61 -33
  215. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  216. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
  217. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
  224. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  228. package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
  229. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  230. package/build/dist/Server/Services/AlertService.js +95 -0
  231. package/build/dist/Server/Services/AlertService.js.map +1 -1
  232. package/build/dist/Server/Services/BillingService.js +71 -0
  233. package/build/dist/Server/Services/BillingService.js.map +1 -1
  234. package/build/dist/Server/Services/DatabaseService.js +140 -17
  235. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  236. package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
  237. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  238. package/build/dist/Server/Services/IncidentService.js +100 -0
  239. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  240. package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
  241. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  242. package/build/dist/Server/Services/Index.js +2 -0
  243. package/build/dist/Server/Services/Index.js.map +1 -1
  244. package/build/dist/Server/Services/LogDropFilterService.js +93 -0
  245. package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
  246. package/build/dist/Server/Services/MonitorProbeService.js +73 -5
  247. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  248. package/build/dist/Server/Services/MonitorService.js +34 -39
  249. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  250. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
  251. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  252. package/build/dist/Server/Services/ProbeService.js +64 -0
  253. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  254. package/build/dist/Server/Services/ProjectService.js +103 -7
  255. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  256. package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
  257. package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
  258. package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
  259. package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
  260. package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
  261. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  262. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
  263. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  264. package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
  265. package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
  266. package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
  267. package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
  268. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
  269. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  270. package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
  271. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  272. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
  273. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  274. package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
  275. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  276. package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
  277. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  278. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
  279. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
  280. package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
  281. package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
  282. package/build/dist/Server/Utils/Errors.js +3 -0
  283. package/build/dist/Server/Utils/Errors.js.map +1 -1
  284. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
  285. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  286. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
  287. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  288. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
  289. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  290. package/build/dist/Types/Date.js +14 -4
  291. package/build/dist/Types/Date.js.map +1 -1
  292. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
  293. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  294. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  295. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  296. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
  297. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
  298. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
  299. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
  300. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
  301. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
  302. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
  303. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
  304. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
  305. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
  306. package/build/dist/Types/Permission.js +40 -0
  307. package/build/dist/Types/Permission.js.map +1 -1
  308. package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
  309. package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
  310. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
  311. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
  312. package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
  313. package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
  314. package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
  315. package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
  316. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
  317. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  318. package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
  319. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  320. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
  321. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  322. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
  323. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  324. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
  325. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
  326. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
  327. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  328. package/build/dist/UI/Components/Error/PageError.js +1 -3
  329. package/build/dist/UI/Components/Error/PageError.js.map +1 -1
  330. package/build/dist/UI/Components/ErrorBoundary.js +145 -11
  331. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  332. package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
  333. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  334. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
  335. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  336. package/build/dist/UI/Components/Modal/Modal.js +4 -32
  337. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  338. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  339. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +69 -33
  340. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  341. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +73 -32
  342. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
  343. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
  344. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
  345. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
  346. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
  347. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
  348. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  349. package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
  350. package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
  351. package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
  352. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  353. package/build/dist/Utils/API.js +39 -2
  354. package/build/dist/Utils/API.js.map +1 -1
  355. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
  356. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
  357. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
  358. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
  359. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
  360. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
  361. package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
  362. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
  363. package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
  364. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  365. package/package.json +1 -1
@@ -401,6 +401,7 @@ export default class AlertEpisodeStateTimeline extends BaseModel {
401
401
  {
402
402
  eager: false,
403
403
  nullable: true,
404
+ onDelete: "CASCADE",
404
405
  orphanedRowAction: "nullify",
405
406
  },
406
407
  )
@@ -414,6 +414,7 @@ export default class AlertStateTimeline extends BaseModel {
414
414
  {
415
415
  eager: false,
416
416
  nullable: true,
417
+ onDelete: "CASCADE",
417
418
  orphanedRowAction: "nullify",
418
419
  },
419
420
  )
@@ -403,6 +403,7 @@ export default class IncidentEpisodeStateTimeline extends BaseModel {
403
403
  {
404
404
  eager: false,
405
405
  nullable: true,
406
+ onDelete: "CASCADE",
406
407
  orphanedRowAction: "nullify",
407
408
  },
408
409
  )
@@ -417,6 +417,7 @@ export default class IncidentStateTimeline extends BaseModel {
417
417
  {
418
418
  eager: false,
419
419
  nullable: true,
420
+ onDelete: "CASCADE",
420
421
  orphanedRowAction: "nullify",
421
422
  },
422
423
  )
@@ -204,6 +204,9 @@ import EnterpriseLicenseInstance from "./EnterpriseLicenseInstance";
204
204
  import OpenSourceDeployment from "./OpenSourceDeployment";
205
205
  import Reseller from "./Reseller";
206
206
  import ResellerPlan from "./ResellerPlan";
207
+
208
+ import RecommendationDismissal from "./RecommendationDismissal";
209
+
207
210
  // ScheduledMaintenances
208
211
  import ScheduledMaintenance from "./ScheduledMaintenance";
209
212
  import ScheduledMaintenanceCustomField from "./ScheduledMaintenanceCustomField";
@@ -684,6 +687,8 @@ const AllModelTypes: Array<{
684
687
  Reseller,
685
688
  ResellerPlan,
686
689
 
690
+ RecommendationDismissal,
691
+
687
692
  PromoCode,
688
693
  EnterpriseLicense,
689
694
  EnterpriseLicenseInstance,
@@ -398,6 +398,95 @@ export default class LogDropFilter extends BaseModel {
398
398
  })
399
399
  public sortOrder?: number = undefined;
400
400
 
401
+ /*
402
+ * Ingest-owned counters. A drop filter used to discard logs with no
403
+ * record anywhere — no log line, no metric, no counter — so neither the
404
+ * customer nor support could tell a filter from a broken pipeline. These
405
+ * two columns are the customer-visible half of that fix (the operator
406
+ * half is the `oneuptime.telemetry.ingest.dropped.count` metric).
407
+ *
408
+ * Written only by the ingest path, via a throttled atomic UPDATE that
409
+ * batches many dropped records into one statement — never once per log.
410
+ * See App/FeatureSet/Telemetry/Utils/DropFilterDropRecorder.ts.
411
+ */
412
+ @ColumnAccessControl({
413
+ create: [],
414
+ read: [
415
+ Permission.ProjectOwner,
416
+ Permission.ProjectAdmin,
417
+ Permission.ProjectMember,
418
+ Permission.Viewer,
419
+ Permission.TelemetryAdmin,
420
+ Permission.TelemetryMember,
421
+ Permission.TelemetryViewer,
422
+ Permission.ReadProjectLogDropFilter,
423
+ ],
424
+ update: [],
425
+ })
426
+ @TableColumn({
427
+ title: "Dropped Count",
428
+ required: false,
429
+ type: TableColumnType.BigPositiveNumber,
430
+ canReadOnRelationQuery: true,
431
+ description:
432
+ "Total number of logs this filter has discarded since it was created.",
433
+ defaultValue: 0,
434
+ })
435
+ @Column({
436
+ type: ColumnType.BigPositiveNumber,
437
+ nullable: false,
438
+ default: 0,
439
+ transformer: {
440
+ to: (value: number | null | undefined): string | null => {
441
+ if (value === null || value === undefined) {
442
+ return null;
443
+ }
444
+ return Math.trunc(value).toString();
445
+ },
446
+ /*
447
+ * Postgres bigint comes back from the driver as a string. The UI
448
+ * renders this as a number, so normalize here rather than making
449
+ * every reader remember.
450
+ */
451
+ from: (value: string | null | undefined): number | null => {
452
+ if (value === null || value === undefined) {
453
+ return null;
454
+ }
455
+ const parsed: number = parseInt(value, 10);
456
+ return isNaN(parsed) ? null : parsed;
457
+ },
458
+ },
459
+ })
460
+ public droppedCount?: number = undefined;
461
+
462
+ @ColumnAccessControl({
463
+ create: [],
464
+ read: [
465
+ Permission.ProjectOwner,
466
+ Permission.ProjectAdmin,
467
+ Permission.ProjectMember,
468
+ Permission.Viewer,
469
+ Permission.TelemetryAdmin,
470
+ Permission.TelemetryMember,
471
+ Permission.TelemetryViewer,
472
+ Permission.ReadProjectLogDropFilter,
473
+ ],
474
+ update: [],
475
+ })
476
+ @TableColumn({
477
+ title: "Last Dropped At",
478
+ required: false,
479
+ type: TableColumnType.Date,
480
+ canReadOnRelationQuery: true,
481
+ description:
482
+ "When this filter most recently discarded a log. Null means it has never matched anything.",
483
+ })
484
+ @Column({
485
+ type: ColumnType.Date,
486
+ nullable: true,
487
+ })
488
+ public lastDroppedAt?: Date = undefined;
489
+
401
490
  @ColumnAccessControl({
402
491
  create: [],
403
492
  read: [
@@ -77,7 +77,7 @@ export interface DiscoveredNetworkDevice {
77
77
  pluralName: "Network Device Discovery Scans",
78
78
  icon: IconProp.Search,
79
79
  tableDescription:
80
- "Subnet discovery scans that sweep a CIDR range via SNMP from a probe and report devices found, so they can be imported as Network Devices.",
80
+ "Network discovery scans that sweep an address space — a CIDR subnet or an octet range via SNMP from a probe and report devices found, so they can be imported as Network Devices.",
81
81
  })
82
82
  @Entity({
83
83
  name: "NetworkDeviceDiscoveryScan",
@@ -260,12 +260,22 @@ export default class NetworkDeviceDiscoveryScan extends BaseModel {
260
260
  ],
261
261
  update: [],
262
262
  })
263
+ /*
264
+ * The address space this scan sweeps. Two notations are accepted (see
265
+ * Common/Utils/NetworkDiscovery/ScanTargetUtil): CIDR, and octet ranges
266
+ * where any octet may be an inclusive low-high range.
267
+ *
268
+ * The column keeps the name `cidr` it was created with: it is part of the
269
+ * public API surface and the probe payload, and renaming it would break both
270
+ * for a purely cosmetic gain.
271
+ */
263
272
  @TableColumn({
264
273
  required: true,
265
274
  type: TableColumnType.ShortText,
266
275
  canReadOnRelationQuery: true,
267
- title: "CIDR",
268
- description: "Subnet to scan in CIDR notation, e.g. 192.168.1.0/24",
276
+ title: "Scan Target",
277
+ description:
278
+ "Address space to scan, either in CIDR notation (192.168.1.0/24) or octet-range notation where any octet may be an inclusive low-high range (10.16-22.0-255.51-66)",
269
279
  example: "192.168.1.0/24",
270
280
  })
271
281
  @Column({
@@ -0,0 +1,463 @@
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 ColumnLength from "../../Types/Database/ColumnLength";
8
+ import ColumnType from "../../Types/Database/ColumnType";
9
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
10
+ import EnableDocumentation from "../../Types/Database/EnableDocumentation";
11
+ import TableColumn from "../../Types/Database/TableColumn";
12
+ import TableColumnType from "../../Types/Database/TableColumnType";
13
+ import TableMetadata from "../../Types/Database/TableMetadata";
14
+ import TenantColumn from "../../Types/Database/TenantColumn";
15
+ import UniqueColumnBy from "../../Types/Database/UniqueColumnBy";
16
+ import IconProp from "../../Types/Icon/IconProp";
17
+ import ObjectID from "../../Types/ObjectID";
18
+ import Permission from "../../Types/Permission";
19
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
20
+
21
+ /*
22
+ * One recommendation a project has decided it does not want, on one resource.
23
+ *
24
+ * Recommendations themselves are computed, not stored: the catalog derives them
25
+ * from telemetry every time the page loads. That makes "no thanks" the only
26
+ * piece of state worth persisting, and it has to be persisted — a dismissal
27
+ * held in React state comes back on the next page load, and a dismissal held in
28
+ * localStorage comes back for the next engineer on the team. Both make the
29
+ * recommendation list something people learn to ignore.
30
+ *
31
+ * The row is deliberately NOT scoped to a monitor or to any other created
32
+ * object. It is scoped to (recommendationType, resourceType, resourceId,
33
+ * recommendationId), which is enough to answer "hide this card here" for every
34
+ * present and future recommendation kind. `resourceId` is a plain ObjectID
35
+ * column with no relation because the resource it points at is polymorphic —
36
+ * a KubernetesCluster, a Host, a DockerHost and five others, with no shared
37
+ * parent table to point a foreign key at. The cost of that is orphan rows when
38
+ * a resource is deleted; they are a handful of bytes each, they are invisible
39
+ * (nothing queries them once the resource is gone), and the alternative is
40
+ * eight nullable FK columns.
41
+ *
42
+ * Un-dismissing is a DELETE, not a flag. Deletes in this codebase are hard
43
+ * deletes (see DatabaseService._deleteBy), so a re-dismissal after a restore
44
+ * is a clean insert and the `@UniqueColumnBy` guard below stays accurate.
45
+ */
46
+ @EnableDocumentation()
47
+ @TenantColumn("projectId")
48
+ @TableAccessControl({
49
+ create: [
50
+ Permission.ProjectOwner,
51
+ Permission.ProjectAdmin,
52
+ Permission.ProjectMember,
53
+ Permission.CreateRecommendationDismissal,
54
+ ],
55
+ read: [
56
+ Permission.ProjectOwner,
57
+ Permission.ProjectAdmin,
58
+ Permission.ProjectMember,
59
+ Permission.Viewer,
60
+ Permission.ReadRecommendationDismissal,
61
+ ],
62
+ delete: [
63
+ Permission.ProjectOwner,
64
+ Permission.ProjectAdmin,
65
+ Permission.ProjectMember,
66
+ Permission.DeleteRecommendationDismissal,
67
+ ],
68
+ update: [
69
+ Permission.ProjectOwner,
70
+ Permission.ProjectAdmin,
71
+ Permission.ProjectMember,
72
+ Permission.EditRecommendationDismissal,
73
+ ],
74
+ })
75
+ @CrudApiEndpoint(new Route("/recommendation-dismissal"))
76
+ @TableMetadata({
77
+ tableName: "RecommendationDismissal",
78
+ singularName: "Recommendation Dismissal",
79
+ pluralName: "Recommendation Dismissals",
80
+ icon: IconProp.EyeSlash,
81
+ tableDescription:
82
+ "Recommendations your team has dismissed. Dismissing hides a recommendation for everyone on the project until it is restored; it never deletes anything that was already created from it.",
83
+ })
84
+ @Entity({
85
+ name: "RecommendationDismissal",
86
+ })
87
+ /*
88
+ * Every read is "give me the dismissals for this one resource", which is
89
+ * exactly this index. It is deliberately not unique — uniqueness is enforced
90
+ * at the application layer by `@UniqueColumnBy` below, which (unlike a Postgres
91
+ * unique index) treats a NULL `resourceId` as a value rather than as "always
92
+ * distinct". A future project-wide recommendation kind will have no resourceId,
93
+ * and it still must not be dismissable twice.
94
+ */
95
+ @Index(["projectId", "recommendationType", "resourceType", "resourceId"])
96
+ export default class RecommendationDismissal extends BaseModel {
97
+ @ColumnAccessControl({
98
+ create: [
99
+ Permission.ProjectOwner,
100
+ Permission.ProjectAdmin,
101
+ Permission.ProjectMember,
102
+ Permission.CreateRecommendationDismissal,
103
+ ],
104
+ read: [
105
+ Permission.ProjectOwner,
106
+ Permission.ProjectAdmin,
107
+ Permission.ProjectMember,
108
+ Permission.Viewer,
109
+ Permission.ReadRecommendationDismissal,
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.CreateRecommendationDismissal,
140
+ ],
141
+ read: [
142
+ Permission.ProjectOwner,
143
+ Permission.ProjectAdmin,
144
+ Permission.ProjectMember,
145
+ Permission.Viewer,
146
+ Permission.ReadRecommendationDismissal,
147
+ ],
148
+ update: [],
149
+ })
150
+ @Index()
151
+ @TableColumn({
152
+ type: TableColumnType.ObjectID,
153
+ required: true,
154
+ canReadOnRelationQuery: true,
155
+ title: "Project ID",
156
+ description: "ID of your OneUptime Project in which this object belongs",
157
+ })
158
+ @Column({
159
+ type: ColumnType.ObjectID,
160
+ nullable: false,
161
+ transformer: ObjectID.getDatabaseTransformer(),
162
+ })
163
+ public projectId?: ObjectID = undefined;
164
+
165
+ @ColumnAccessControl({
166
+ create: [
167
+ Permission.ProjectOwner,
168
+ Permission.ProjectAdmin,
169
+ Permission.ProjectMember,
170
+ Permission.CreateRecommendationDismissal,
171
+ ],
172
+ read: [
173
+ Permission.ProjectOwner,
174
+ Permission.ProjectAdmin,
175
+ Permission.ProjectMember,
176
+ Permission.Viewer,
177
+ Permission.ReadRecommendationDismissal,
178
+ ],
179
+ update: [],
180
+ })
181
+ @TableColumn({
182
+ required: true,
183
+ type: TableColumnType.ShortText,
184
+ canReadOnRelationQuery: true,
185
+ title: "Recommendation Type",
186
+ description:
187
+ "Which family of recommendation this dismissal belongs to. See the RecommendationType enum.",
188
+ example: "Monitor",
189
+ })
190
+ @Column({
191
+ nullable: false,
192
+ type: ColumnType.ShortText,
193
+ length: ColumnLength.ShortText,
194
+ })
195
+ public recommendationType?: string = undefined;
196
+
197
+ @ColumnAccessControl({
198
+ create: [
199
+ Permission.ProjectOwner,
200
+ Permission.ProjectAdmin,
201
+ Permission.ProjectMember,
202
+ Permission.CreateRecommendationDismissal,
203
+ ],
204
+ read: [
205
+ Permission.ProjectOwner,
206
+ Permission.ProjectAdmin,
207
+ Permission.ProjectMember,
208
+ Permission.Viewer,
209
+ Permission.ReadRecommendationDismissal,
210
+ ],
211
+ update: [],
212
+ })
213
+ @TableColumn({
214
+ required: true,
215
+ type: TableColumnType.ShortText,
216
+ canReadOnRelationQuery: true,
217
+ title: "Recommendation ID",
218
+ description:
219
+ "The catalog-wide id of the dismissed recommendation, for example Kubernetes:k8s-hpa-at-max-replicas.",
220
+ example: "Kubernetes:k8s-hpa-at-max-replicas",
221
+ })
222
+ @Column({
223
+ nullable: false,
224
+ type: ColumnType.ShortText,
225
+ length: ColumnLength.ShortText,
226
+ })
227
+ /*
228
+ * Application-level uniqueness. A second dismissal of the same
229
+ * recommendation on the same resource is always a double click or a stale
230
+ * tab, never something the user meant.
231
+ */
232
+ @UniqueColumnBy([
233
+ "projectId",
234
+ "recommendationType",
235
+ "resourceType",
236
+ "resourceId",
237
+ ])
238
+ public recommendationId?: string = undefined;
239
+
240
+ @ColumnAccessControl({
241
+ create: [
242
+ Permission.ProjectOwner,
243
+ Permission.ProjectAdmin,
244
+ Permission.ProjectMember,
245
+ Permission.CreateRecommendationDismissal,
246
+ ],
247
+ read: [
248
+ Permission.ProjectOwner,
249
+ Permission.ProjectAdmin,
250
+ Permission.ProjectMember,
251
+ Permission.Viewer,
252
+ Permission.ReadRecommendationDismissal,
253
+ ],
254
+ update: [],
255
+ })
256
+ @TableColumn({
257
+ required: false,
258
+ type: TableColumnType.ShortText,
259
+ canReadOnRelationQuery: true,
260
+ title: "Resource Type",
261
+ description:
262
+ "The kind of resource this recommendation was shown on, for example Kubernetes or Docker. Empty for recommendations that are not scoped to a resource.",
263
+ example: "Kubernetes",
264
+ })
265
+ @Column({
266
+ nullable: true,
267
+ type: ColumnType.ShortText,
268
+ length: ColumnLength.ShortText,
269
+ })
270
+ public resourceType?: string = undefined;
271
+
272
+ @ColumnAccessControl({
273
+ create: [
274
+ Permission.ProjectOwner,
275
+ Permission.ProjectAdmin,
276
+ Permission.ProjectMember,
277
+ Permission.CreateRecommendationDismissal,
278
+ ],
279
+ read: [
280
+ Permission.ProjectOwner,
281
+ Permission.ProjectAdmin,
282
+ Permission.ProjectMember,
283
+ Permission.Viewer,
284
+ Permission.ReadRecommendationDismissal,
285
+ ],
286
+ update: [],
287
+ })
288
+ @TableColumn({
289
+ required: false,
290
+ type: TableColumnType.ObjectID,
291
+ canReadOnRelationQuery: true,
292
+ title: "Resource ID",
293
+ description:
294
+ "ID of the resource this recommendation was shown on. Polymorphic — it points at whichever table Resource Type names — so it carries no foreign key.",
295
+ })
296
+ @Column({
297
+ type: ColumnType.ObjectID,
298
+ nullable: true,
299
+ transformer: ObjectID.getDatabaseTransformer(),
300
+ })
301
+ public resourceId?: ObjectID = undefined;
302
+
303
+ @ColumnAccessControl({
304
+ create: [
305
+ Permission.ProjectOwner,
306
+ Permission.ProjectAdmin,
307
+ Permission.ProjectMember,
308
+ Permission.CreateRecommendationDismissal,
309
+ ],
310
+ read: [
311
+ Permission.ProjectOwner,
312
+ Permission.ProjectAdmin,
313
+ Permission.ProjectMember,
314
+ Permission.Viewer,
315
+ Permission.ReadRecommendationDismissal,
316
+ ],
317
+ update: [
318
+ Permission.ProjectOwner,
319
+ Permission.ProjectAdmin,
320
+ Permission.ProjectMember,
321
+ Permission.EditRecommendationDismissal,
322
+ ],
323
+ })
324
+ @TableColumn({
325
+ required: false,
326
+ type: TableColumnType.LongText,
327
+ title: "Dismissal Reason",
328
+ description:
329
+ "Optional note explaining why this recommendation was dismissed, shown to whoever finds it in the dismissed list later.",
330
+ example: "We alert on this from Prometheus already.",
331
+ })
332
+ @Column({
333
+ nullable: true,
334
+ type: ColumnType.LongText,
335
+ length: ColumnLength.LongText,
336
+ })
337
+ public dismissalReason?: string = undefined;
338
+
339
+ @ColumnAccessControl({
340
+ create: [
341
+ Permission.ProjectOwner,
342
+ Permission.ProjectAdmin,
343
+ Permission.ProjectMember,
344
+ Permission.CreateRecommendationDismissal,
345
+ ],
346
+ read: [
347
+ Permission.ProjectOwner,
348
+ Permission.ProjectAdmin,
349
+ Permission.ProjectMember,
350
+ Permission.Viewer,
351
+ Permission.ReadRecommendationDismissal,
352
+ ],
353
+ update: [],
354
+ })
355
+ @TableColumn({
356
+ manyToOneRelationColumn: "createdByUserId",
357
+ type: TableColumnType.Entity,
358
+ modelType: User,
359
+ title: "Created by User",
360
+ description:
361
+ "Relation to User who created this object (if this object was created by a User)",
362
+ })
363
+ @ManyToOne(
364
+ () => {
365
+ return User;
366
+ },
367
+ {
368
+ eager: false,
369
+ nullable: true,
370
+ onDelete: "SET NULL",
371
+ orphanedRowAction: "nullify",
372
+ },
373
+ )
374
+ @JoinColumn({ name: "createdByUserId" })
375
+ public createdByUser?: User = undefined;
376
+
377
+ @ColumnAccessControl({
378
+ create: [
379
+ Permission.ProjectOwner,
380
+ Permission.ProjectAdmin,
381
+ Permission.ProjectMember,
382
+ Permission.CreateRecommendationDismissal,
383
+ ],
384
+ read: [
385
+ Permission.ProjectOwner,
386
+ Permission.ProjectAdmin,
387
+ Permission.ProjectMember,
388
+ Permission.Viewer,
389
+ Permission.ReadRecommendationDismissal,
390
+ ],
391
+ update: [],
392
+ })
393
+ @TableColumn({
394
+ type: TableColumnType.ObjectID,
395
+ title: "Created by User ID",
396
+ description:
397
+ "User ID who created this object (if this object was created by a User)",
398
+ })
399
+ @Column({
400
+ type: ColumnType.ObjectID,
401
+ nullable: true,
402
+ transformer: ObjectID.getDatabaseTransformer(),
403
+ })
404
+ public createdByUserId?: ObjectID = undefined;
405
+
406
+ @ColumnAccessControl({
407
+ create: [],
408
+ read: [
409
+ Permission.ProjectOwner,
410
+ Permission.ProjectAdmin,
411
+ Permission.ProjectMember,
412
+ Permission.Viewer,
413
+ Permission.ReadRecommendationDismissal,
414
+ ],
415
+ update: [],
416
+ })
417
+ @TableColumn({
418
+ manyToOneRelationColumn: "deletedByUserId",
419
+ type: TableColumnType.Entity,
420
+ title: "Deleted by User",
421
+ modelType: User,
422
+ description:
423
+ "Relation to User who deleted this object (if this object was deleted by a User)",
424
+ })
425
+ @ManyToOne(
426
+ () => {
427
+ return User;
428
+ },
429
+ {
430
+ cascade: false,
431
+ eager: false,
432
+ nullable: true,
433
+ onDelete: "SET NULL",
434
+ orphanedRowAction: "nullify",
435
+ },
436
+ )
437
+ @JoinColumn({ name: "deletedByUserId" })
438
+ public deletedByUser?: User = undefined;
439
+
440
+ @ColumnAccessControl({
441
+ create: [],
442
+ read: [
443
+ Permission.ProjectOwner,
444
+ Permission.ProjectAdmin,
445
+ Permission.ProjectMember,
446
+ Permission.Viewer,
447
+ Permission.ReadRecommendationDismissal,
448
+ ],
449
+ update: [],
450
+ })
451
+ @TableColumn({
452
+ type: TableColumnType.ObjectID,
453
+ title: "Deleted by User ID",
454
+ description:
455
+ "User ID who deleted this object (if this object was deleted by a User)",
456
+ })
457
+ @Column({
458
+ type: ColumnType.ObjectID,
459
+ nullable: true,
460
+ transformer: ObjectID.getDatabaseTransformer(),
461
+ })
462
+ public deletedByUserId?: ObjectID = undefined;
463
+ }
@@ -414,6 +414,7 @@ export default class ScheduledMaintenanceStateTimeline extends BaseModel {
414
414
  {
415
415
  eager: false,
416
416
  nullable: true,
417
+ onDelete: "CASCADE",
417
418
  orphanedRowAction: "nullify",
418
419
  },
419
420
  )