@oneuptime/common 10.4.16 → 10.5.0
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/ExceptionInstance.ts +24 -0
- package/Models/AnalyticsModels/Log.ts +16 -0
- package/Models/AnalyticsModels/Metric.ts +31 -0
- package/Models/AnalyticsModels/MonitorLog.ts +5 -0
- package/Models/AnalyticsModels/Profile.ts +25 -0
- package/Models/AnalyticsModels/ProfileSample.ts +20 -0
- package/Models/AnalyticsModels/Span.ts +23 -0
- package/Models/DatabaseModels/AlertEpisodeMember.ts +2 -0
- package/Models/DatabaseModels/AlertGroupingRule.ts +0 -38
- package/Models/DatabaseModels/AlertLabelRule.ts +152 -0
- package/Models/DatabaseModels/AlertOwnerRule.ts +114 -0
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +7 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +2 -0
- package/Models/DatabaseModels/IncidentGroupingRule.ts +0 -38
- package/Models/DatabaseModels/IncidentLabelRule.ts +114 -0
- package/Models/DatabaseModels/IncidentMember.ts +2 -0
- package/Models/DatabaseModels/IncidentOwnerRule.ts +114 -0
- package/Models/DatabaseModels/IncidentSla.ts +2 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +224 -0
- package/Models/DatabaseModels/Index.ts +2 -2
- package/Models/DatabaseModels/MetricPipelineRule.ts +2 -0
- package/Models/DatabaseModels/MonitorProbe.ts +2 -0
- package/Models/DatabaseModels/MonitorTest.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +2 -0
- package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +2 -0
- package/Models/DatabaseModels/ProjectOidc.ts +4 -0
- package/Models/DatabaseModels/ProjectSCIM.ts +4 -0
- package/Models/DatabaseModels/ProjectSso.ts +4 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +220 -0
- package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +152 -0
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +152 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +224 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +6 -0
- package/Models/DatabaseModels/StatusPageSCIM.ts +4 -0
- package/Models/DatabaseModels/StatusPageSCIMLog.ts +2 -0
- package/Models/DatabaseModels/StatusPageSso.ts +6 -0
- package/Models/DatabaseModels/Team.ts +41 -0
- package/Models/DatabaseModels/TeamComplianceSetting.ts +4 -0
- package/Models/DatabaseModels/{ServiceMonitor.ts → TeamCustomField.ts} +95 -200
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
- package/Models/DatabaseModels/WorkflowLog.ts +2 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +2 -0
- package/Server/EnvironmentConfig.ts +3 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.ts +160 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.ts +197 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.ts +36 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.ts +128 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.ts +73 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.ts +62 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Middleware/TelemetryIngestionDisabled.ts +32 -0
- package/Server/Services/AlertGroupingEngineService.ts +0 -29
- package/Server/Services/AlertLabelRuleEngineService.ts +129 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +205 -1
- package/Server/Services/IncidentGroupingEngineService.ts +0 -37
- package/Server/Services/IncidentLabelRuleEngineService.ts +83 -0
- package/Server/Services/IncidentOwnerRuleEngineService.ts +208 -10
- package/Server/Services/IncidentService.ts +139 -1
- package/Server/Services/Index.ts +0 -2
- package/Server/Services/MonitorProbeService.ts +56 -0
- package/Server/Services/MonitorService.ts +55 -0
- package/Server/Services/ProjectService.ts +17 -8
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +129 -0
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +289 -7
- package/Server/Services/StatusPageService.ts +30 -0
- package/Server/Services/TeamCustomFieldService.ts +9 -0
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +226 -28
- package/Server/Types/Database/Permissions/EditionPermission.ts +46 -0
- package/Server/Types/Database/Permissions/TablePermission.ts +8 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +35 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +244 -34
- package/Tests/Server/Middleware/UserAuthorization.test.ts +11 -19
- package/Tests/Types/Permission.test.ts +129 -1
- package/Types/Accounts/AccountsLanguage.ts +10 -1
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +10 -1
- package/Types/BaseDatabase/TableEditionAccessControl.ts +3 -0
- package/Types/Dashboard/DashboardLanguage.ts +10 -1
- package/Types/Database/AccessControl/TableEditionAccessControl.ts +8 -0
- package/Types/Date.ts +1 -1
- package/Types/Docs/DocsLanguage.ts +10 -1
- package/Types/Permission.ts +87 -54
- package/Types/StatusPage/StatusPageLanguage.ts +10 -1
- package/UI/Components/Charts/Area/AreaChart.tsx +1 -1
- package/UI/Components/Charts/Bar/BarChart.tsx +1 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +5 -1
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +1 -1
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +11 -1
- package/UI/Components/Charts/Line/LineChart.tsx +1 -1
- package/UI/Components/Charts/Utils/XAxis.ts +21 -48
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +1808 -0
- package/UI/Components/Forms/Fields/FormField.tsx +69 -29
- package/UI/Components/Link/Link.tsx +13 -1
- package/UI/Components/ModelDetail/ModelDetail.tsx +20 -19
- package/UI/Components/ModelTable/BaseModelTable.tsx +5 -0
- package/UI/Utils/User.ts +16 -0
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +39 -2
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Log.js +16 -0
- package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Metric.js +31 -0
- package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MonitorLog.js +5 -0
- package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Profile.js +40 -2
- package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ProfileSample.js +35 -2
- package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +23 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +2 -0
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +0 -39
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js +156 -0
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +117 -0
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +0 -39
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +117 -0
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentMember.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +117 -0
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSla.js +2 -0
- package/build/dist/Models/DatabaseModels/IncidentSla.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +216 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -2
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricPipelineRule.js +2 -0
- package/build/dist/Models/DatabaseModels/MetricPipelineRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorProbe.js +2 -0
- package/build/dist/Models/DatabaseModels/MonitorProbe.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTest.js +2 -0
- package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOidc.js +4 -0
- package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectSCIM.js +4 -0
- package/build/dist/Models/DatabaseModels/ProjectSCIM.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectSso.js +4 -0
- package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +216 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +156 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +156 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +216 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +6 -0
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSCIM.js +4 -0
- package/build/dist/Models/DatabaseModels/StatusPageSCIM.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js +2 -0
- package/build/dist/Models/DatabaseModels/StatusPageSCIMLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSso.js +6 -0
- package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Team.js +42 -0
- package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +4 -0
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/{ServiceMonitor.js → TeamCustomField.js} +108 -209
- package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLog.js +2 -0
- package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +2 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779392865146-AddAgentVersionToKubernetesDockerHost.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779653508434-AddLabelInheritanceAndScheduledMaintenanceResources.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js +74 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779708719656-AddAffectedResourcesToTemplates.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779739410559-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779742211961-AttachServiceToScheduledMaintenanceTemplatesAndLabelRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779790539196-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779823516881-ExpandOwnerRuleInheritFlags.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1779827700000-RenameStatusPageZhToZhCN.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js +22 -0
- package/build/dist/Server/Middleware/TelemetryIngestionDisabled.js.map +1 -0
- package/build/dist/Server/Services/AlertGroupingEngineService.js +0 -25
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +117 -3
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +175 -5
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +0 -31
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +76 -3
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +176 -14
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +104 -1
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +0 -2
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +46 -0
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +40 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +17 -8
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +117 -3
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +245 -10
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +24 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamCustomFieldService.js +9 -0
- package/build/dist/Server/Services/TeamCustomFieldService.js.map +1 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +166 -26
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +45 -0
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -0
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +7 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +200 -31
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +8 -15
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
- package/build/dist/Tests/Types/Permission.test.js +90 -1
- package/build/dist/Tests/Types/Permission.test.js.map +1 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js +10 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +10 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
- package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js +2 -0
- package/build/dist/Types/BaseDatabase/TableEditionAccessControl.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js +10 -1
- package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js +6 -0
- package/build/dist/Types/Database/AccessControl/TableEditionAccessControl.js.map +1 -0
- package/build/dist/Types/Date.js +1 -1
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Docs/DocsLanguage.js +10 -1
- package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
- package/build/dist/Types/Permission.js +80 -44
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +10 -1
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +5 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +11 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +21 -47
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +1125 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +28 -10
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Link/Link.js +11 -2
- package/build/dist/UI/Components/Link/Link.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +20 -18
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Utils/User.js +13 -0
- package/build/dist/UI/Utils/User.js.map +1 -1
- package/package.json +1 -1
- package/Server/Services/ServiceMonitorService.ts +0 -57
- package/build/dist/Models/DatabaseModels/ServiceMonitor.js.map +0 -1
- package/build/dist/Server/Services/ServiceMonitorService.js +0 -56
- package/build/dist/Server/Services/ServiceMonitorService.js.map +0 -1
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import DockerHost from "../../../Models/DatabaseModels/DockerHost";
|
|
1
2
|
import Host from "../../../Models/DatabaseModels/Host";
|
|
2
3
|
import Incident from "../../../Models/DatabaseModels/Incident";
|
|
3
4
|
import IncidentSeverity from "../../../Models/DatabaseModels/IncidentSeverity";
|
|
4
5
|
import IncidentStateTimeline from "../../../Models/DatabaseModels/IncidentStateTimeline";
|
|
5
6
|
import IncidentMember from "../../../Models/DatabaseModels/IncidentMember";
|
|
7
|
+
import KubernetesCluster from "../../../Models/DatabaseModels/KubernetesCluster";
|
|
6
8
|
import Label from "../../../Models/DatabaseModels/Label";
|
|
7
9
|
import Monitor from "../../../Models/DatabaseModels/Monitor";
|
|
8
10
|
import OnCallDutyPolicy from "../../../Models/DatabaseModels/OnCallDutyPolicy";
|
|
11
|
+
import Service from "../../../Models/DatabaseModels/Service";
|
|
12
|
+
import Includes from "../../../Types/BaseDatabase/Includes";
|
|
9
13
|
import SortOrder from "../../../Types/BaseDatabase/SortOrder";
|
|
10
14
|
import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
|
|
11
15
|
import Dictionary from "../../../Types/Dictionary";
|
|
@@ -16,8 +20,11 @@ import ObjectID from "../../../Types/ObjectID";
|
|
|
16
20
|
import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
|
|
17
21
|
import { TelemetryQuery } from "../../../Types/Telemetry/TelemetryQuery";
|
|
18
22
|
import { DisableAutomaticIncidentCreation } from "../../EnvironmentConfig";
|
|
23
|
+
import DockerHostService from "../../Services/DockerHostService";
|
|
19
24
|
import HostService from "../../Services/HostService";
|
|
20
25
|
import IncidentService from "../../Services/IncidentService";
|
|
26
|
+
import KubernetesClusterService from "../../Services/KubernetesClusterService";
|
|
27
|
+
import ServiceService from "../../Services/ServiceService";
|
|
21
28
|
import IncidentSeverityService from "../../Services/IncidentSeverityService";
|
|
22
29
|
import IncidentStateTimelineService from "../../Services/IncidentStateTimelineService";
|
|
23
30
|
import IncidentMemberService from "../../Services/IncidentMemberService";
|
|
@@ -316,40 +323,11 @@ export default class MonitorIncident {
|
|
|
316
323
|
if (seriesLabels && Object.keys(seriesLabels).length > 0) {
|
|
317
324
|
incident.seriesLabels = seriesLabels;
|
|
318
325
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
* ClickHouse, so the group-by dropdown surfaces
|
|
325
|
-
* `resource.host.name` — but accept the bare `host.name` too
|
|
326
|
-
* for any non-OTel ingest paths.
|
|
327
|
-
*/
|
|
328
|
-
const hostName: string | undefined =
|
|
329
|
-
typeof seriesLabels["resource.host.name"] === "string"
|
|
330
|
-
? (seriesLabels["resource.host.name"] as string)
|
|
331
|
-
: typeof seriesLabels["host.name"] === "string"
|
|
332
|
-
? (seriesLabels["host.name"] as string)
|
|
333
|
-
: undefined;
|
|
334
|
-
|
|
335
|
-
if (hostName) {
|
|
336
|
-
const host: Host | null = await HostService.findOneBy({
|
|
337
|
-
query: {
|
|
338
|
-
projectId: input.monitor.projectId!,
|
|
339
|
-
hostIdentifier: hostName,
|
|
340
|
-
},
|
|
341
|
-
select: {
|
|
342
|
-
_id: true,
|
|
343
|
-
},
|
|
344
|
-
props: {
|
|
345
|
-
isRoot: true,
|
|
346
|
-
},
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
if (host) {
|
|
350
|
-
incident.hosts = [host];
|
|
351
|
-
}
|
|
352
|
-
}
|
|
326
|
+
await this.linkResourceContextFromSeries({
|
|
327
|
+
incident,
|
|
328
|
+
seriesLabels,
|
|
329
|
+
projectId: input.monitor.projectId!,
|
|
330
|
+
});
|
|
353
331
|
}
|
|
354
332
|
|
|
355
333
|
incident.onCallDutyPolicies =
|
|
@@ -494,6 +472,238 @@ export default class MonitorIncident {
|
|
|
494
472
|
}
|
|
495
473
|
}
|
|
496
474
|
|
|
475
|
+
/*
|
|
476
|
+
* Pull every host / docker-host / k8s-cluster identifier out of the
|
|
477
|
+
* series labels and attach the matching project-scoped records to
|
|
478
|
+
* the incident. Series labels carry both raw OTel resource
|
|
479
|
+
* attributes (`host.name`, `k8s.cluster.name`) and the OneUptime
|
|
480
|
+
* stamps added at ingest (`oneuptime.host.id`,
|
|
481
|
+
* `oneuptime.docker.host.id`, `oneuptime.kubernetes.cluster.id` and
|
|
482
|
+
* their `.name` twins). OTel resource attributes are stored under
|
|
483
|
+
* the `resource.` prefix in ClickHouse, so prefixed and unprefixed
|
|
484
|
+
* forms are both accepted — whichever the group-by query surfaced,
|
|
485
|
+
* we'll find it. Multi-value labels are flattened, so a series that
|
|
486
|
+
* groups by a multi-valued attribute attaches every matching
|
|
487
|
+
* record. Lookups are always project-scoped so a stale or hostile
|
|
488
|
+
* stamp can't pull in a record from another tenant.
|
|
489
|
+
*
|
|
490
|
+
* For Docker hosts we deliberately ignore raw `host.name`/
|
|
491
|
+
* `oneuptime.host.name`: those are the Host's territory, and the
|
|
492
|
+
* ingest pipeline stamps `oneuptime.docker.host.*` independently
|
|
493
|
+
* when the source is a docker host.
|
|
494
|
+
*/
|
|
495
|
+
private static async linkResourceContextFromSeries(input: {
|
|
496
|
+
incident: Incident;
|
|
497
|
+
seriesLabels: JSONObject;
|
|
498
|
+
projectId: ObjectID;
|
|
499
|
+
}): Promise<void> {
|
|
500
|
+
const collect: (keys: ReadonlyArray<string>) => Array<string> = (
|
|
501
|
+
keys: ReadonlyArray<string>,
|
|
502
|
+
): Array<string> => {
|
|
503
|
+
const found: Set<string> = new Set<string>();
|
|
504
|
+
for (const key of keys) {
|
|
505
|
+
const value: unknown = input.seriesLabels[key];
|
|
506
|
+
if (typeof value === "string" && value.length > 0) {
|
|
507
|
+
found.add(value);
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
if (Array.isArray(value)) {
|
|
511
|
+
for (const item of value) {
|
|
512
|
+
if (typeof item === "string" && item.length > 0) {
|
|
513
|
+
found.add(item);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
return Array.from(found);
|
|
519
|
+
};
|
|
520
|
+
|
|
521
|
+
const hostIds: Array<string> = collect([
|
|
522
|
+
"resource.oneuptime.host.id",
|
|
523
|
+
"oneuptime.host.id",
|
|
524
|
+
]);
|
|
525
|
+
const hostNames: Array<string> = collect([
|
|
526
|
+
"resource.oneuptime.host.name",
|
|
527
|
+
"oneuptime.host.name",
|
|
528
|
+
"resource.host.name",
|
|
529
|
+
"host.name",
|
|
530
|
+
]);
|
|
531
|
+
|
|
532
|
+
const dockerHostIds: Array<string> = collect([
|
|
533
|
+
"resource.oneuptime.docker.host.id",
|
|
534
|
+
"oneuptime.docker.host.id",
|
|
535
|
+
]);
|
|
536
|
+
const dockerHostNames: Array<string> = collect([
|
|
537
|
+
"resource.oneuptime.docker.host.name",
|
|
538
|
+
"oneuptime.docker.host.name",
|
|
539
|
+
]);
|
|
540
|
+
|
|
541
|
+
const clusterIds: Array<string> = collect([
|
|
542
|
+
"resource.oneuptime.kubernetes.cluster.id",
|
|
543
|
+
"oneuptime.kubernetes.cluster.id",
|
|
544
|
+
]);
|
|
545
|
+
const clusterNames: Array<string> = collect([
|
|
546
|
+
"resource.oneuptime.kubernetes.cluster.name",
|
|
547
|
+
"oneuptime.kubernetes.cluster.name",
|
|
548
|
+
"resource.k8s.cluster.name",
|
|
549
|
+
"k8s.cluster.name",
|
|
550
|
+
]);
|
|
551
|
+
|
|
552
|
+
/*
|
|
553
|
+
* Services come from OTel-ingested telemetry. The ingest pipeline
|
|
554
|
+
* auto-creates a Service row keyed by `service.name`, so any series
|
|
555
|
+
* label that carries that attribute (raw or prefixed) tells us the
|
|
556
|
+
* emitting service. We also accept the `oneuptime.service.id`
|
|
557
|
+
* stamp for callers that already resolved the ID upstream.
|
|
558
|
+
*/
|
|
559
|
+
const serviceIds: Array<string> = collect([
|
|
560
|
+
"resource.oneuptime.service.id",
|
|
561
|
+
"oneuptime.service.id",
|
|
562
|
+
]);
|
|
563
|
+
const serviceNames: Array<string> = collect([
|
|
564
|
+
"resource.service.name",
|
|
565
|
+
"service.name",
|
|
566
|
+
]);
|
|
567
|
+
|
|
568
|
+
const [
|
|
569
|
+
resolvedHosts,
|
|
570
|
+
resolvedDockerHosts,
|
|
571
|
+
resolvedClusters,
|
|
572
|
+
resolvedServices,
|
|
573
|
+
] = await Promise.all([
|
|
574
|
+
this.resolveResourceIds({
|
|
575
|
+
ids: hostIds,
|
|
576
|
+
names: hostNames,
|
|
577
|
+
nameColumn: "hostIdentifier",
|
|
578
|
+
projectId: input.projectId,
|
|
579
|
+
findBy: HostService.findBy.bind(HostService),
|
|
580
|
+
}),
|
|
581
|
+
this.resolveResourceIds({
|
|
582
|
+
ids: dockerHostIds,
|
|
583
|
+
names: dockerHostNames,
|
|
584
|
+
nameColumn: "hostIdentifier",
|
|
585
|
+
projectId: input.projectId,
|
|
586
|
+
findBy: DockerHostService.findBy.bind(DockerHostService),
|
|
587
|
+
}),
|
|
588
|
+
this.resolveResourceIds({
|
|
589
|
+
ids: clusterIds,
|
|
590
|
+
names: clusterNames,
|
|
591
|
+
nameColumn: "clusterIdentifier",
|
|
592
|
+
projectId: input.projectId,
|
|
593
|
+
findBy: KubernetesClusterService.findBy.bind(KubernetesClusterService),
|
|
594
|
+
}),
|
|
595
|
+
this.resolveResourceIds({
|
|
596
|
+
ids: serviceIds,
|
|
597
|
+
names: serviceNames,
|
|
598
|
+
nameColumn: "name",
|
|
599
|
+
projectId: input.projectId,
|
|
600
|
+
findBy: ServiceService.findBy.bind(ServiceService),
|
|
601
|
+
}),
|
|
602
|
+
]);
|
|
603
|
+
|
|
604
|
+
if (resolvedHosts.length > 0) {
|
|
605
|
+
input.incident.hosts = resolvedHosts.map((id: string): Host => {
|
|
606
|
+
const host: Host = new Host();
|
|
607
|
+
host._id = id;
|
|
608
|
+
return host;
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
if (resolvedDockerHosts.length > 0) {
|
|
612
|
+
input.incident.dockerHosts = resolvedDockerHosts.map(
|
|
613
|
+
(id: string): DockerHost => {
|
|
614
|
+
const dockerHost: DockerHost = new DockerHost();
|
|
615
|
+
dockerHost._id = id;
|
|
616
|
+
return dockerHost;
|
|
617
|
+
},
|
|
618
|
+
);
|
|
619
|
+
}
|
|
620
|
+
if (resolvedClusters.length > 0) {
|
|
621
|
+
input.incident.kubernetesClusters = resolvedClusters.map(
|
|
622
|
+
(id: string): KubernetesCluster => {
|
|
623
|
+
const cluster: KubernetesCluster = new KubernetesCluster();
|
|
624
|
+
cluster._id = id;
|
|
625
|
+
return cluster;
|
|
626
|
+
},
|
|
627
|
+
);
|
|
628
|
+
}
|
|
629
|
+
if (resolvedServices.length > 0) {
|
|
630
|
+
input.incident.services = resolvedServices.map((id: string): Service => {
|
|
631
|
+
const service: Service = new Service();
|
|
632
|
+
service._id = id;
|
|
633
|
+
return service;
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/*
|
|
639
|
+
* Resolve a mix of ids and names to a deduped set of database ids
|
|
640
|
+
* for one resource type, project-scoped. Either or both lists may
|
|
641
|
+
* be empty; if both are empty the method short-circuits with no DB
|
|
642
|
+
* round-trip.
|
|
643
|
+
*/
|
|
644
|
+
private static async resolveResourceIds(input: {
|
|
645
|
+
ids: Array<string>;
|
|
646
|
+
names: Array<string>;
|
|
647
|
+
nameColumn: string;
|
|
648
|
+
projectId: ObjectID;
|
|
649
|
+
/*
|
|
650
|
+
* Loosely typed because the three resource services (Host,
|
|
651
|
+
* DockerHost, KubernetesCluster) each have their own
|
|
652
|
+
* `Query<TBaseModel>` shape and we deliberately abstract over
|
|
653
|
+
* them. We only need the row's `_id` back, which every model
|
|
654
|
+
* exposes via `DatabaseBaseModel`.
|
|
655
|
+
*/
|
|
656
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
657
|
+
findBy: (args: any) => Promise<Array<{ _id?: string | undefined }>>;
|
|
658
|
+
}): Promise<Array<string>> {
|
|
659
|
+
if (input.ids.length === 0 && input.names.length === 0) {
|
|
660
|
+
return [];
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
const resolved: Set<string> = new Set<string>();
|
|
664
|
+
|
|
665
|
+
const lookups: Array<Promise<Array<{ _id?: string | undefined }>>> = [];
|
|
666
|
+
if (input.ids.length > 0) {
|
|
667
|
+
lookups.push(
|
|
668
|
+
input.findBy({
|
|
669
|
+
query: {
|
|
670
|
+
projectId: input.projectId,
|
|
671
|
+
_id: new Includes(input.ids),
|
|
672
|
+
},
|
|
673
|
+
select: { _id: true },
|
|
674
|
+
skip: 0,
|
|
675
|
+
limit: LIMIT_PER_PROJECT,
|
|
676
|
+
props: { isRoot: true },
|
|
677
|
+
}),
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
if (input.names.length > 0) {
|
|
681
|
+
lookups.push(
|
|
682
|
+
input.findBy({
|
|
683
|
+
query: {
|
|
684
|
+
projectId: input.projectId,
|
|
685
|
+
[input.nameColumn]: new Includes(input.names),
|
|
686
|
+
},
|
|
687
|
+
select: { _id: true },
|
|
688
|
+
skip: 0,
|
|
689
|
+
limit: LIMIT_PER_PROJECT,
|
|
690
|
+
props: { isRoot: true },
|
|
691
|
+
}),
|
|
692
|
+
);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
const buckets: Array<Array<{ _id?: string | undefined }>> =
|
|
696
|
+
await Promise.all(lookups);
|
|
697
|
+
for (const bucket of buckets) {
|
|
698
|
+
for (const row of bucket) {
|
|
699
|
+
if (row._id) {
|
|
700
|
+
resolved.add(String(row._id));
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
return Array.from(resolved);
|
|
705
|
+
}
|
|
706
|
+
|
|
497
707
|
private static async resolveOpenIncident(input: {
|
|
498
708
|
openIncident: Incident;
|
|
499
709
|
rootCause: string;
|
|
@@ -17,6 +17,7 @@ import Email from "../../../Types/Email";
|
|
|
17
17
|
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
18
18
|
import NotAuthenticatedException from "../../../Types/Exception/NotAuthenticatedException";
|
|
19
19
|
import SsoAuthorizationException from "../../../Types/Exception/SsoAuthorizationException";
|
|
20
|
+
import TenantNotFoundException from "../../../Types/Exception/TenantNotFoundException";
|
|
20
21
|
import HashedString from "../../../Types/HashedString";
|
|
21
22
|
import JSONFunctions from "../../../Types/JSONFunctions";
|
|
22
23
|
import JSONWebTokenData from "../../../Types/JsonWebTokenData";
|
|
@@ -585,9 +586,9 @@ describe("UserMiddleware", () => {
|
|
|
585
586
|
describe("getUserTenantAccessPermissionWithTenantId", () => {
|
|
586
587
|
const req: ExpressRequest = {} as ExpressRequest;
|
|
587
588
|
|
|
588
|
-
const
|
|
589
|
+
const spyGetRequireSsoForLogin: jest.SpyInstance = getJestSpyOn(
|
|
589
590
|
ProjectService,
|
|
590
|
-
"
|
|
591
|
+
"getRequireSsoForLogin",
|
|
591
592
|
);
|
|
592
593
|
const spyDoesSsoTokenForProjectExist: jest.SpyInstance = getJestSpyOn(
|
|
593
594
|
UserMiddleware,
|
|
@@ -599,7 +600,9 @@ describe("UserMiddleware", () => {
|
|
|
599
600
|
});
|
|
600
601
|
|
|
601
602
|
test("should throw 'Invalid tenantId' error, when project is not found for the tenantId", async () => {
|
|
602
|
-
|
|
603
|
+
spyGetRequireSsoForLogin.mockRejectedValueOnce(
|
|
604
|
+
new BadDataException("Project not found"),
|
|
605
|
+
);
|
|
603
606
|
|
|
604
607
|
await expect(
|
|
605
608
|
UserMiddleware.getUserTenantAccessPermissionWithTenantId({
|
|
@@ -607,23 +610,12 @@ describe("UserMiddleware", () => {
|
|
|
607
610
|
tenantId: projectId,
|
|
608
611
|
userId,
|
|
609
612
|
}),
|
|
610
|
-
).rejects.toThrowError(new
|
|
611
|
-
expect(
|
|
612
|
-
id: projectId,
|
|
613
|
-
select: {
|
|
614
|
-
requireSsoForLogin: true,
|
|
615
|
-
},
|
|
616
|
-
props: {
|
|
617
|
-
isRoot: true,
|
|
618
|
-
},
|
|
619
|
-
});
|
|
613
|
+
).rejects.toThrowError(new TenantNotFoundException("Invalid tenantId"));
|
|
614
|
+
expect(spyGetRequireSsoForLogin).toHaveBeenCalledWith(projectId);
|
|
620
615
|
});
|
|
621
616
|
|
|
622
617
|
test("should throw SsoAuthorizationException error, when sso login is required but sso token for the projectId does not exist", async () => {
|
|
623
|
-
|
|
624
|
-
...mockedProject,
|
|
625
|
-
requireSsoForLogin: true,
|
|
626
|
-
});
|
|
618
|
+
spyGetRequireSsoForLogin.mockResolvedValueOnce(true);
|
|
627
619
|
|
|
628
620
|
spyDoesSsoTokenForProjectExist.mockReturnValueOnce(false);
|
|
629
621
|
|
|
@@ -642,7 +634,7 @@ describe("UserMiddleware", () => {
|
|
|
642
634
|
});
|
|
643
635
|
|
|
644
636
|
test("should return null when getUserTenantAccessPermission returns null", async () => {
|
|
645
|
-
|
|
637
|
+
spyGetRequireSsoForLogin.mockResolvedValueOnce(false);
|
|
646
638
|
|
|
647
639
|
const spyGetUserTenantAccessPermission: jest.SpyInstance = getJestSpyOn(
|
|
648
640
|
AccessTokenService,
|
|
@@ -668,7 +660,7 @@ describe("UserMiddleware", () => {
|
|
|
668
660
|
projectId,
|
|
669
661
|
} as UserTenantAccessPermission;
|
|
670
662
|
|
|
671
|
-
|
|
663
|
+
spyGetRequireSsoForLogin.mockResolvedValueOnce(false);
|
|
672
664
|
|
|
673
665
|
const spyGetUserTenantAccessPermission: jest.SpyInstance = getJestSpyOn(
|
|
674
666
|
AccessTokenService,
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import ObjectID from "../../Types/ObjectID";
|
|
2
|
+
import Permission, {
|
|
3
|
+
PermissionHelper,
|
|
4
|
+
UserPermission,
|
|
5
|
+
} from "../../Types/Permission";
|
|
6
|
+
import PermissionScope from "../../Types/Database/AccessControl/PermissionScope";
|
|
2
7
|
|
|
3
8
|
describe("Permission", () => {
|
|
4
9
|
test("Permission.ProjectMember should be ProjectMember", () => {
|
|
@@ -9,3 +14,126 @@ describe("Permission", () => {
|
|
|
9
14
|
expect(Permission.Public).toBe("Public");
|
|
10
15
|
});
|
|
11
16
|
});
|
|
17
|
+
|
|
18
|
+
const makeRow: (
|
|
19
|
+
permission: Permission,
|
|
20
|
+
scope: PermissionScope | undefined,
|
|
21
|
+
labelIds?: Array<ObjectID>,
|
|
22
|
+
) => UserPermission = (
|
|
23
|
+
permission: Permission,
|
|
24
|
+
scope: PermissionScope | undefined,
|
|
25
|
+
labelIds: Array<ObjectID> = [],
|
|
26
|
+
): UserPermission => {
|
|
27
|
+
return {
|
|
28
|
+
_type: "UserPermission",
|
|
29
|
+
permission,
|
|
30
|
+
labelIds,
|
|
31
|
+
scope,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
describe("PermissionHelper label/scope filtering", () => {
|
|
36
|
+
/*
|
|
37
|
+
* Regression coverage for the bug where a team permission with
|
|
38
|
+
* scope=Labels on a role permission (IncidentViewer, MonitorViewer,
|
|
39
|
+
* Viewer, …) was treated as an unconditional grant because the
|
|
40
|
+
* legacy filter consulted the per-permission `isAccessControlPermission`
|
|
41
|
+
* flag instead of the explicit scope on the row.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
test("getNonAccessControlPermissions: scope=All counts as unrestricted", () => {
|
|
45
|
+
const rows: Array<UserPermission> = [
|
|
46
|
+
makeRow(Permission.IncidentViewer, PermissionScope.All, []),
|
|
47
|
+
];
|
|
48
|
+
expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([
|
|
49
|
+
Permission.IncidentViewer,
|
|
50
|
+
]);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("getNonAccessControlPermissions: scope=Labels with labels is restricted (NOT included)", () => {
|
|
54
|
+
const labelId: ObjectID = ObjectID.generate();
|
|
55
|
+
const rows: Array<UserPermission> = [
|
|
56
|
+
makeRow(Permission.IncidentViewer, PermissionScope.Labels, [labelId]),
|
|
57
|
+
];
|
|
58
|
+
expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([]);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("getNonAccessControlPermissions: scope=Labels with empty labels is treated as unrestricted (legacy parity)", () => {
|
|
62
|
+
const rows: Array<UserPermission> = [
|
|
63
|
+
makeRow(Permission.IncidentViewer, PermissionScope.Labels, []),
|
|
64
|
+
];
|
|
65
|
+
expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([
|
|
66
|
+
Permission.IncidentViewer,
|
|
67
|
+
]);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("getNonAccessControlPermissions: scope=Owned is excluded (OwnedScope handles it)", () => {
|
|
71
|
+
const rows: Array<UserPermission> = [
|
|
72
|
+
makeRow(Permission.IncidentViewer, PermissionScope.Owned, []),
|
|
73
|
+
];
|
|
74
|
+
expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([]);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("getNonAccessControlPermissions: legacy row (scope undefined, no labels) is unrestricted", () => {
|
|
78
|
+
const rows: Array<UserPermission> = [
|
|
79
|
+
makeRow(Permission.CurrentUser, undefined, []),
|
|
80
|
+
];
|
|
81
|
+
expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([
|
|
82
|
+
Permission.CurrentUser,
|
|
83
|
+
]);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("getAccessControlPermissions: role permission with scope=Labels + labels is collected", () => {
|
|
87
|
+
const labelId: ObjectID = ObjectID.generate();
|
|
88
|
+
const row: UserPermission = makeRow(
|
|
89
|
+
Permission.IncidentViewer,
|
|
90
|
+
PermissionScope.Labels,
|
|
91
|
+
[labelId],
|
|
92
|
+
);
|
|
93
|
+
expect(PermissionHelper.getAccessControlPermissions([row])).toEqual([row]);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("getAccessControlPermissions: granular permission with scope=Labels + labels is collected", () => {
|
|
97
|
+
const labelId: ObjectID = ObjectID.generate();
|
|
98
|
+
const row: UserPermission = makeRow(
|
|
99
|
+
Permission.ReadProjectIncident,
|
|
100
|
+
PermissionScope.Labels,
|
|
101
|
+
[labelId],
|
|
102
|
+
);
|
|
103
|
+
expect(PermissionHelper.getAccessControlPermissions([row])).toEqual([row]);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("getAccessControlPermissions: scope=All with labels is NOT collected (All wins over labels)", () => {
|
|
107
|
+
const labelId: ObjectID = ObjectID.generate();
|
|
108
|
+
const row: UserPermission = makeRow(
|
|
109
|
+
Permission.IncidentViewer,
|
|
110
|
+
PermissionScope.All,
|
|
111
|
+
[labelId],
|
|
112
|
+
);
|
|
113
|
+
expect(PermissionHelper.getAccessControlPermissions([row])).toEqual([]);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("getAccessControlPermissions: scope=Owned never contributes a label filter", () => {
|
|
117
|
+
const labelId: ObjectID = ObjectID.generate();
|
|
118
|
+
const row: UserPermission = makeRow(
|
|
119
|
+
Permission.IncidentViewer,
|
|
120
|
+
PermissionScope.Owned,
|
|
121
|
+
[labelId],
|
|
122
|
+
);
|
|
123
|
+
expect(PermissionHelper.getAccessControlPermissions([row])).toEqual([]);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test("Mixed: All row on a different permission does NOT suppress a Labels row's filter", () => {
|
|
127
|
+
const labelId: ObjectID = ObjectID.generate();
|
|
128
|
+
const rows: Array<UserPermission> = [
|
|
129
|
+
makeRow(Permission.MonitorViewer, PermissionScope.All, []),
|
|
130
|
+
makeRow(Permission.IncidentViewer, PermissionScope.Labels, [labelId]),
|
|
131
|
+
];
|
|
132
|
+
expect(PermissionHelper.getNonAccessControlPermissions(rows)).toEqual([
|
|
133
|
+
Permission.MonitorViewer,
|
|
134
|
+
]);
|
|
135
|
+
expect(PermissionHelper.getAccessControlPermissions(rows)).toEqual([
|
|
136
|
+
rows[1],
|
|
137
|
+
]);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
@@ -20,7 +20,16 @@ export const SUPPORTED_ACCOUNTS_LANGUAGES: Array<AccountsLanguage> = [
|
|
|
20
20
|
{ code: "ru", nativeName: "Русский", englishName: "Russian" },
|
|
21
21
|
{ code: "ja", nativeName: "日本語", englishName: "Japanese" },
|
|
22
22
|
{ code: "ko", nativeName: "한국어", englishName: "Korean" },
|
|
23
|
-
{
|
|
23
|
+
{
|
|
24
|
+
code: "zh-CN",
|
|
25
|
+
nativeName: "简体中文",
|
|
26
|
+
englishName: "Chinese (Simplified)",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
code: "zh-TW",
|
|
30
|
+
nativeName: "繁體中文",
|
|
31
|
+
englishName: "Chinese (Traditional)",
|
|
32
|
+
},
|
|
24
33
|
{ code: "hi", nativeName: "हिन्दी", englishName: "Hindi" },
|
|
25
34
|
];
|
|
26
35
|
|
|
@@ -21,7 +21,16 @@ export const SUPPORTED_ADMIN_DASHBOARD_LANGUAGES: Array<AdminDashboardLanguage>
|
|
|
21
21
|
{ code: "ru", nativeName: "Русский", englishName: "Russian" },
|
|
22
22
|
{ code: "ja", nativeName: "日本語", englishName: "Japanese" },
|
|
23
23
|
{ code: "ko", nativeName: "한국어", englishName: "Korean" },
|
|
24
|
-
{
|
|
24
|
+
{
|
|
25
|
+
code: "zh-CN",
|
|
26
|
+
nativeName: "简体中文",
|
|
27
|
+
englishName: "Chinese (Simplified)",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
code: "zh-TW",
|
|
31
|
+
nativeName: "繁體中文",
|
|
32
|
+
englishName: "Chinese (Traditional)",
|
|
33
|
+
},
|
|
25
34
|
{ code: "hi", nativeName: "हिन्दी", englishName: "Hindi" },
|
|
26
35
|
];
|
|
27
36
|
|
|
@@ -20,7 +20,16 @@ export const SUPPORTED_DASHBOARD_LANGUAGES: Array<DashboardLanguage> = [
|
|
|
20
20
|
{ code: "ru", nativeName: "Русский", englishName: "Russian" },
|
|
21
21
|
{ code: "ja", nativeName: "日本語", englishName: "Japanese" },
|
|
22
22
|
{ code: "ko", nativeName: "한국어", englishName: "Korean" },
|
|
23
|
-
{
|
|
23
|
+
{
|
|
24
|
+
code: "zh-CN",
|
|
25
|
+
nativeName: "简体中文",
|
|
26
|
+
englishName: "Chinese (Simplified)",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
code: "zh-TW",
|
|
30
|
+
nativeName: "繁體中文",
|
|
31
|
+
englishName: "Chinese (Traditional)",
|
|
32
|
+
},
|
|
24
33
|
{ code: "hi", nativeName: "हिन्दी", englishName: "Hindi" },
|
|
25
34
|
];
|
|
26
35
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import TableEditionAccessControl from "../../BaseDatabase/TableEditionAccessControl";
|
|
2
|
+
import GenericFunction from "../../GenericFunction";
|
|
3
|
+
|
|
4
|
+
export default (accessControl: TableEditionAccessControl) => {
|
|
5
|
+
return (ctr: GenericFunction) => {
|
|
6
|
+
ctr.prototype.requiresEnterprise = accessControl.requiresEnterprise;
|
|
7
|
+
};
|
|
8
|
+
};
|
package/Types/Date.ts
CHANGED
|
@@ -20,7 +20,16 @@ export const SUPPORTED_DOCS_LANGUAGES: Array<DocsLanguage> = [
|
|
|
20
20
|
{ code: "ru", nativeName: "Русский", englishName: "Russian" },
|
|
21
21
|
{ code: "ja", nativeName: "日本語", englishName: "Japanese" },
|
|
22
22
|
{ code: "ko", nativeName: "한국어", englishName: "Korean" },
|
|
23
|
-
{
|
|
23
|
+
{
|
|
24
|
+
code: "zh-CN",
|
|
25
|
+
nativeName: "简体中文",
|
|
26
|
+
englishName: "Chinese (Simplified)",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
code: "zh-TW",
|
|
30
|
+
nativeName: "繁體中文",
|
|
31
|
+
englishName: "Chinese (Traditional)",
|
|
32
|
+
},
|
|
24
33
|
{ code: "hi", nativeName: "हिन्दी", englishName: "Hindi" },
|
|
25
34
|
];
|
|
26
35
|
|