@oneuptime/common 12.0.12 → 12.0.14

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 (596) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
  2. package/Models/DatabaseModels/NetworkDevice.ts +64 -0
  3. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  4. package/Models/DatabaseModels/StatusPage.ts +59 -0
  5. package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
  6. package/Models/DatabaseModels/UserCall.ts +94 -3
  7. package/Models/DatabaseModels/UserEmail.ts +94 -3
  8. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  9. package/Models/DatabaseModels/UserPush.ts +37 -0
  10. package/Models/DatabaseModels/UserSMS.ts +94 -3
  11. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  12. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
  13. package/Server/API/AIChatAPI.ts +55 -56
  14. package/Server/API/BaseAPI.ts +79 -14
  15. package/Server/API/CommonAPI.ts +89 -0
  16. package/Server/API/MicrosoftTeamsAPI.ts +20 -9
  17. package/Server/API/SlackAPI.ts +13 -10
  18. package/Server/API/StatusPageAPI.ts +2197 -2128
  19. package/Server/API/TelemetryAPI.ts +72 -3
  20. package/Server/API/UserCallAPI.ts +53 -45
  21. package/Server/API/UserEmailAPI.ts +53 -44
  22. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  23. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  24. package/Server/API/UserPushAPI.ts +126 -2
  25. package/Server/API/UserSmsAPI.ts +53 -44
  26. package/Server/API/UserWhatsAppAPI.ts +53 -50
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  33. package/Server/Middleware/UserAuthorization.ts +11 -2
  34. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  35. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  36. package/Server/Services/ApiKeyPermissionService.ts +116 -2
  37. package/Server/Services/DatabaseService.ts +118 -6
  38. package/Server/Services/LogAggregationService.ts +39 -0
  39. package/Server/Services/LogService.ts +21 -0
  40. package/Server/Services/NetworkSiteService.ts +12 -0
  41. package/Server/Services/PushNotificationService.ts +127 -12
  42. package/Server/Services/SpanService.ts +21 -0
  43. package/Server/Services/TeamMemberService.ts +53 -13
  44. package/Server/Services/TraceAggregationService.ts +15 -0
  45. package/Server/Services/UserCallService.ts +55 -24
  46. package/Server/Services/UserEmailService.ts +83 -17
  47. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  48. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  49. package/Server/Services/UserNotificationRuleService.ts +26 -0
  50. package/Server/Services/UserPushService.ts +89 -0
  51. package/Server/Services/UserSmsService.ts +50 -17
  52. package/Server/Services/UserWhatsAppService.ts +48 -15
  53. package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
  54. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
  55. package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
  56. package/Server/Types/Database/QueryHelper.ts +30 -0
  57. package/Server/Utils/APIKey/AccessPermission.ts +16 -40
  58. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  59. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
  60. package/Server/Utils/ChannelVerification.ts +510 -0
  61. package/Server/Utils/LogRedaction.ts +576 -0
  62. package/Server/Utils/Logger.ts +123 -46
  63. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
  64. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
  65. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  66. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  67. package/Server/Utils/Monitor/MonitorResource.ts +29 -9
  68. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  69. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  70. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
  71. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  72. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  73. package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
  74. package/Server/Utils/StartServer.ts +30 -9
  75. package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
  76. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
  77. package/Server/Utils/TotpAuth.ts +137 -9
  78. package/Server/Utils/UserRegistrationToken.ts +182 -0
  79. package/Server/Utils/VerificationCode.ts +134 -0
  80. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
  81. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  82. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  83. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  84. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  85. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  86. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +328 -0
  87. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
  88. package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
  89. package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
  90. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  91. package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
  92. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
  93. package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
  94. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  95. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
  96. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
  97. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  98. package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
  99. package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
  100. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  101. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  102. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  103. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  104. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  105. package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
  106. package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
  107. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
  108. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
  109. package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
  110. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  111. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +280 -0
  112. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  113. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  114. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
  115. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  116. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  117. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  118. package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
  119. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  120. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  121. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  122. package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
  123. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  124. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  125. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  126. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  127. package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
  128. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  129. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  130. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  131. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  132. package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
  133. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  134. package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
  135. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  136. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  137. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  138. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  139. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  140. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
  141. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
  142. package/Tests/Server/Utils/Browser.test.ts +162 -0
  143. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  144. package/Tests/Server/Utils/Express.test.ts +371 -0
  145. package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
  146. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
  147. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  148. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  149. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  150. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  151. package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
  152. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  153. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  154. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  155. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  156. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
  157. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  158. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  159. package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
  160. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
  161. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  162. package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
  163. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  164. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
  165. package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
  166. package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
  167. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  168. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
  169. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  170. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  171. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  172. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
  173. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
  174. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
  175. package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
  176. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  177. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  178. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  179. package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
  180. package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
  181. package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
  182. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  183. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  184. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  185. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  186. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  187. package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
  188. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
  189. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  190. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  191. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  192. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  193. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  194. package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
  195. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
  196. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  197. package/Tests/UI/Components/Button.test.tsx +175 -1
  198. package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
  199. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  200. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  201. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  202. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  203. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  204. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  205. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  206. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  207. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  208. package/Tests/UI/Components/List.test.tsx +9 -2
  209. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  210. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  211. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  212. package/Tests/UI/Components/MasterPage.test.tsx +36 -1
  213. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  214. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  215. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  216. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  217. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  218. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  219. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  220. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  221. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  222. package/Tests/UI/Components/Toast.test.tsx +130 -7
  223. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  224. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  225. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  226. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  227. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  228. package/Tests/Utils/API.test.ts +16 -2
  229. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  230. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  231. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  232. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
  233. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
  234. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
  235. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
  236. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  237. package/Types/API/Hostname.ts +79 -0
  238. package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
  239. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
  240. package/Types/Database/DatabaseProperty.ts +38 -0
  241. package/Types/Database/TableColumn.ts +34 -7
  242. package/Types/Email/EmailTemplateType.ts +1 -0
  243. package/Types/Events/Recurring.ts +16 -1
  244. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  245. package/Types/Monitor/MonitorStep.ts +13 -1
  246. package/Types/Monitor/MonitorType.ts +345 -40
  247. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  248. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  249. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
  250. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  251. package/Types/Permission.ts +35 -0
  252. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  253. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  254. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  255. package/Types/Service/ServiceLanguage.ts +144 -0
  256. package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
  257. package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
  258. package/Types/Text.ts +111 -19
  259. package/UI/Components/Button/Button.tsx +27 -14
  260. package/UI/Components/CardSelect/CardSelect.tsx +714 -105
  261. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  262. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  263. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  264. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  265. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  266. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  267. package/UI/Components/CommandPalette/Types.ts +49 -0
  268. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  269. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  270. package/UI/Components/EmptyState/EmptyState.tsx +8 -1
  271. package/UI/Components/Feed/FeedItem.tsx +1 -1
  272. package/UI/Components/Footer/Footer.tsx +32 -6
  273. package/UI/Components/Forms/Fields/FormField.tsx +3 -0
  274. package/UI/Components/Forms/Types/Field.ts +8 -0
  275. package/UI/Components/List/List.tsx +37 -5
  276. package/UI/Components/List/ListSkeleton.tsx +54 -0
  277. package/UI/Components/Loader/PageLoader.tsx +29 -8
  278. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
  279. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +23 -2
  280. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  281. package/UI/Components/MasterPage/MasterPage.tsx +24 -11
  282. package/UI/Components/Modal/Modal.tsx +2 -2
  283. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  284. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  285. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  286. package/UI/Components/Navbar/NavBar.tsx +14 -1
  287. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  288. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  289. package/UI/Components/SideOver/SideOver.tsx +37 -2
  290. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  291. package/UI/Components/Table/Table.tsx +74 -44
  292. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  293. package/UI/Components/Tabs/Tab.tsx +1 -1
  294. package/UI/Components/Toast/Toast.tsx +118 -53
  295. package/UI/Components/Toast/ToastInit.tsx +82 -32
  296. package/UI/Styles/Theme.css +40 -0
  297. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  298. package/UI/Utils/ModelListCache.ts +188 -0
  299. package/UI/Utils/Project.ts +29 -0
  300. package/Utils/API.ts +6 -1
  301. package/Utils/Monitor/MonitorMetricType.ts +16 -1
  302. package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
  303. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
  304. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
  305. package/Utils/Telemetry/CrossSignalScope.ts +75 -4
  306. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
  307. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
  309. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  311. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
  313. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
  315. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  317. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  319. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  320. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  321. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  322. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  323. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  324. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  325. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  326. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  327. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  328. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  329. package/build/dist/Server/API/AIChatAPI.js +48 -35
  330. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  331. package/build/dist/Server/API/BaseAPI.js +69 -13
  332. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  333. package/build/dist/Server/API/CommonAPI.js +59 -0
  334. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  335. package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
  336. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  337. package/build/dist/Server/API/SlackAPI.js +13 -10
  338. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  339. package/build/dist/Server/API/StatusPageAPI.js +745 -673
  340. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +34 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/API/UserCallAPI.js +42 -38
  344. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  345. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  346. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  347. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  348. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  349. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  350. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  351. package/build/dist/Server/API/UserPushAPI.js +95 -2
  352. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  353. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  354. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  355. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  356. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  357. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  358. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  359. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  360. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  361. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
  362. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
  363. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
  364. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
  365. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  366. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  367. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  368. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  369. package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
  370. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  371. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  372. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  373. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  374. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  375. package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
  376. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  377. package/build/dist/Server/Services/DatabaseService.js +89 -6
  378. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  379. package/build/dist/Server/Services/LogAggregationService.js +7 -0
  380. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  381. package/build/dist/Server/Services/LogService.js +16 -0
  382. package/build/dist/Server/Services/LogService.js.map +1 -1
  383. package/build/dist/Server/Services/NetworkSiteService.js +12 -0
  384. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  385. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  386. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  387. package/build/dist/Server/Services/SpanService.js +16 -0
  388. package/build/dist/Server/Services/SpanService.js.map +1 -1
  389. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  390. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  391. package/build/dist/Server/Services/TraceAggregationService.js +2 -0
  392. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  393. package/build/dist/Server/Services/UserCallService.js +54 -22
  394. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  395. package/build/dist/Server/Services/UserEmailService.js +78 -17
  396. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  397. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  398. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  399. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  400. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  401. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  402. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  403. package/build/dist/Server/Services/UserPushService.js +77 -0
  404. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  405. package/build/dist/Server/Services/UserSmsService.js +50 -17
  406. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  407. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  408. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  409. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
  410. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  411. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
  412. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  413. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
  414. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
  415. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  416. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  417. package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
  418. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  419. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  420. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  421. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
  422. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  423. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  424. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  425. package/build/dist/Server/Utils/LogRedaction.js +449 -0
  426. package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
  427. package/build/dist/Server/Utils/Logger.js +98 -45
  428. package/build/dist/Server/Utils/Logger.js.map +1 -1
  429. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
  430. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  431. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
  432. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  433. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  434. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  435. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  436. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  437. package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
  438. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  439. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  440. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  441. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  442. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  443. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  445. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  446. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  447. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  448. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
  449. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
  450. package/build/dist/Server/Utils/StartServer.js +10 -7
  451. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  452. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
  453. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
  454. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
  455. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
  456. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  457. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  458. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  459. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  460. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  461. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  462. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
  463. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  464. package/build/dist/Types/API/Hostname.js +63 -0
  465. package/build/dist/Types/API/Hostname.js.map +1 -1
  466. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
  467. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  468. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
  469. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  470. package/build/dist/Types/Database/DatabaseProperty.js +38 -0
  471. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  472. package/build/dist/Types/Database/TableColumn.js +24 -6
  473. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  474. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  475. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  476. package/build/dist/Types/Events/Recurring.js +13 -1
  477. package/build/dist/Types/Events/Recurring.js.map +1 -1
  478. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  479. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  480. package/build/dist/Types/Monitor/MonitorStep.js +9 -1
  481. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  482. package/build/dist/Types/Monitor/MonitorType.js +330 -31
  483. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  484. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  485. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  486. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  487. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  488. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  489. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  490. package/build/dist/Types/Permission.js +33 -0
  491. package/build/dist/Types/Permission.js.map +1 -1
  492. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  493. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  494. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  495. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  496. package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
  497. package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
  498. package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
  499. package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
  500. package/build/dist/Types/Text.js +82 -17
  501. package/build/dist/Types/Text.js.map +1 -1
  502. package/build/dist/UI/Components/Button/Button.js +22 -14
  503. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  504. package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
  505. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  506. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  507. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  508. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  509. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  510. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  511. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  512. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  513. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  514. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  515. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  516. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  517. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  518. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  519. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  520. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  521. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  522. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  523. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  524. package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
  525. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  526. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  527. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  528. package/build/dist/UI/Components/Footer/Footer.js +7 -4
  529. package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
  530. package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
  531. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  532. package/build/dist/UI/Components/List/List.js +19 -5
  533. package/build/dist/UI/Components/List/List.js.map +1 -1
  534. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  535. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  536. package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
  537. package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
  538. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
  539. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  540. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
  541. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  542. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  543. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  544. package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
  545. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  546. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  547. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  548. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  549. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  550. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  551. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  552. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  553. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  554. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  555. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  556. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  558. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  562. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  563. package/build/dist/UI/Components/Table/Table.js +35 -24
  564. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  565. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  566. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  567. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  568. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  569. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  570. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  571. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  572. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  573. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  574. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  575. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  576. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  577. package/build/dist/UI/Utils/Project.js +24 -1
  578. package/build/dist/UI/Utils/Project.js.map +1 -1
  579. package/build/dist/Utils/API.js +6 -1
  580. package/build/dist/Utils/API.js.map +1 -1
  581. package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
  582. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  583. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
  584. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  585. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
  586. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
  587. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
  588. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  589. package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
  590. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  591. package/jest.config.json +1 -1
  592. package/package.json +2 -3
  593. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  594. package/Tests/__mocks__/otpauth.js +0 -30
  595. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  596. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -95,6 +95,10 @@ import ResourceFacetResolver, {
95
95
  ResolvedFacetValue,
96
96
  ResourceFacetSpec,
97
97
  } from "../Utils/Telemetry/ResourceFacetResolver";
