@oneuptime/common 12.0.13 → 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.
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
- package/Models/DatabaseModels/UserCall.ts +94 -3
- package/Models/DatabaseModels/UserEmail.ts +94 -3
- package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
- package/Models/DatabaseModels/UserPush.ts +37 -0
- package/Models/DatabaseModels/UserSMS.ts +94 -3
- package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
- package/Server/API/BaseAPI.ts +79 -14
- package/Server/API/UserCallAPI.ts +53 -45
- package/Server/API/UserEmailAPI.ts +53 -44
- package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
- package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
- package/Server/API/UserPushAPI.ts +126 -2
- package/Server/API/UserSmsAPI.ts +53 -44
- package/Server/API/UserWhatsAppAPI.ts +53 -50
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
- package/Server/Services/AnalyticsDatabaseService.ts +169 -0
- package/Server/Services/DatabaseService.ts +101 -0
- package/Server/Services/LogAggregationService.ts +5 -0
- package/Server/Services/PushNotificationService.ts +127 -12
- package/Server/Services/TeamMemberService.ts +53 -13
- package/Server/Services/UserCallService.ts +55 -24
- package/Server/Services/UserEmailService.ts +83 -17
- package/Server/Services/UserIncomingCallNumberService.ts +49 -85
- package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
- package/Server/Services/UserNotificationRuleService.ts +26 -0
- package/Server/Services/UserPushService.ts +89 -0
- package/Server/Services/UserSmsService.ts +50 -17
- package/Server/Services/UserWhatsAppService.ts +48 -15
- package/Server/Types/Database/QueryHelper.ts +30 -0
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
- package/Server/Utils/ChannelVerification.ts +510 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
- package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
- package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
- package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
- package/Server/Utils/TotpAuth.ts +137 -9
- package/Server/Utils/UserRegistrationToken.ts +182 -0
- package/Server/Utils/VerificationCode.ts +134 -0
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
- package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
- package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
- package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
- package/Tests/Server/API/UserSmsApi.test.ts +107 -14
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
- package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
- package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
- package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
- package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
- package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
- package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
- package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
- package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
- package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
- package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
- package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
- package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
- package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
- package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
- package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
- package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
- package/Tests/Server/Utils/Browser.test.ts +162 -0
- package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
- package/Tests/Server/Utils/Express.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
- package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
- package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
- package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
- package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
- package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
- package/Tests/Types/Call/CallRequest.test.ts +189 -0
- package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
- package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
- package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
- package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
- package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
- package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
- package/Tests/Types/TextRandomGeneration.test.ts +211 -0
- package/Tests/UI/Components/Button.test.tsx +175 -1
- package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
- package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
- package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
- package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
- package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
- package/Tests/UI/Components/List.test.tsx +9 -2
- package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
- package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
- package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
- package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
- package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
- package/Tests/UI/Components/Skeleton.test.tsx +71 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
- package/Tests/UI/Components/Tabs.test.tsx +24 -0
- package/Tests/UI/Components/Toast.test.tsx +130 -7
- package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
- package/Tests/UI/Utils/Dropdown.test.ts +423 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
- package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
- package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
- package/Tests/Utils/API.test.ts +16 -2
- package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
- package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
- package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
- package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
- package/Types/Permission.ts +35 -0
- package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
- package/Types/PushNotification/PushNotificationMessage.ts +15 -0
- package/Types/PushNotification/PushNotificationRequest.ts +8 -16
- package/Types/Service/ServiceLanguage.ts +144 -0
- package/Types/Text.ts +111 -19
- package/UI/Components/Button/Button.tsx +27 -14
- package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
- package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
- package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
- package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
- package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
- package/UI/Components/CommandPalette/Types.ts +49 -0
- package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/Feed/FeedItem.tsx +1 -1
- package/UI/Components/List/List.tsx +37 -5
- package/UI/Components/List/ListSkeleton.tsx +54 -0
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
- package/UI/Components/Modal/Modal.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
- package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
- package/UI/Components/Navbar/NavBar.tsx +14 -1
- package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
- package/UI/Components/SideOver/SideOver.tsx +37 -2
- package/UI/Components/Skeleton/Skeleton.tsx +53 -0
- package/UI/Components/Table/Table.tsx +74 -44
- package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
- package/UI/Components/Tabs/Tab.tsx +1 -1
- package/UI/Components/Toast/Toast.tsx +118 -53
- package/UI/Components/Toast/ToastInit.tsx +82 -32
- package/UI/Styles/Theme.css +40 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
- package/UI/Utils/ModelListCache.ts +188 -0
- package/UI/Utils/Project.ts +29 -0
- package/Utils/API.ts +6 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
- package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
- package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
- package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
- package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
- package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
- package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +69 -13
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +42 -38
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +42 -38
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
- package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
- package/build/dist/Server/API/UserPushAPI.js +95 -2
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +42 -38
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
- package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +74 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +5 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +69 -30
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +43 -7
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserCallService.js +54 -22
- package/build/dist/Server/Services/UserCallService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +78 -17
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserPushService.js +77 -0
- package/build/dist/Server/Services/UserPushService.js.map +1 -1
- package/build/dist/Server/Services/UserSmsService.js +50 -17
- package/build/dist/Server/Services/UserSmsService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
- package/build/dist/Server/Utils/ChannelVerification.js +348 -0
- package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/TotpAuth.js +127 -8
- package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
- package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
- package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
- package/build/dist/Server/Utils/VerificationCode.js +120 -0
- package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +33 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
- package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
- package/build/dist/Types/Service/ServiceLanguage.js +96 -0
- package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
- package/build/dist/Types/Text.js +82 -17
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +22 -14
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
- package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
- package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
- package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
- package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
- package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +19 -5
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
- package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
- package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
- package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
- package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +35 -24
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
- package/build/dist/UI/Components/Tabs/Tab.js +1 -1
- package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +77 -23
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
- package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelListCache.js +126 -0
- package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +24 -1
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/Utils/API.js +6 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/jest.config.json +1 -1
- package/package.json +2 -3
- package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
- package/Tests/__mocks__/otpauth.js +0 -30
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import EmailVerificationToken from "../../../Models/DatabaseModels/EmailVerificationToken";
|
|
2
|
+
import Project from "../../../Models/DatabaseModels/Project";
|
|
3
|
+
import TeamMember from "../../../Models/DatabaseModels/TeamMember";
|
|
4
|
+
import User from "../../../Models/DatabaseModels/User";
|
|
5
|
+
import DatabaseConfig from "../../../Server/DatabaseConfig";
|
|
6
|
+
import EmailVerificationTokenService from "../../../Server/Services/EmailVerificationTokenService";
|
|
7
|
+
import MailService from "../../../Server/Services/MailService";
|
|
8
|
+
import ProjectSCIMService from "../../../Server/Services/ProjectSCIMService";
|
|
9
|
+
import ProjectService from "../../../Server/Services/ProjectService";
|
|
10
|
+
import TeamMemberService from "../../../Server/Services/TeamMemberService";
|
|
11
|
+
import UserNotificationRuleService from "../../../Server/Services/UserNotificationRuleService";
|
|
12
|
+
import UserNotificationSettingService from "../../../Server/Services/UserNotificationSettingService";
|
|
13
|
+
import UserService from "../../../Server/Services/UserService";
|
|
14
|
+
import CreateBy from "../../../Server/Types/Database/CreateBy";
|
|
15
|
+
import Hostname from "../../../Types/API/Hostname";
|
|
16
|
+
import Protocol from "../../../Types/API/Protocol";
|
|
17
|
+
import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
18
|
+
import Email from "../../../Types/Email";
|
|
19
|
+
import EmailMessage from "../../../Types/Email/EmailMessage";
|
|
20
|
+
import HashedString from "../../../Types/HashedString";
|
|
21
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
22
|
+
import PositiveNumber from "../../../Types/PositiveNumber";
|
|
23
|
+
import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* The invitation half of GHSA-qg84-6hrg-mr5g.
|
|
27
|
+
*
|
|
28
|
+
* Inviting somebody creates their User row with no password on it, and /signup
|
|
29
|
+
* used to hand that row to anyone who asked for it by address. The address is
|
|
30
|
+
* not a secret -- corporate ones are guessable by construction -- so the
|
|
31
|
+
* invitation now carries a registration token, and that token is the only thing
|
|
32
|
+
* that can claim the account.
|
|
33
|
+
*
|
|
34
|
+
* Which means the invitation email is the sole delivery channel for it, and the
|
|
35
|
+
* decision of whether to mint one has to key off "has this person registered
|
|
36
|
+
* yet", not "did we just create their row". Those two came apart for anyone
|
|
37
|
+
* invited to a second project before they ever signed up: they had a row, so
|
|
38
|
+
* they were treated as an existing user and sent a sign-in link they could not
|
|
39
|
+
* use, having no password to sign in with.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
43
|
+
"11111111-1111-4111-8111-111111111111",
|
|
44
|
+
);
|
|
45
|
+
const TEAM_ID: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
|
|
46
|
+
const USER_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
47
|
+
const INVITER_ID: ObjectID = new ObjectID(
|
|
48
|
+
"55555555-5555-4555-8555-555555555555",
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const MEMBER_EMAIL: Email = new Email("alice@company.com");
|
|
52
|
+
|
|
53
|
+
let sendMailSpy: jest.SpyInstance;
|
|
54
|
+
let createTokenSpy: jest.SpyInstance;
|
|
55
|
+
let findUserSpy: jest.SpyInstance;
|
|
56
|
+
|
|
57
|
+
// Calls a protected hook without widening the service's public surface.
|
|
58
|
+
function callHook(
|
|
59
|
+
service: unknown,
|
|
60
|
+
name: string,
|
|
61
|
+
...args: Array<unknown>
|
|
62
|
+
): Promise<unknown> {
|
|
63
|
+
const hooks: Record<
|
|
64
|
+
string,
|
|
65
|
+
(...hookArgs: Array<unknown>) => Promise<unknown>
|
|
66
|
+
> = service as Record<
|
|
67
|
+
string,
|
|
68
|
+
(...hookArgs: Array<unknown>) => Promise<unknown>
|
|
69
|
+
>;
|
|
70
|
+
|
|
71
|
+
return hooks[name]!.apply(service, args);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function inviteBy(): CreateBy<TeamMember> {
|
|
75
|
+
const member: TeamMember = new TeamMember();
|
|
76
|
+
member.projectId = PROJECT_ID;
|
|
77
|
+
member.teamId = TEAM_ID;
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
data: member,
|
|
81
|
+
props: {
|
|
82
|
+
userId: INVITER_ID,
|
|
83
|
+
tenantId: PROJECT_ID,
|
|
84
|
+
} as DatabaseCommonInteractionProps,
|
|
85
|
+
miscDataProps: { email: MEMBER_EMAIL.toString() },
|
|
86
|
+
} as CreateBy<TeamMember>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Somebody who has an account and can sign in. */
|
|
90
|
+
function registeredUser(): User {
|
|
91
|
+
const user: User = new User(USER_ID);
|
|
92
|
+
user._id = USER_ID.toString();
|
|
93
|
+
user.email = MEMBER_EMAIL;
|
|
94
|
+
user.password = new HashedString("already-registered", true);
|
|
95
|
+
|
|
96
|
+
return user;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* An invitation that nobody has claimed: a row, and no password on it. */
|
|
100
|
+
function unclaimedUser(): User {
|
|
101
|
+
const user: User = new User(USER_ID);
|
|
102
|
+
user._id = USER_ID.toString();
|
|
103
|
+
user.email = MEMBER_EMAIL;
|
|
104
|
+
|
|
105
|
+
return user;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function sentMail(): EmailMessage {
|
|
109
|
+
expect(sendMailSpy).toHaveBeenCalledTimes(1);
|
|
110
|
+
|
|
111
|
+
return sendMailSpy.mock.calls[0]![0] as EmailMessage;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function registerLink(): string {
|
|
115
|
+
return sentMail().vars["registerLink"] as string;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* The token actually written to the database for this invitation. */
|
|
119
|
+
function persistedToken(): EmailVerificationToken {
|
|
120
|
+
expect(createTokenSpy).toHaveBeenCalledTimes(1);
|
|
121
|
+
|
|
122
|
+
return createTokenSpy.mock.calls[0]![0]["data"] as EmailVerificationToken;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
beforeEach(() => {
|
|
126
|
+
jest
|
|
127
|
+
.spyOn(ProjectSCIMService, "countBy")
|
|
128
|
+
.mockResolvedValue(new PositiveNumber(0));
|
|
129
|
+
|
|
130
|
+
// No existing membership - the duplicate-invite guard at the end of the hook.
|
|
131
|
+
jest.spyOn(TeamMemberService, "findOneBy").mockResolvedValue(null);
|
|
132
|
+
|
|
133
|
+
jest
|
|
134
|
+
.spyOn(ProjectService, "findOneById")
|
|
135
|
+
.mockResolvedValue({ name: "Acme Production" } as Project);
|
|
136
|
+
|
|
137
|
+
jest
|
|
138
|
+
.spyOn(DatabaseConfig, "getHost")
|
|
139
|
+
.mockResolvedValue(new Hostname("oneuptime.test"));
|
|
140
|
+
jest
|
|
141
|
+
.spyOn(DatabaseConfig, "getHttpProtocol")
|
|
142
|
+
.mockResolvedValue(Protocol.HTTPS);
|
|
143
|
+
|
|
144
|
+
sendMailSpy = jest
|
|
145
|
+
.spyOn(MailService, "sendMail")
|
|
146
|
+
.mockResolvedValue(undefined as never);
|
|
147
|
+
|
|
148
|
+
createTokenSpy = jest
|
|
149
|
+
.spyOn(EmailVerificationTokenService, "create")
|
|
150
|
+
.mockResolvedValue(new EmailVerificationToken());
|
|
151
|
+
|
|
152
|
+
findUserSpy = jest
|
|
153
|
+
.spyOn(UserService, "findOneBy")
|
|
154
|
+
.mockResolvedValue(unclaimedUser());
|
|
155
|
+
jest.spyOn(UserService, "findOneById").mockResolvedValue(unclaimedUser());
|
|
156
|
+
jest.spyOn(UserService, "createByEmail").mockResolvedValue(unclaimedUser());
|
|
157
|
+
|
|
158
|
+
jest
|
|
159
|
+
.spyOn(
|
|
160
|
+
UserNotificationSettingService,
|
|
161
|
+
"addDefaultNotificationSettingsForUser",
|
|
162
|
+
)
|
|
163
|
+
.mockResolvedValue(undefined as never);
|
|
164
|
+
jest
|
|
165
|
+
.spyOn(UserNotificationRuleService, "addDefaultNotificationRuleForUser")
|
|
166
|
+
.mockResolvedValue(undefined as never);
|
|
167
|
+
|
|
168
|
+
jest
|
|
169
|
+
.spyOn(TeamMemberService, "refreshTokens")
|
|
170
|
+
.mockResolvedValue(undefined as never);
|
|
171
|
+
jest
|
|
172
|
+
.spyOn(
|
|
173
|
+
TeamMemberService,
|
|
174
|
+
"updateSubscriptionSeatsByUniqueTeamMembersInProject",
|
|
175
|
+
)
|
|
176
|
+
.mockResolvedValue(undefined as never);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
afterEach(() => {
|
|
180
|
+
jest.restoreAllMocks();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe("TeamMemberService.onBeforeCreate - inviting somebody with no account yet", () => {
|
|
184
|
+
beforeEach(() => {
|
|
185
|
+
// Nobody by this address: the invite creates the row.
|
|
186
|
+
findUserSpy.mockResolvedValue(null);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test("mints a registration token bound to the invited address", async () => {
|
|
190
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
191
|
+
|
|
192
|
+
const token: EmailVerificationToken = persistedToken();
|
|
193
|
+
|
|
194
|
+
expect(token.email!.toString()).toBe(MEMBER_EMAIL.toString());
|
|
195
|
+
expect(token.userId!.toString()).toBe(USER_ID.toString());
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("puts that same token on the link in the invitation", async () => {
|
|
199
|
+
/*
|
|
200
|
+
* The email is the only place the token is ever published. If the link and
|
|
201
|
+
* the stored row disagreed, every invitation would dead-end.
|
|
202
|
+
*/
|
|
203
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
204
|
+
|
|
205
|
+
expect(registerLink()).toContain(persistedToken().token!.toString());
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
test("sends them to register rather than to sign in", async () => {
|
|
209
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
210
|
+
|
|
211
|
+
expect(sentMail().vars["isNewUser"]).toBe("true");
|
|
212
|
+
expect(registerLink()).toContain("/accounts/register");
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe("TeamMemberService.onBeforeCreate - inviting somebody who was invited before but never signed up", () => {
|
|
217
|
+
beforeEach(() => {
|
|
218
|
+
// The row exists from an earlier invitation, and still has no password.
|
|
219
|
+
findUserSpy.mockResolvedValue(unclaimedUser());
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test("still treats them as somebody who has to register", async () => {
|
|
223
|
+
/*
|
|
224
|
+
* The regression. Keying off "did we just create the row" called this an
|
|
225
|
+
* existing user and mailed them a sign-in link for an account that has no
|
|
226
|
+
* password.
|
|
227
|
+
*/
|
|
228
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
229
|
+
|
|
230
|
+
expect(sentMail().vars["isNewUser"]).toBe("true");
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
test("mints them a token, because their account is still claimable", async () => {
|
|
234
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
235
|
+
|
|
236
|
+
expect(registerLink()).toContain(persistedToken().token!.toString());
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
test("does not create a second user row for them", async () => {
|
|
240
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
241
|
+
|
|
242
|
+
expect(UserService.createByEmail).not.toHaveBeenCalled();
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe("TeamMemberService.onBeforeCreate - inviting somebody who already has an account", () => {
|
|
247
|
+
beforeEach(() => {
|
|
248
|
+
findUserSpy.mockResolvedValue(registeredUser());
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test("sends them to sign in", async () => {
|
|
252
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
253
|
+
|
|
254
|
+
expect(sentMail().vars["isNewUser"]).toBe("false");
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("mints no token, because there is nothing left to claim", async () => {
|
|
258
|
+
/*
|
|
259
|
+
* A registered account cannot be claimed through /signup at all, so a token
|
|
260
|
+
* for it would authorize nothing -- it would just be a spare key sitting in
|
|
261
|
+
* an inbox.
|
|
262
|
+
*/
|
|
263
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
264
|
+
|
|
265
|
+
expect(createTokenSpy).not.toHaveBeenCalled();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test("the link it does carry has no token on it", async () => {
|
|
269
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
270
|
+
|
|
271
|
+
expect(registerLink()).not.toContain("token=");
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
describe("TeamMemberService.onBeforeCreate - reading the invitee", () => {
|
|
276
|
+
test("asks for the password column, since that is what the decision turns on", async () => {
|
|
277
|
+
/*
|
|
278
|
+
* findByEmail selects only the id. Reading the invitee with it would make
|
|
279
|
+
* `user.password` undefined for everyone, and every invitation would mint a
|
|
280
|
+
* token -- including for accounts that cannot be claimed.
|
|
281
|
+
*/
|
|
282
|
+
await callHook(TeamMemberService, "onBeforeCreate", inviteBy());
|
|
283
|
+
|
|
284
|
+
const select: Record<string, unknown> = findUserSpy.mock.calls[0]![0][
|
|
285
|
+
"select"
|
|
286
|
+
] as Record<string, unknown>;
|
|
287
|
+
|
|
288
|
+
expect(select["password"]).toBe(true);
|
|
289
|
+
});
|
|
290
|
+
});
|