@oneuptime/common 13.0.8 → 14.0.1
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/AnalyticsModels/AuditLog.ts +23 -15
- package/Models/DatabaseModels/GlobalConfig.ts +24 -0
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
- package/Scripts/generate-service-worker.js +65 -4
- package/Server/API/BaseAPI.ts +26 -5
- package/Server/API/GlobalConfigAPI.ts +228 -462
- package/Server/API/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/StatusPageAPI.ts +100 -42
- package/Server/API/TeamMemberAPI.ts +10 -1
- package/Server/Enterprise/EnterpriseEdition.ts +649 -0
- package/Server/Enterprise/EnterpriseFeature.ts +48 -0
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
- package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
- package/Server/EnvironmentConfig.ts +147 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/UserAuthorization.ts +38 -16
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/DatabaseService.ts +10 -0
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +59 -6
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- package/Server/Services/ProjectService.ts +284 -0
- package/Server/Services/RumSessionPinService.ts +25 -6
- package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
- package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
- package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
- package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
- package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
- package/Server/Utils/EditionEnforcement.ts +233 -0
- package/Server/Utils/FrontendEnvironment.ts +41 -2
- package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
- package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- package/Server/Utils/Monitor/RootCauseList.ts +139 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
- package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
- package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
- package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
- package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
- package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
- package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
- package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
- package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
- package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
- package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
- package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
- package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
- package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
- package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
- package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
- package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
- package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
- package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
- package/Tests/Server/Services/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
- package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
- package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- package/Tests/Server/Types/Markdown.test.ts +183 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
- package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
- package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
- package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
- package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/API/Route.test.ts +56 -0
- package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
- package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/Icon.test.tsx +26 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
- package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
- package/Tests/Utils/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
- package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/API/Route.ts +19 -2
- package/Types/API/URL.ts +26 -2
- package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
- package/Types/Database/CanonicalModelInstance.ts +102 -0
- package/Types/Database/TableColumn.ts +20 -6
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
- package/Types/IP/IPv6.ts +6 -1
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- package/Types/Permission.ts +90 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
- package/UI/Components/Feed/FeedOptions.ts +427 -0
- package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
- package/UI/Components/Feed/useFeedItems.ts +28 -9
- package/UI/Components/Feed/useFeedOptions.ts +225 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Icon/Icon.tsx +1 -1
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- package/UI/esbuild-enterprise.js +263 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/LabelRuleImportExport.ts +27 -9
- package/Utils/Monitor/MetricValueFormatter.ts +2 -2
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
- package/Utils/Slo/SloDuration.ts +22 -6
- package/Utils/Slo/SloHealth.ts +8 -7
- package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
- package/Utils/Slo/SloOverviewText.ts +33 -0
- package/Utils/Slo/SloProjection.ts +4 -3
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
- package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
- package/build/dist/Server/API/BaseAPI.js +26 -5
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectOIDC.js +24 -16
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +24 -16
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +93 -43
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +8 -1
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +84 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.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/UserAuthorization.js +30 -11
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +71 -740
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +7 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +63 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +48 -6
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +214 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +24 -6
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +71 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -16
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +31 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
- package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +59 -11
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/API/Route.js +18 -2
- package/build/dist/Types/API/Route.js.map +1 -1
- package/build/dist/Types/API/URL.js +23 -2
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
- package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
- package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +19 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
- package/build/dist/Types/IP/IPv6.js +6 -1
- package/build/dist/Types/IP/IPv6.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
- package/build/dist/Types/Permission.js +84 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
- package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +1 -1
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HostAddressUtil.js +80 -0
- package/build/dist/Utils/HostAddressUtil.js.map +1 -0
- package/build/dist/Utils/LabelRuleImportExport.js +22 -6
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloDuration.js +13 -5
- package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +8 -7
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
- package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
- package/jest.config.json +3 -1
- package/package.json +1 -1
- package/test-setup.sh +103 -34
- package/tsconfig.json +13 -0
- package/Server/API/EnterpriseLicenseAPI.ts +0 -925
- package/Server/API/TeamComplianceAPI.ts +0 -158
- package/Server/Middleware/SCIMAuthorization.ts +0 -141
- package/Server/Services/TeamComplianceService.ts +0 -733
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
- package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
- package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
- package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
- package/build/dist/Server/Services/TeamComplianceService.js +0 -537
- package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
2
|
+
import ProjectSCIM from "../../../Models/DatabaseModels/ProjectSCIM";
|
|
3
|
+
import ProjectSso from "../../../Models/DatabaseModels/ProjectSso";
|
|
4
|
+
import User from "../../../Models/DatabaseModels/User";
|
|
5
|
+
import ProjectSCIMService from "../../../Server/Services/ProjectSCIMService";
|
|
6
|
+
import ProjectSSOService from "../../../Server/Services/ProjectSsoService";
|
|
7
|
+
import UserService from "../../../Server/Services/UserService";
|
|
8
|
+
import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
9
|
+
import { JSONArray, JSONObject } from "../../../Types/JSON";
|
|
10
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
11
|
+
import Permission, { UserPermission } from "../../../Types/Permission";
|
|
12
|
+
import UserType from "../../../Types/UserType";
|
|
13
|
+
import { describe, expect, jest, test } from "@jest/globals";
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
* WHY THIS FILE EXISTS.
|
|
17
|
+
*
|
|
18
|
+
* A project owner's POST /api/project-scim answered 200 with every column of
|
|
19
|
+
* the new row EXCEPT "_id", and the get-list that followed - selecting
|
|
20
|
+
* {_id:true, name:true} - came back as [{name}]. Nothing was wrong with the
|
|
21
|
+
* data or the query: the row carried its real `_id` in memory and `_id`
|
|
22
|
+
* reached TypeORM in the projection. The id was dropped while serializing the
|
|
23
|
+
* response, because DatabaseBaseModel.toJSONObject iterates a column list that
|
|
24
|
+
* is cached per model class, and that cache had been built from the create
|
|
25
|
+
* path's own mutilated model instance - BaseAPI.createItem deleted `_id` off
|
|
26
|
+
* it, and DatabaseService.create asks that instance for its columns
|
|
27
|
+
* (generateDefaultValues) on the way through. One create poisoned the class
|
|
28
|
+
* for the life of the process, for every later caller.
|
|
29
|
+
*
|
|
30
|
+
* These tests drive the real services with a mocked repository - no database -
|
|
31
|
+
* and deliberately delete `_id` off the model handed to create(), which is
|
|
32
|
+
* what the API used to do. They assert the whole round trip keeps its ids
|
|
33
|
+
* anyway. Each test uses a different model because the caches are per class
|
|
34
|
+
* and per process: reusing one would leave a warm cache and pass vacuously.
|
|
35
|
+
*
|
|
36
|
+
* Three callers, because of how the create path's accidental mitigation
|
|
37
|
+
* behaves. enforceTenantRelationMatchesScalar runs two lines before
|
|
38
|
+
* generateDefaultValues and warms the cache from the service's own healthy
|
|
39
|
+
* model, so it hides the bug for some callers and not others:
|
|
40
|
+
* a) a project owner on a tenant-scoped model - COVERED by that mitigation,
|
|
41
|
+
* so this case passes even with the fix reverted. It is here as the
|
|
42
|
+
* shape of the reported incident and to keep it working, not as the
|
|
43
|
+
* test that catches a regression: the live incident needed an earlier
|
|
44
|
+
* poisoning create (b or c) to have happened in the same process first.
|
|
45
|
+
* b) an isRoot caller, which returns before that guard runs - this one
|
|
46
|
+
* fails without the fix
|
|
47
|
+
* c) a REFUSED create on a model with no tenant column - also fails without
|
|
48
|
+
* the fix, and proves that a request nobody was allowed to make cannot
|
|
49
|
+
* poison anything, since the columns are read ~20 lines before the
|
|
50
|
+
* create permission check
|
|
51
|
+
*
|
|
52
|
+
* The instance-independence invariant itself is pinned by
|
|
53
|
+
* Tests/Types/Database/CanonicalModelInstance.test.ts, which fails for every
|
|
54
|
+
* model if the fix regresses. These three are the end-to-end evidence.
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
58
|
+
"aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
|
|
59
|
+
);
|
|
60
|
+
const USER_ID: ObjectID = new ObjectID("bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb");
|
|
61
|
+
const ROW_ID: string = "22222222-2222-4222-8222-222222222222";
|
|
62
|
+
|
|
63
|
+
function ownerProps(): DatabaseCommonInteractionProps {
|
|
64
|
+
const permissions: Array<UserPermission> = [
|
|
65
|
+
Permission.ProjectOwner,
|
|
66
|
+
Permission.ProjectAdmin,
|
|
67
|
+
Permission.ProjectMember,
|
|
68
|
+
].map((permission: Permission) => {
|
|
69
|
+
return {
|
|
70
|
+
permission: permission,
|
|
71
|
+
labelIds: [],
|
|
72
|
+
isBlockPermission: false,
|
|
73
|
+
_type: "UserPermission" as const,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
userId: USER_ID,
|
|
79
|
+
tenantId: PROJECT_ID,
|
|
80
|
+
userType: UserType.User,
|
|
81
|
+
userTenantAccessPermission: {
|
|
82
|
+
[PROJECT_ID.toString()]: {
|
|
83
|
+
projectId: PROJECT_ID,
|
|
84
|
+
permissions: permissions,
|
|
85
|
+
_type: "UserTenantAccessPermission",
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function loggedInUserProps(): DatabaseCommonInteractionProps {
|
|
92
|
+
return {
|
|
93
|
+
...ownerProps(),
|
|
94
|
+
userGlobalAccessPermission: {
|
|
95
|
+
projectIds: [PROJECT_ID],
|
|
96
|
+
globalPermissions: [Permission.CurrentUser],
|
|
97
|
+
_type: "UserGlobalAccessPermission",
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
* Stands in for Postgres: `save` stamps the generated uuid onto the entity the
|
|
104
|
+
* way the driver writes it back, and `find` returns a row that has one.
|
|
105
|
+
*/
|
|
106
|
+
function mockRepository(
|
|
107
|
+
service: unknown,
|
|
108
|
+
modelType: { new (): BaseModel },
|
|
109
|
+
rowFields: JSONObject,
|
|
110
|
+
): void {
|
|
111
|
+
const repository: Record<string, unknown> = {
|
|
112
|
+
save: async (entity: BaseModel): Promise<BaseModel> => {
|
|
113
|
+
entity._id = ROW_ID;
|
|
114
|
+
return entity;
|
|
115
|
+
},
|
|
116
|
+
find: async (): Promise<Array<BaseModel>> => {
|
|
117
|
+
const row: BaseModel = new modelType();
|
|
118
|
+
row._id = ROW_ID;
|
|
119
|
+
Object.assign(row, rowFields);
|
|
120
|
+
return [row];
|
|
121
|
+
},
|
|
122
|
+
findOneBy: async (): Promise<null> => {
|
|
123
|
+
return null;
|
|
124
|
+
},
|
|
125
|
+
count: async (): Promise<number> => {
|
|
126
|
+
return 0;
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
jest
|
|
131
|
+
.spyOn(service as never, "getRepository" as never)
|
|
132
|
+
.mockReturnValue(repository as never);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* What BaseAPI.createItem used to hand the service: `_id` deleted outright. */
|
|
136
|
+
function payloadWithIdDeleted<T extends BaseModel>(
|
|
137
|
+
json: JSONObject,
|
|
138
|
+
modelType: { new (): T },
|
|
139
|
+
): T {
|
|
140
|
+
const item: T = BaseModel.fromJSON<T>(json, modelType) as T;
|
|
141
|
+
delete (item as unknown as Record<string, unknown>)["_id"];
|
|
142
|
+
|
|
143
|
+
return item;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
describe("create and read responses keep their _id", () => {
|
|
147
|
+
test("a project owner creating and then listing a tenant-scoped model (the incident's shape; the create path's tenant guard already covered this one)", async () => {
|
|
148
|
+
mockRepository(ProjectSCIMService, ProjectSCIM, { name: "listed scim" });
|
|
149
|
+
|
|
150
|
+
const savedItem: ProjectSCIM = await ProjectSCIMService.create({
|
|
151
|
+
data: payloadWithIdDeleted<ProjectSCIM>(
|
|
152
|
+
{
|
|
153
|
+
name: "created scim",
|
|
154
|
+
projectId: PROJECT_ID.toString(),
|
|
155
|
+
bearerToken: "scim-token",
|
|
156
|
+
},
|
|
157
|
+
ProjectSCIM,
|
|
158
|
+
),
|
|
159
|
+
props: ownerProps(),
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
const createResponse: JSONObject = BaseModel.toJSON(savedItem, ProjectSCIM);
|
|
163
|
+
|
|
164
|
+
expect(savedItem._id).toBe(ROW_ID);
|
|
165
|
+
expect(createResponse["_id"]).toBe(ROW_ID);
|
|
166
|
+
|
|
167
|
+
const rows: Array<ProjectSCIM> = await ProjectSCIMService.findBy({
|
|
168
|
+
query: { projectId: PROJECT_ID },
|
|
169
|
+
select: { _id: true, name: true } as never,
|
|
170
|
+
limit: 50,
|
|
171
|
+
skip: 0,
|
|
172
|
+
props: ownerProps(),
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
const listResponse: JSONArray = BaseModel.toJSONObjectArray(
|
|
176
|
+
rows,
|
|
177
|
+
ProjectSCIM,
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
expect(rows[0]?._id).toBe(ROW_ID);
|
|
181
|
+
expect((listResponse[0] as JSONObject)["_id"]).toBe(ROW_ID);
|
|
182
|
+
expect((listResponse[0] as JSONObject)["name"]).toBe("listed scim");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("an isRoot caller creating, then a project owner listing", async () => {
|
|
186
|
+
/*
|
|
187
|
+
* isRoot returns from enforceTenantRelationMatchesScalar before it can
|
|
188
|
+
* warm the column cache, so on master this create was the first thing to
|
|
189
|
+
* describe the class - and it described it without an id.
|
|
190
|
+
*/
|
|
191
|
+
mockRepository(ProjectSSOService, ProjectSso, { name: "listed sso" });
|
|
192
|
+
|
|
193
|
+
const savedItem: ProjectSso = await ProjectSSOService.create({
|
|
194
|
+
data: payloadWithIdDeleted<ProjectSso>(
|
|
195
|
+
{
|
|
196
|
+
name: "created sso",
|
|
197
|
+
description: "created by the root caller",
|
|
198
|
+
projectId: PROJECT_ID.toString(),
|
|
199
|
+
signatureMethod: "RSA-SHA256",
|
|
200
|
+
digestMethod: "SHA256",
|
|
201
|
+
signOnURL: "https://example.com/sso",
|
|
202
|
+
issuerURL: "https://example.com",
|
|
203
|
+
publicCertificate: "a-certificate",
|
|
204
|
+
},
|
|
205
|
+
ProjectSso,
|
|
206
|
+
),
|
|
207
|
+
props: { isRoot: true },
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
expect(BaseModel.toJSON(savedItem, ProjectSso)["_id"]).toBe(ROW_ID);
|
|
211
|
+
|
|
212
|
+
const rows: Array<ProjectSso> = await ProjectSSOService.findBy({
|
|
213
|
+
query: { projectId: PROJECT_ID },
|
|
214
|
+
select: { _id: true, name: true } as never,
|
|
215
|
+
limit: 50,
|
|
216
|
+
skip: 0,
|
|
217
|
+
props: ownerProps(),
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
const listResponse: JSONArray = BaseModel.toJSONObjectArray(
|
|
221
|
+
rows,
|
|
222
|
+
ProjectSso,
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
expect((listResponse[0] as JSONObject)["_id"]).toBe(ROW_ID);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test("a REFUSED create on a model with no tenant column cannot strip ids from later reads", async () => {
|
|
229
|
+
/*
|
|
230
|
+
* User.create is `[]` - nobody may POST /api/user - and User has no
|
|
231
|
+
* @TenantColumn, so neither the permission check nor the tenant guard
|
|
232
|
+
* stood between the request and the column cache. One authenticated POST
|
|
233
|
+
* that always 4xxs was enough to strip `_id` from every User response the
|
|
234
|
+
* process served afterwards.
|
|
235
|
+
*/
|
|
236
|
+
mockRepository(UserService, User, {
|
|
237
|
+
email: { _type: "Email", value: "someone@example.com" },
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
await expect(
|
|
241
|
+
UserService.create({
|
|
242
|
+
data: payloadWithIdDeleted<User>(
|
|
243
|
+
{ email: "attacker@example.com" },
|
|
244
|
+
User,
|
|
245
|
+
),
|
|
246
|
+
props: loggedInUserProps(),
|
|
247
|
+
}),
|
|
248
|
+
).rejects.toThrow(/not allowed/i);
|
|
249
|
+
|
|
250
|
+
const rows: Array<User> = await UserService.findBy({
|
|
251
|
+
query: { _id: USER_ID.toString() } as never,
|
|
252
|
+
select: { _id: true, email: true } as never,
|
|
253
|
+
limit: 10,
|
|
254
|
+
skip: 0,
|
|
255
|
+
props: loggedInUserProps(),
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
const listResponse: JSONArray = BaseModel.toJSONObjectArray(rows, User);
|
|
259
|
+
|
|
260
|
+
expect(rows[0]?._id).toBe(ROW_ID);
|
|
261
|
+
expect((listResponse[0] as JSONObject)["_id"]).toBe(ROW_ID);
|
|
262
|
+
});
|
|
263
|
+
});
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import AlertReminderRule from "../../../Models/DatabaseModels/AlertReminderRule";
|
|
2
2
|
import StatusPageMonitorRule from "../../../Models/DatabaseModels/StatusPageMonitorRule";
|
|
3
|
+
import ServiceLevelObjectiveMonitorRule from "../../../Models/DatabaseModels/ServiceLevelObjectiveMonitorRule";
|
|
4
|
+
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
3
5
|
import DatabaseService from "../../../Server/Services/DatabaseService";
|
|
4
6
|
import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
5
7
|
import FilterCondition from "../../../Types/Filter/FilterCondition";
|
|
@@ -520,3 +522,105 @@ describe("DatabaseService rule criteria validation", () => {
|
|
|
520
522
|
);
|
|
521
523
|
});
|
|
522
524
|
});
|
|
525
|
+
|
|
526
|
+
describe("DatabaseService SLO monitor type criteria validation", () => {
|
|
527
|
+
const sloService: DatabaseService<ServiceLevelObjectiveMonitorRule> =
|
|
528
|
+
new DatabaseService<ServiceLevelObjectiveMonitorRule>(
|
|
529
|
+
ServiceLevelObjectiveMonitorRule,
|
|
530
|
+
);
|
|
531
|
+
const sanitizeSlo: SanitizeFunction = async (
|
|
532
|
+
data: unknown,
|
|
533
|
+
props: DatabaseCommonInteractionProps = { isRoot: true },
|
|
534
|
+
isUpdate: boolean = true,
|
|
535
|
+
): Promise<JSONObject> => {
|
|
536
|
+
return (await (
|
|
537
|
+
sloService as unknown as { sanitizeCreateOrUpdate: SanitizeFunction }
|
|
538
|
+
).sanitizeCreateOrUpdate(data, props, isUpdate)) as JSONObject;
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
it.each([true, false])(
|
|
542
|
+
"persists valid type criteria with a fail-closed compatibility shadow on update=%p",
|
|
543
|
+
async (isUpdate: boolean) => {
|
|
544
|
+
const criteria: JSONObject = criteriaFor({
|
|
545
|
+
field: "monitorType",
|
|
546
|
+
operator: RuleCriteriaOperator.Equals,
|
|
547
|
+
value: MonitorType.Docker,
|
|
548
|
+
});
|
|
549
|
+
const result: JSONObject = await sanitizeSlo(
|
|
550
|
+
{
|
|
551
|
+
criteria,
|
|
552
|
+
monitorType: MonitorType.API,
|
|
553
|
+
monitorNamePattern: ".*",
|
|
554
|
+
monitorLabels: ["11111111-1111-4111-8111-111111111111"],
|
|
555
|
+
},
|
|
556
|
+
{ isRoot: true },
|
|
557
|
+
isUpdate,
|
|
558
|
+
);
|
|
559
|
+
expect(result).toMatchObject({
|
|
560
|
+
criteria,
|
|
561
|
+
monitorType: null,
|
|
562
|
+
monitorNamePattern: "(?!)",
|
|
563
|
+
});
|
|
564
|
+
expect(result["monitorLabels"]).toBeUndefined();
|
|
565
|
+
},
|
|
566
|
+
);
|
|
567
|
+
|
|
568
|
+
it.each(Object.values(MonitorType))(
|
|
569
|
+
"accepts equality and inequality for %s",
|
|
570
|
+
async (monitorType: MonitorType) => {
|
|
571
|
+
for (const operator of [
|
|
572
|
+
RuleCriteriaOperator.Equals,
|
|
573
|
+
RuleCriteriaOperator.NotEquals,
|
|
574
|
+
]) {
|
|
575
|
+
await expect(
|
|
576
|
+
sanitizeSlo({
|
|
577
|
+
criteria: criteriaFor({
|
|
578
|
+
field: "monitorType",
|
|
579
|
+
operator,
|
|
580
|
+
value: monitorType,
|
|
581
|
+
}),
|
|
582
|
+
}),
|
|
583
|
+
).resolves.toBeDefined();
|
|
584
|
+
}
|
|
585
|
+
},
|
|
586
|
+
);
|
|
587
|
+
|
|
588
|
+
it.each(["Unknown", "api", "API.*", 1, true])(
|
|
589
|
+
"rejects invalid type value %p",
|
|
590
|
+
async (value: string | number | boolean) => {
|
|
591
|
+
await expect(
|
|
592
|
+
sanitizeSlo({
|
|
593
|
+
criteria: criteriaFor({
|
|
594
|
+
field: "monitorType",
|
|
595
|
+
operator: RuleCriteriaOperator.NotEquals,
|
|
596
|
+
value,
|
|
597
|
+
}),
|
|
598
|
+
}),
|
|
599
|
+
).rejects.toThrow("valid monitor type");
|
|
600
|
+
},
|
|
601
|
+
);
|
|
602
|
+
|
|
603
|
+
it.each([
|
|
604
|
+
RuleCriteriaOperator.Contains,
|
|
605
|
+
RuleCriteriaOperator.DoesNotContain,
|
|
606
|
+
RuleCriteriaOperator.StartsWith,
|
|
607
|
+
RuleCriteriaOperator.EndsWith,
|
|
608
|
+
RuleCriteriaOperator.MatchesPattern,
|
|
609
|
+
RuleCriteriaOperator.DoesNotMatchPattern,
|
|
610
|
+
RuleCriteriaOperator.HasAnyOf,
|
|
611
|
+
RuleCriteriaOperator.HasAllOf,
|
|
612
|
+
RuleCriteriaOperator.HasNoneOf,
|
|
613
|
+
])(
|
|
614
|
+
"rejects unsupported type operator %s",
|
|
615
|
+
async (operator: RuleCriteriaOperator) => {
|
|
616
|
+
const value: string | Array<string> = operator.startsWith("Has")
|
|
617
|
+
? [MonitorType.API]
|
|
618
|
+
: MonitorType.API;
|
|
619
|
+
await expect(
|
|
620
|
+
sanitizeSlo({
|
|
621
|
+
criteria: criteriaFor({ field: "monitorType", operator, value }),
|
|
622
|
+
}),
|
|
623
|
+
).rejects.toThrow("only support Equals");
|
|
624
|
+
},
|
|
625
|
+
);
|
|
626
|
+
});
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import EnterpriseLicenseService, {
|
|
2
|
+
ENTERPRISE_LICENSE_KEY_RANDOM_BYTES,
|
|
3
|
+
generateEnterpriseLicenseKey,
|
|
4
|
+
} from "../../../Server/Services/EnterpriseLicenseService";
|
|
5
|
+
import { OnCreate } from "../../../Server/Types/Database/Hooks";
|
|
6
|
+
import EnterpriseLicense from "../../../Models/DatabaseModels/EnterpriseLicense";
|
|
7
|
+
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
8
|
+
import ColumnLength from "../../../Types/Database/ColumnLength";
|
|
9
|
+
import crypto from "crypto";
|
|
10
|
+
import { afterEach, describe, expect, it, jest } from "@jest/globals";
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* License keys are generated on the SERVER when the admin leaves the field
|
|
14
|
+
* blank. They used to be made in the browser (UUID.generate() in the Admin
|
|
15
|
+
* Dashboard's create form), so the only randomness guarding a customer's
|
|
16
|
+
* license came from whatever the admin's browser supplied.
|
|
17
|
+
*
|
|
18
|
+
* Pinned: a blank key becomes 32 CSPRNG bytes (64 hex characters, within the
|
|
19
|
+
* ShortText column), a typed key is kept (trimmed - installations trim what
|
|
20
|
+
* they send, so stored whitespace would make a key unmatchable), and the hook
|
|
21
|
+
* runs in onBeforeCreate - before DatabaseService's required-column check,
|
|
22
|
+
* which would otherwise reject the blank key.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
type RunBeforeCreateFunction = (
|
|
26
|
+
license: EnterpriseLicense,
|
|
27
|
+
) => Promise<EnterpriseLicense>;
|
|
28
|
+
|
|
29
|
+
const runBeforeCreate: RunBeforeCreateFunction = async (
|
|
30
|
+
license: EnterpriseLicense,
|
|
31
|
+
): Promise<EnterpriseLicense> => {
|
|
32
|
+
const result: OnCreate<EnterpriseLicense> = await (
|
|
33
|
+
EnterpriseLicenseService as unknown as {
|
|
34
|
+
onBeforeCreate: (
|
|
35
|
+
createBy: unknown,
|
|
36
|
+
) => Promise<OnCreate<EnterpriseLicense>>;
|
|
37
|
+
}
|
|
38
|
+
).onBeforeCreate({
|
|
39
|
+
data: license,
|
|
40
|
+
props: { isRoot: true },
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
return result.createBy.data;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const HEX_KEY: RegExp = /^[0-9a-f]{64}$/;
|
|
47
|
+
|
|
48
|
+
describe("EnterpriseLicenseService license key generation", () => {
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
jest.restoreAllMocks();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe("generateEnterpriseLicenseKey", () => {
|
|
54
|
+
it("is 32 random bytes written as 64 lower-case hex characters", () => {
|
|
55
|
+
expect(ENTERPRISE_LICENSE_KEY_RANDOM_BYTES).toBe(32);
|
|
56
|
+
expect(generateEnterpriseLicenseKey()).toMatch(HEX_KEY);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("fits the licenseKey column", () => {
|
|
60
|
+
expect(generateEnterpriseLicenseKey().length).toBeLessThanOrEqual(
|
|
61
|
+
ColumnLength.ShortText,
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("comes from crypto.randomBytes", () => {
|
|
66
|
+
const randomBytes: ReturnType<typeof jest.spyOn> = jest.spyOn(
|
|
67
|
+
crypto,
|
|
68
|
+
"randomBytes",
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
generateEnterpriseLicenseKey();
|
|
72
|
+
|
|
73
|
+
expect(randomBytes).toHaveBeenCalledWith(32);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("never repeats", () => {
|
|
77
|
+
const keys: Set<string> = new Set<string>();
|
|
78
|
+
|
|
79
|
+
for (let index: number = 0; index < 500; index++) {
|
|
80
|
+
keys.add(generateEnterpriseLicenseKey());
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
expect(keys.size).toBe(500);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
describe("onBeforeCreate", () => {
|
|
88
|
+
it("generates a key when the admin left it out entirely", async () => {
|
|
89
|
+
const license: EnterpriseLicense = BaseModel.fromJSON(
|
|
90
|
+
{ companyName: "Acme, Inc.", expiresAt: "2027-01-01" },
|
|
91
|
+
EnterpriseLicense,
|
|
92
|
+
) as EnterpriseLicense;
|
|
93
|
+
|
|
94
|
+
expect((await runBeforeCreate(license)).licenseKey).toMatch(HEX_KEY);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it.each([
|
|
98
|
+
["an empty string", ""],
|
|
99
|
+
["whitespace", " \t "],
|
|
100
|
+
])(
|
|
101
|
+
"generates a key when the admin submitted %s",
|
|
102
|
+
async (_label: string, licenseKey: string) => {
|
|
103
|
+
const license: EnterpriseLicense = new EnterpriseLicense();
|
|
104
|
+
license.companyName = "Acme, Inc.";
|
|
105
|
+
license.licenseKey = licenseKey;
|
|
106
|
+
|
|
107
|
+
expect((await runBeforeCreate(license)).licenseKey).toMatch(HEX_KEY);
|
|
108
|
+
},
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
it("keeps a key the admin typed, trimmed", async () => {
|
|
112
|
+
const license: EnterpriseLicense = new EnterpriseLicense();
|
|
113
|
+
license.companyName = "Acme, Inc.";
|
|
114
|
+
license.licenseKey = " b6f4c1a2-1111-2222-3333-444455556666\n";
|
|
115
|
+
|
|
116
|
+
expect((await runBeforeCreate(license)).licenseKey).toBe(
|
|
117
|
+
"b6f4c1a2-1111-2222-3333-444455556666",
|
|
118
|
+
);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("gives two blank-key licenses different keys", async () => {
|
|
122
|
+
const first: EnterpriseLicense = new EnterpriseLicense();
|
|
123
|
+
const second: EnterpriseLicense = new EnterpriseLicense();
|
|
124
|
+
|
|
125
|
+
expect((await runBeforeCreate(first)).licenseKey).not.toBe(
|
|
126
|
+
(await runBeforeCreate(second)).licenseKey,
|
|
127
|
+
);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("hands the same create request on, with nothing carried forward", async () => {
|
|
131
|
+
const license: EnterpriseLicense = new EnterpriseLicense();
|
|
132
|
+
const createBy: { data: EnterpriseLicense; props: { isRoot: boolean } } =
|
|
133
|
+
{
|
|
134
|
+
data: license,
|
|
135
|
+
props: { isRoot: true },
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const result: OnCreate<EnterpriseLicense> = await (
|
|
139
|
+
EnterpriseLicenseService as unknown as {
|
|
140
|
+
onBeforeCreate: (
|
|
141
|
+
createBy: unknown,
|
|
142
|
+
) => Promise<OnCreate<EnterpriseLicense>>;
|
|
143
|
+
}
|
|
144
|
+
).onBeforeCreate(createBy);
|
|
145
|
+
|
|
146
|
+
expect(result.createBy).toBe(createBy);
|
|
147
|
+
expect(result.createBy.data).toBe(license);
|
|
148
|
+
expect(result.carryForward).toBeUndefined();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
});
|