98
+ import ResourceEntityFilter, {
99
+ ResourceEntityScope,
100
+ } from "../Utils/Telemetry/ResourceEntityFilter";
101
+ import { ResourceEntityFacetSelections } from "../../Types/Telemetry/ResourceEntityFacet";
98
102
  import Label from "../../Models/DatabaseModels/Label";
99
103
  import RumApplication from "../../Models/DatabaseModels/RumApplication";
100
104
  import RumApplicationService from "../Services/RumApplicationService";
@@ -456,6 +460,9 @@ router.post(
456
460
  ? (body["attributes"] as Record<string, string | Array<string>>)
457
461
  : undefined;
458
462
 
463
+ const resourceScopes: Array<ResourceEntityScope> | undefined =
464
+ await resolveResourceScopesFromBody(body, databaseProps.tenantId);
465
+
459
466
  const request: HistogramRequest = {
460
467
  projectId: databaseProps.tenantId,
461
468
  startTime,
@@ -463,6 +470,7 @@ router.post(
463
470
  bucketSizeInMinutes,
464
471
  serviceIds,
465
472
  entityKeys,
473
+ resourceScopes,
466
474
  severityTexts,
467
475
  bodySearchText,
468
476
  traceIds,
@@ -573,6 +581,9 @@ router.post(
573
581
  */
574
582
  const projectId: ObjectID = databaseProps.tenantId;
575
583
 
584
+ const resourceScopes: Array<ResourceEntityScope> | undefined =
585
+ await resolveResourceScopesFromBody(body, projectId);
586
+
576
587
  /*
577
588
  * Run facet queries in parallel so a slow individual facet can't
578
589
  * starve the endpoint. Per-facet errors degrade gracefully to [].
@@ -592,6 +603,7 @@ router.post(
592
603
  limit,
593
604
  serviceIds,
594
605
  entityKeys,
606
+ resourceScopes,
595
607
  severityTexts,
596
608
  bodySearchText,
597
609
  traceIds,
@@ -656,6 +668,41 @@ router.post(
656
668
  },
657
669
  );
658
670
 
671
+ /**
672
+ * Resolve the `resourceFilters` field — the explorers' non-Service resource
673
+ * facet selections (Kubernetes cluster / host / docker host / podman host),
674
+ * sent as Postgres ids — into the scopes the aggregation services compile.
675
+ *
676
+ * Kept out of the sync body parsers because turning an id into an entity
677
+ * key needs a Postgres round trip: the id names a row whose identifying
678
+ * value (`clusterIdentifier` / `hostIdentifier`) is what ingest hashed into
679
+ * `entityKeys`.
680
+ *
681
+ * Returns undefined when nothing was selected so the request field stays
682
+ * absent rather than becoming an empty array.
683
+ */
684
+ async function resolveResourceScopesFromBody(
685
+ body: JSONObject,
686
+ projectId: ObjectID,
687
+ ): Promise<Array<ResourceEntityScope> | undefined> {
688
+ const selections: ResourceEntityFacetSelections =
689
+ ResourceEntityFilter.parseSelections(
690
+ body["resourceFilters"] as JSONObject | undefined,
691
+ );
692
+
693
+ if (Object.keys(selections).length === 0) {
694
+ return undefined;
695
+ }
696
+
697
+ const scopes: Array<ResourceEntityScope> =
698
+ await ResourceEntityFilter.resolveScopes({
699
+ projectId,
700
+ selections,
701
+ });
702
+
703
+ return scopes.length > 0 ? scopes : undefined;
704
+ }
705
+
659
706
  /*
660
707
  * Shared body parsing for every trace aggregation endpoint (histogram,
661
708
  * facets, analytics). Defensive about shapes: arrays are validated and
@@ -844,7 +891,13 @@ router.post(
844
891
  (body["bucketSizeInMinutes"] as number) ||
845
892
  computeDefaultBucketSize(startTime, endTime);
846
893
 
847
- const traceFilters: TraceFilters = parseTraceFilterBody(body);
894
+ const traceFilters: TraceFilters = {
895
+ ...parseTraceFilterBody(body),
896
+ resourceScopes: await resolveResourceScopesFromBody(
897
+ body,
898
+ databaseProps.tenantId,
899
+ ),
900
+ };
848
901
 
849
902
  const request: TraceHistogramRequest = {
850
903
  projectId: databaseProps.tenantId,
@@ -904,7 +957,13 @@ router.post(
904
957
 
905
958
  const limit: number = (body["limit"] as number) || 500;
906
959
 
907
- const traceFilters: TraceFilters = parseTraceFilterBody(body);
960
+ const traceFilters: TraceFilters = {
961
+ ...parseTraceFilterBody(body),
962
+ resourceScopes: await resolveResourceScopesFromBody(
963
+ body,
964
+ databaseProps.tenantId,
965
+ ),
966
+ };
908
967
 
909
968
  /*
910
969
  * Per-facet partial-match filter applied at the Postgres source-of-truth
@@ -1195,7 +1254,13 @@ router.post(
1195
1254
  ? Math.min(Math.max(Math.trunc(rawLimit), 1), 1000)
1196
1255
  : undefined;
1197
1256
 
1198
- const traceFilters: TraceFilters = parseTraceFilterBody(body);
1257
+ const traceFilters: TraceFilters = {
1258
+ ...parseTraceFilterBody(body),
1259
+ resourceScopes: await resolveResourceScopesFromBody(
1260
+ body,
1261
+ databaseProps.tenantId,
1262
+ ),
1263
+ };
1199
1264
 
1200
1265
  const request: TraceAnalyticsRequest = {
1201
1266
  projectId: databaseProps.tenantId,
@@ -1800,6 +1865,9 @@ router.post(
1800
1865
  ? (body["limit"] as number)
1801
1866
  : undefined;
1802
1867
 
1868
+ const resourceScopes: Array<ResourceEntityScope> | undefined =
1869
+ await resolveResourceScopesFromBody(body, databaseProps.tenantId);
1870
+
1803
1871
  const request: AnalyticsRequest = {
1804
1872
  projectId: databaseProps.tenantId,
1805
1873
  startTime,
@@ -1810,6 +1878,7 @@ router.post(
1810
1878
  aggregation,
1811
1879
  aggregationField,
1812
1880
  serviceIds,
1881
+ resourceScopes,
1813
1882
  severityTexts,
1814
1883
  bodySearchText,
1815
1884
  traceIds,
@@ -1,22 +1,44 @@
1
1
  import UserMiddleware from "../Middleware/UserAuthorization";
2
+ import VerificationCodeRateLimit, {
3
+ VerificationCodeRateLimitBucket,
4
+ } from "../Middleware/VerificationCodeRateLimit";
2
5
  import UserCallService, {
3
6
  Service as UserCallServiceType,
4
7
  } from "../Services/UserCallService";
5
- import UserNotificationRuleService from "../Services/UserNotificationRuleService";
6
8
  import {
7
9
  ExpressRequest,
8
10
  ExpressResponse,
9
11
  NextFunction,
10
12
  OneUptimeRequest,
11
13
  } from "../Utils/Express";
14
+ import ChannelVerification, {
15
+ ChannelVerificationOutcome,
16
+ ChannelVerificationResult,
17
+ } from "../Utils/ChannelVerification";
12
18
  import Response from "../Utils/Response";
13
- import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
14
19
  import BaseAPI from "./BaseAPI";
15
20
  import BadDataException from "../../Types/Exception/BadDataException";
16
21
  import ObjectID from "../../Types/ObjectID";
17
22
  import UserCall from "../../Models/DatabaseModels/UserCall";
18
- import UserSMS from "../../Models/DatabaseModels/UserSMS";
23
+ import UserNotificationRuleService from "../Services/UserNotificationRuleService";
24
+ import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
19
25
 
26
+ /*
27
+ * The verify and resend routes for this notification channel.
28
+ *
29
+ * Neither the checking of a submitted code nor the issuing of a new one lives
30
+ * here, on purpose. The state machine is shared by all five channels
31
+ * (Common/Server/Utils/ChannelVerification.ts) so that a control added for one
32
+ * of them cannot quietly go missing on another — which is exactly what went
33
+ * wrong before: five hand-written copies of "compare the column, set
34
+ * isVerified", none of which expired the code, counted attempts, or refused a
35
+ * caller running the comparison a million times against somebody else's phone
36
+ * number.
37
+ *
38
+ * What is left here is the HTTP shape: reject malformed bodies, run the rate
39
+ * limiter before anything costs a database read, and turn the outcome into a
40
+ * response.
41
+ */
20
42
  export default class UserCallAPI extends BaseAPI<
21
43
  UserCall,
22
44
  UserCallServiceType
@@ -27,6 +49,9 @@ export default class UserCallAPI extends BaseAPI<
27
49
  this.router.post(
28
50
  `/user-call/verify`,
29
51
  UserMiddleware.getUserMiddleware,
52
+ VerificationCodeRateLimit.getMiddleware(
53
+ VerificationCodeRateLimitBucket.Verify,
54
+ ),
30
55
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
31
56
  try {
32
57
  req = req as OneUptimeRequest;
@@ -47,33 +72,10 @@ export default class UserCallAPI extends BaseAPI<
47
72
  );
48
73
  }
49
74
 
50
- // Check if the code matches and verify the phone number.
51
- const item: UserSMS | null = await this.service.findOneById({
52
- id: req.body["itemId"],
53
- props: {
54
- isRoot: true,
55
- },
56
- select: {
57
- userId: true,
58
- projectId: true,
59
- verificationCode: true,
60
- },
61
- });
75
+ const userId: ObjectID | undefined = (req as OneUptimeRequest)
76
+ ?.userAuthorization?.userId;
62
77
 
63
- if (!item) {
64
- return Response.sendErrorResponse(
65
- req,
66
- res,
67
- new BadDataException("Item not found"),
68
- );
69
- }
70
-
71
- //check user id
72
-
73
- if (
74
- item.userId?.toString() !==
75
- (req as OneUptimeRequest)?.userAuthorization?.userId?.toString()
76
- ) {
78
+ if (!userId) {
77
79
  return Response.sendErrorResponse(
78
80
  req,
79
81
  res,
@@ -81,32 +83,30 @@ export default class UserCallAPI extends BaseAPI<
81
83
  );
82
84
  }
83
85
 
84
- if (item.verificationCode !== req.body["code"]) {
86
+ const result: ChannelVerificationResult =
87
+ await ChannelVerification.verifyCode({
88
+ service: this.service,
89
+ itemId: new ObjectID(req.body["itemId"].toString()),
90
+ userId: userId,
91
+ code: req.body["code"].toString(),
92
+ });
93
+
94
+ if (result.outcome !== ChannelVerificationOutcome.Verified) {
85
95
  return Response.sendErrorResponse(
86
96
  req,
87
97
  res,
88
- new BadDataException("Invalid code"),
98
+ ChannelVerification.getFailureException(result.outcome),
89
99
  );
90
100
  }
91
101
 
92
- await this.service.updateOneById({
93
- id: item.id!,
94
- props: {
95
- isRoot: true,
96
- },
97
- data: {
98
- isVerified: true,
99
- },
100
- });
101
-
102
- // Create default notification rules for this verified call number
102
+ /* Create default notification rules for this verified call number */
103
103
  try {
104
104
  await UserNotificationRuleService.addDefaultNotificationRulesForVerifiedMethod(
105
105
  {
106
- projectId: new ObjectID(item.projectId!.toString()),
107
- userId: new ObjectID(item.userId!.toString()),
106
+ projectId: new ObjectID(result.projectId!.toString()),
107
+ userId: new ObjectID(result.userId!.toString()),
108
108
  notificationMethod: {
109
- userCallId: item.id!,
109
+ userCallId: result.itemId!,
110
110
  },
111
111
  },
112
112
  );
@@ -127,6 +127,9 @@ export default class UserCallAPI extends BaseAPI<
127
127
  this.router.post(
128
128
  `/user-call/resend-verification-code`,
129
129
  UserMiddleware.getUserMiddleware,
130
+ VerificationCodeRateLimit.getMiddleware(
131
+ VerificationCodeRateLimitBucket.Resend,
132
+ ),
130
133
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
131
134
  try {
132
135
  req = req as OneUptimeRequest;
@@ -157,6 +160,11 @@ export default class UserCallAPI extends BaseAPI<
157
160
  );
158
161
  }
159
162
 
163
+ /*
164
+ * A caller may only ask for a code to be sent to a row they own.
165
+ * Without this the resend route is a way to make somebody else's
166
+ * device ring on demand.
167
+ */
160
168
  if (
161
169
  item.userId?.toString() !==
162
170
  (req as OneUptimeRequest)?.userAuthorization?.userId?.toString()
@@ -1,21 +1,44 @@
1
1
  import UserMiddleware from "../Middleware/UserAuthorization";
2
+ import VerificationCodeRateLimit, {
3
+ VerificationCodeRateLimitBucket,
4
+ } from "../Middleware/VerificationCodeRateLimit";
2
5
  import UserEmailService, {
3
6
  Service as UserEmailServiceType,
4
7
  } from "../Services/UserEmailService";
5
- import UserNotificationRuleService from "../Services/UserNotificationRuleService";
6
8
  import {
7
9
  ExpressRequest,
8
10
  ExpressResponse,
9
11
  NextFunction,
10
12
  OneUptimeRequest,
11
13
  } from "../Utils/Express";
14
+ import ChannelVerification, {
15
+ ChannelVerificationOutcome,
16
+ ChannelVerificationResult,
17
+ } from "../Utils/ChannelVerification";
12
18
  import Response from "../Utils/Response";
13
- import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
14
19
  import BaseAPI from "./BaseAPI";
15
20
  import BadDataException from "../../Types/Exception/BadDataException";
16
21
  import ObjectID from "../../Types/ObjectID";
17
22
  import UserEmail from "../../Models/DatabaseModels/UserEmail";
23
+ import UserNotificationRuleService from "../Services/UserNotificationRuleService";
24
+ import logger, { getLogAttributesFromRequest } from "../Utils/Logger";
18
25
 
26
+ /*
27
+ * The verify and resend routes for this notification channel.
28
+ *
29
+ * Neither the checking of a submitted code nor the issuing of a new one lives
30
+ * here, on purpose. The state machine is shared by all five channels
31
+ * (Common/Server/Utils/ChannelVerification.ts) so that a control added for one
32
+ * of them cannot quietly go missing on another — which is exactly what went
33
+ * wrong before: five hand-written copies of "compare the column, set
34
+ * isVerified", none of which expired the code, counted attempts, or refused a
35
+ * caller running the comparison a million times against somebody else's phone
36
+ * number.
37
+ *
38
+ * What is left here is the HTTP shape: reject malformed bodies, run the rate
39
+ * limiter before anything costs a database read, and turn the outcome into a
40
+ * response.
41
+ */
19
42
  export default class UserEmailAPI extends BaseAPI<
20
43
  UserEmail,
21
44
  UserEmailServiceType
@@ -26,6 +49,9 @@ export default class UserEmailAPI extends BaseAPI<
26
49
  this.router.post(
27
50
  `${new this.entityType().getCrudApiPath()?.toString()}/verify`,
28
51
  UserMiddleware.getUserMiddleware,
52
+ VerificationCodeRateLimit.getMiddleware(
53
+ VerificationCodeRateLimitBucket.Verify,
54
+ ),
29
55
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
30
56
  try {
31
57
  req = req as OneUptimeRequest;
@@ -46,33 +72,10 @@ export default class UserEmailAPI extends BaseAPI<
46
72
  );
47
73
  }
48
74
 
49
- // Check if the code matches and verify the email.
50
- const item: UserEmail | null = await this.service.findOneById({
51
- id: req.body["itemId"],
52
- props: {
53
- isRoot: true,
54
- },
55
- select: {
56
- userId: true,
57
- projectId: true,
58
- verificationCode: true,
59
- },
60
- });
61
-
62
- if (!item) {
63
- return Response.sendErrorResponse(
64
- req,
65
- res,
66
- new BadDataException("Item not found"),
67
- );
68
- }
69
-
70
- //check user id
75
+ const userId: ObjectID | undefined = (req as OneUptimeRequest)
76
+ ?.userAuthorization?.userId;
71
77
 
72
- if (
73
- item.userId?.toString() !==
74
- (req as OneUptimeRequest)?.userAuthorization?.userId?.toString()
75
- ) {
78
+ if (!userId) {
76
79
  return Response.sendErrorResponse(
77
80
  req,
78
81
  res,
@@ -80,32 +83,30 @@ export default class UserEmailAPI extends BaseAPI<
80
83
  );
81
84
  }
82
85
 
83
- if (item.verificationCode !== req.body["code"]) {
86
+ const result: ChannelVerificationResult =
87
+ await ChannelVerification.verifyCode({
88
+ service: this.service,
89
+ itemId: new ObjectID(req.body["itemId"].toString()),
90
+ userId: userId,
91
+ code: req.body["code"].toString(),
92
+ });
93
+
94
+ if (result.outcome !== ChannelVerificationOutcome.Verified) {
84
95
  return Response.sendErrorResponse(
85
96
  req,
86
97
  res,
87
- new BadDataException("Invalid code"),
98
+ ChannelVerification.getFailureException(result.outcome),
88
99
  );
89
100
  }
90
101
 
91
- await this.service.updateOneById({
92
- id: item.id!,
93
- props: {
94
- isRoot: true,
95
- },
96
- data: {
97
- isVerified: true,
98
- },
99
- });
100
-
101
- // Create default notification rules for this verified email
102
+ /* Create default notification rules for this verified email */
102
103
  try {
103
104
  await UserNotificationRuleService.addDefaultNotificationRulesForVerifiedMethod(
104
105
  {
105
- projectId: new ObjectID(item.projectId!.toString()),
106
- userId: new ObjectID(item.userId!.toString()),
106
+ projectId: new ObjectID(result.projectId!.toString()),
107
+ userId: new ObjectID(result.userId!.toString()),
107
108
  notificationMethod: {
108
- userEmailId: item.id!,
109
+ userEmailId: result.itemId!,
109
110
  },
110
111
  },
111
112
  );
@@ -128,6 +129,9 @@ export default class UserEmailAPI extends BaseAPI<
128
129
  .getCrudApiPath()
129
130
  ?.toString()}/resend-verification-code`,
130
131
  UserMiddleware.getUserMiddleware,
132
+ VerificationCodeRateLimit.getMiddleware(
133
+ VerificationCodeRateLimitBucket.Resend,
134
+ ),
131
135
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
132
136
  try {
133
137
  req = req as OneUptimeRequest;
@@ -158,6 +162,11 @@ export default class UserEmailAPI extends BaseAPI<
158
162
  );
159
163
  }
160
164
 
165
+ /*
166
+ * A caller may only ask for a code to be sent to a row they own.
167
+ * Without this the resend route is a way to make somebody else's
168
+ * device ring on demand.
169
+ */
161
170
  if (
162
171
  item.userId?.toString() !==
163
172
  (req as OneUptimeRequest)?.userAuthorization?.userId?.toString()
@@ -1,4 +1,7 @@
1
1
  import UserMiddleware from "../Middleware/UserAuthorization";
2
+ import VerificationCodeRateLimit, {
3
+ VerificationCodeRateLimitBucket,
4
+ } from "../Middleware/VerificationCodeRateLimit";
2
5
  import UserIncomingCallNumberService, {
3
6
  Service as UserIncomingCallNumberServiceType,
4
7
  } from "../Services/UserIncomingCallNumberService";
@@ -8,11 +11,32 @@ import {
8
11
  NextFunction,
9
12
  OneUptimeRequest,
10
13
  } from "../Utils/Express";
14
+ import ChannelVerification, {
15
+ ChannelVerificationOutcome,
16
+ ChannelVerificationResult,
17
+ } from "../Utils/ChannelVerification";
11
18
  import Response from "../Utils/Response";
12
19
  import BaseAPI from "./BaseAPI";
13
20
  import BadDataException from "../../Types/Exception/BadDataException";
21
+ import ObjectID from "../../Types/ObjectID";
14
22
  import UserIncomingCallNumber from "../../Models/DatabaseModels/UserIncomingCallNumber";
15
23
 
24
+ /*
25
+ * The verify and resend routes for this notification channel.
26
+ *
27
+ * Neither the checking of a submitted code nor the issuing of a new one lives
28
+ * here, on purpose. The state machine is shared by all five channels
29
+ * (Common/Server/Utils/ChannelVerification.ts) so that a control added for one
30
+ * of them cannot quietly go missing on another — which is exactly what went
31
+ * wrong before: five hand-written copies of "compare the column, set
32
+ * isVerified", none of which expired the code, counted attempts, or refused a
33
+ * caller running the comparison a million times against somebody else's phone
34
+ * number.
35
+ *
36
+ * What is left here is the HTTP shape: reject malformed bodies, run the rate
37
+ * limiter before anything costs a database read, and turn the outcome into a
38
+ * response.
39
+ */
16
40
  export default class UserIncomingCallNumberAPI extends BaseAPI<
17
41
  UserIncomingCallNumber,
18
42
  UserIncomingCallNumberServiceType
@@ -23,6 +47,9 @@ export default class UserIncomingCallNumberAPI extends BaseAPI<
23
47
  this.router.post(
24
48
  `/user-incoming-call-number/verify`,
25
49
  UserMiddleware.getUserMiddleware,
50
+ VerificationCodeRateLimit.getMiddleware(
51
+ VerificationCodeRateLimitBucket.Verify,
52
+ ),
26
53
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
27
54
  try {
28
55
  req = req as OneUptimeRequest;
@@ -43,32 +70,10 @@ export default class UserIncomingCallNumberAPI extends BaseAPI<
43
70
  );
44
71
  }
45
72
 
46
- // Check if the code matches and verify the phone number
47
- const item: UserIncomingCallNumber | null =
48
- await this.service.findOneById({
49
- id: req.body["itemId"],
50
- props: {
51
- isRoot: true,
52
- },
53
- select: {
54
- userId: true,
55
- verificationCode: true,
56
- },
57
- });
58
-
59
- if (!item) {
60
- return Response.sendErrorResponse(
61
- req,
62
- res,
63
- new BadDataException("Item not found"),
64
- );
65
- }
73
+ const userId: ObjectID | undefined = (req as OneUptimeRequest)
74
+ ?.userAuthorization?.userId;
66
75
 
67
- // Check user ID
68
- if (
69
- item.userId?.toString() !==
70
- (req as OneUptimeRequest)?.userAuthorization?.userId?.toString()
71
- ) {
76
+ if (!userId) {
72
77
  return Response.sendErrorResponse(
73
78
  req,
74
79
  res,
@@ -76,24 +81,22 @@ export default class UserIncomingCallNumberAPI extends BaseAPI<
76
81
  );
77
82
  }
78
83
 
79
- if (item.verificationCode !== req.body["code"]) {
84
+ const result: ChannelVerificationResult =
85
+ await ChannelVerification.verifyCode({
86
+ service: this.service,
87
+ itemId: new ObjectID(req.body["itemId"].toString()),
88
+ userId: userId,
89
+ code: req.body["code"].toString(),
90
+ });
91
+
92
+ if (result.outcome !== ChannelVerificationOutcome.Verified) {
80
93
  return Response.sendErrorResponse(
81
94
  req,
82
95
  res,
83
- new BadDataException("Invalid code"),
96
+ ChannelVerification.getFailureException(result.outcome),
84
97
  );
85
98
  }
86
99
 
87
- await this.service.updateOneById({
88
- id: item.id!,
89
- props: {
90
- isRoot: true,
91
- },
92
- data: {
93
- isVerified: true,
94
- },
95
- });
96
-
97
100
  return Response.sendEmptySuccessResponse(req, res);
98
101
  } catch (err) {
99
102
  return next(err);
@@ -104,6 +107,9 @@ export default class UserIncomingCallNumberAPI extends BaseAPI<
104
107
  this.router.post(
105
108
  `/user-incoming-call-number/resend-verification-code`,
106
109
  UserMiddleware.getUserMiddleware,
110
+ VerificationCodeRateLimit.getMiddleware(
111
+ VerificationCodeRateLimitBucket.Resend,
112
+ ),
107
113
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
108
114
  try {
109
115
  req = req as OneUptimeRequest;
@@ -135,7 +141,11 @@ export default class UserIncomingCallNumberAPI extends BaseAPI<
135
141
  );
136
142
  }
137
143
 
138
- // Check user ID
144
+ /*
145
+ * A caller may only ask for a code to be sent to a row they own.
146
+ * Without this the resend route is a way to make somebody else's
147
+ * device ring on demand.
148
+ */
139
149
  if (
140
150
  item.userId?.toString() !==
141
151
  (req as OneUptimeRequest)?.userAuthorization?.userId?.toString()