@oneuptime/common 12.0.18 → 12.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/EnterpriseLicense.ts +23 -0
- package/Models/DatabaseModels/Index.ts +4 -2
- package/Models/DatabaseModels/Monitor.ts +39 -9
- package/Models/DatabaseModels/UserMicrosoftTeams.ts +344 -0
- package/Models/DatabaseModels/UserNotificationRule.ts +144 -8
- package/Models/DatabaseModels/UserNotificationSetting.ts +34 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +95 -0
- package/Models/DatabaseModels/UserSlack.ts +341 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +9 -0
- package/Server/API/EnterpriseLicenseAPI.ts +94 -19
- package/Server/API/UserMicrosoftTeamsAPI.ts +127 -0
- package/Server/API/UserSlackAPI.ts +125 -0
- package/Server/EnvironmentConfig.ts +29 -107
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788700000000-RemoveMarketingConversionUploadState.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788800000000-DropMarketingConversionAddEnterpriseLicenseEmail.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.ts +117 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.ts +197 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/Queue.ts +7 -0
- package/Server/Services/EnterpriseLicenseService.ts +60 -0
- package/Server/Services/Index.ts +6 -2
- package/Server/Services/LlmLogService.ts +25 -9
- package/Server/Services/OnCallReadinessService.ts +86 -2
- package/Server/Services/ProjectService.ts +171 -0
- package/Server/Services/UserMicrosoftTeamsService.ts +208 -0
- package/Server/Services/UserNotificationMethodAdminService.ts +167 -5
- package/Server/Services/UserNotificationRuleAdminService.ts +40 -6
- package/Server/Services/UserNotificationRuleService.ts +589 -11
- package/Server/Services/UserNotificationSettingService.ts +138 -0
- package/Server/Services/UserService.ts +28 -0
- package/Server/Services/UserSlackService.ts +218 -0
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +67 -1
- package/Server/Services/WorkspaceUserAuthTokenService.ts +73 -0
- package/Server/Services/WorkspaceUserNotificationService.ts +190 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +145 -0
- package/Server/Utils/Marketing/MarketingEventWebhook.ts +114 -0
- package/Server/Utils/Monitor/MonitorLogUtil.ts +14 -1
- package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +321 -0
- package/Server/Utils/Response.ts +2 -2
- package/Server/Utils/StartServer.ts +2 -2
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +191 -4
- package/Server/Views/Partials/AnalyticsConsent.ejs +533 -0
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +22 -14
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +22 -11
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +465 -0
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +302 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +408 -0
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +474 -0
- package/Tests/App/Dashboard/MetricSeriesInvestigateMenu.test.tsx +368 -0
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +37 -1
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +18 -10
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +27 -1
- package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +214 -0
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +763 -0
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +145 -26
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +2 -2
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +11 -1
- package/Tests/Server/Services/AdminRuleEditGuards.test.ts +22 -8
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +18 -2
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +5 -1
- package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +640 -0
- package/Tests/Server/Services/NotificationChannelEventCoverage.test.ts +246 -22
- package/Tests/Server/Services/NotificationDeletionImpact.test.ts +136 -8
- package/Tests/Server/Services/OnCallNotificationFallback.test.ts +191 -8
- package/Tests/Server/Services/OnCallReadinessService.test.ts +343 -18
- package/Tests/Server/Services/ProjectServiceChangePlan.test.ts +138 -0
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +516 -0
- package/Tests/Server/Services/SeverityRuleBackfill.test.ts +5 -1
- package/Tests/Server/Services/UserMicrosoftTeamsService.test.ts +343 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +209 -8
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +22 -6
- package/Tests/Server/Services/UserNotificationRuleDefaultCreation.test.ts +12 -6
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +37 -3
- package/Tests/Server/Services/UserNotificationRuleWorkspaceDelivery.test.ts +669 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +410 -0
- package/Tests/Server/Services/UserSlackService.test.ts +407 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenDisconnectCascade.test.ts +224 -0
- package/Tests/Server/Services/WorkspaceUserAuthTokenNotificationMethodCascade.test.ts +189 -0
- package/Tests/Server/Services/WorkspaceUserNotificationService.test.ts +496 -0
- package/Tests/Server/Types/Database/Permissions/AdminNotificationRuleAccess.test.ts +30 -17
- package/Tests/Server/Types/Database/Permissions/CreateOwnershipScoping.test.ts +8 -3
- package/Tests/Server/Types/Database/Permissions/OwnerOnlyColumns.test.ts +72 -3
- package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +22 -18
- package/Tests/Server/Types/Database/Permissions/WorkspaceMethodStampedColumnCreate.test.ts +178 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +259 -0
- package/Tests/Server/Utils/Marketing/MarketingEventWebhook.test.ts +257 -0
- package/Tests/Server/Utils/Monitor/MonitorLogUtilRedaction.test.ts +300 -0
- package/Tests/Server/Utils/Monitor/MonitorPayloadRedaction.test.ts +381 -0
- package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +53 -0
- package/Tests/Server/Utils/Runbook/RunbookExecutePermission.test.ts +228 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayErasureTombstone.test.ts +189 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +205 -0
- package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +275 -0
- package/Tests/Server/Utils/Telemetry/TelemetryContext.test.ts +279 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +454 -0
- package/Tests/Server/Views/AnalyticsConsentPartial.test.ts +241 -0
- package/Tests/UI/Components/Charts/ChartTooltipSorted.test.tsx +129 -0
- package/Tests/UI/Components/Charts/TooltipEntries.test.ts +155 -0
- package/Tests/UI/Components/Detail/DetailFieldErrors.test.tsx +347 -0
- package/Tests/UI/Components/Forms/BasicFormStepValidation.test.tsx +392 -0
- package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +549 -0
- package/Tests/UI/Utils/NotificationMethodUtil.test.ts +137 -9
- package/Tests/UI/Utils/PermissionGate.test.ts +105 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +562 -0
- package/Types/Analytics/RevenueEvent.ts +1 -0
- package/Types/Marketing/MarketingEvent.ts +140 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +8 -1
- package/UI/Components/Charts/Bar/BarChart.tsx +8 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +19 -4
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +20 -2
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +19 -4
- package/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.ts +105 -0
- package/UI/Components/Charts/Line/LineChart.tsx +8 -1
- package/UI/Components/Detail/Detail.tsx +18 -1
- package/UI/Utils/NotificationMethodUtil.ts +41 -1
- package/UI/Utils/PermissionGate.ts +56 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +244 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +24 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -2
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +39 -9
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserMicrosoftTeams.js +363 -0
- package/build/dist/Models/DatabaseModels/UserMicrosoftTeams.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js +145 -8
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationSetting.js +38 -0
- package/build/dist/Models/DatabaseModels/UserNotificationSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +96 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSlack.js +361 -0
- package/build/dist/Models/DatabaseModels/UserSlack.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +66 -12
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +82 -0
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -0
- package/build/dist/Server/API/UserSlackAPI.js +81 -0
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +25 -70
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788700000000-RemoveMarketingConversionUploadState.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788700000000-RemoveMarketingConversionUploadState.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788800000000-DropMarketingConversionAddEnterpriseLicenseEmail.js +37 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788800000000-DropMarketingConversionAddEnterpriseLicenseEmail.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js +106 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js +78 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +7 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +65 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +6 -2
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LlmLogService.js +25 -9
- package/build/dist/Server/Services/LlmLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallReadinessService.js +74 -2
- package/build/dist/Server/Services/OnCallReadinessService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +144 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/UserMicrosoftTeamsService.js +183 -0
- package/build/dist/Server/Services/UserMicrosoftTeamsService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +138 -2
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +32 -4
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +499 -67
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +118 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +26 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserSlackService.js +195 -0
- package/build/dist/Server/Services/UserSlackService.js.map +1 -0
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +64 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceUserAuthTokenService.js +70 -0
- package/build/dist/Server/Services/WorkspaceUserAuthTokenService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceUserNotificationService.js +129 -0
- package/build/dist/Server/Services/WorkspaceUserNotificationService.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +94 -0
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js +93 -0
- package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js +12 -1
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +233 -0
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +2 -2
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +2 -2
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +141 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/Analytics/RevenueEvent.js +1 -0
- package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -1
- package/build/dist/Types/Marketing/MarketingEvent.js +82 -0
- package/build/dist/Types/Marketing/MarketingEvent.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +9 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +9 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +22 -13
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +27 -15
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +27 -18
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.js +71 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/TooltipEntries.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +9 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +17 -1
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Utils/NotificationMethodUtil.js +33 -1
- package/build/dist/UI/Utils/NotificationMethodUtil.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +32 -0
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +174 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +1 -0
- package/package.json +1 -1
- package/Models/DatabaseModels/MarketingConversion.ts +0 -410
- package/Server/Services/MarketingConversionService.ts +0 -10
- package/Server/Utils/Marketing/ConversionUploadProvider.ts +0 -215
- package/Server/Utils/Marketing/ConversionUploadProviders.ts +0 -22
- package/Server/Utils/Marketing/Providers/GoogleAds.ts +0 -333
- package/Server/Utils/Marketing/Providers/LinkedIn.ts +0 -185
- package/Server/Utils/Marketing/Providers/Meta.ts +0 -182
- package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +0 -223
- package/Server/Utils/Marketing/Providers/Reddit.ts +0 -208
- package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +0 -315
- package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +0 -300
- package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +0 -592
- package/Tests/Server/Utils/Marketing/LinkedIn.test.ts +0 -282
- package/Tests/Server/Utils/Marketing/Meta.test.ts +0 -304
- package/Tests/Server/Utils/Marketing/MicrosoftAds.test.ts +0 -263
- package/Tests/Server/Utils/Marketing/Reddit.test.ts +0 -259
- package/Types/Marketing/MarketingConversion.ts +0 -53
- package/build/dist/Models/DatabaseModels/MarketingConversion.js +0 -445
- package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +0 -1
- package/build/dist/Server/Services/MarketingConversionService.js +0 -9
- package/build/dist/Server/Services/MarketingConversionService.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +0 -93
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js +0 -20
- package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +0 -221
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +0 -137
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js +0 -133
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +0 -143
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +0 -145
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +0 -1
- package/build/dist/Types/Marketing/MarketingConversion.js +0 -52
- package/build/dist/Types/Marketing/MarketingConversion.js.map +0 -1
|
@@ -7,8 +7,10 @@ import NotificationMethodUtil, {
|
|
|
7
7
|
import { DropdownOption } from "../../../UI/Components/Dropdown/Dropdown";
|
|
8
8
|
import UserCall from "../../../Models/DatabaseModels/UserCall";
|
|
9
9
|
import UserEmail from "../../../Models/DatabaseModels/UserEmail";
|
|
10
|
+
import UserMicrosoftTeams from "../../../Models/DatabaseModels/UserMicrosoftTeams";
|
|
10
11
|
import UserNotificationRule from "../../../Models/DatabaseModels/UserNotificationRule";
|
|
11
12
|
import UserPush from "../../../Models/DatabaseModels/UserPush";
|
|
13
|
+
import UserSlack from "../../../Models/DatabaseModels/UserSlack";
|
|
12
14
|
import UserSMS from "../../../Models/DatabaseModels/UserSMS";
|
|
13
15
|
import UserTelegram from "../../../Models/DatabaseModels/UserTelegram";
|
|
14
16
|
import UserWebhook from "../../../Models/DatabaseModels/UserWebhook";
|
|
@@ -95,6 +97,34 @@ function push(id: string, deviceName?: string): UserPush {
|
|
|
95
97
|
return model;
|
|
96
98
|
}
|
|
97
99
|
|
|
100
|
+
function slack(id: string, userName?: string, userId?: string): UserSlack {
|
|
101
|
+
const model: UserSlack = new UserSlack();
|
|
102
|
+
model.id = new ObjectID(id);
|
|
103
|
+
if (userName !== undefined) {
|
|
104
|
+
model.slackUserName = userName;
|
|
105
|
+
}
|
|
106
|
+
if (userId !== undefined) {
|
|
107
|
+
model.slackUserId = userId;
|
|
108
|
+
}
|
|
109
|
+
return model;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function microsoftTeams(
|
|
113
|
+
id: string,
|
|
114
|
+
userName?: string,
|
|
115
|
+
userId?: string,
|
|
116
|
+
): UserMicrosoftTeams {
|
|
117
|
+
const model: UserMicrosoftTeams = new UserMicrosoftTeams();
|
|
118
|
+
model.id = new ObjectID(id);
|
|
119
|
+
if (userName !== undefined) {
|
|
120
|
+
model.microsoftTeamsUserName = userName;
|
|
121
|
+
}
|
|
122
|
+
if (userId !== undefined) {
|
|
123
|
+
model.microsoftTeamsUserId = userId;
|
|
124
|
+
}
|
|
125
|
+
return model;
|
|
126
|
+
}
|
|
127
|
+
|
|
98
128
|
function emptyModels(): NotificationMethodModels {
|
|
99
129
|
return {
|
|
100
130
|
userCalls: [],
|
|
@@ -103,20 +133,25 @@ function emptyModels(): NotificationMethodModels {
|
|
|
103
133
|
userPush: [],
|
|
104
134
|
userWhatsApps: [],
|
|
105
135
|
userTelegrams: [],
|
|
136
|
+
userSlacks: [],
|
|
137
|
+
userMicrosoftTeamsAccounts: [],
|
|
106
138
|
userWebhooks: [],
|
|
107
139
|
};
|
|
108
140
|
}
|
|
109
141
|
|
|
110
142
|
// A 24-hex-char string is a valid ObjectID.
|
|
111
|
-
const ID: Record<"a" | "b" | "c" | "d" | "e" | "f" | "g", string> =
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
143
|
+
const ID: Record<"a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i", string> =
|
|
144
|
+
{
|
|
145
|
+
a: "aaaaaaaaaaaaaaaaaaaaaaaa",
|
|
146
|
+
b: "bbbbbbbbbbbbbbbbbbbbbbbb",
|
|
147
|
+
c: "cccccccccccccccccccccccc",
|
|
148
|
+
d: "dddddddddddddddddddddddd",
|
|
149
|
+
e: "eeeeeeeeeeeeeeeeeeeeeeee",
|
|
150
|
+
f: "ffffffffffffffffffffffff",
|
|
151
|
+
g: "abcabcabcabcabcabcabcabc",
|
|
152
|
+
h: "cdecdecdecdecdecdecdecde",
|
|
153
|
+
i: "fabfabfabfabfabfabfabfab",
|
|
154
|
+
};
|
|
120
155
|
|
|
121
156
|
/*
|
|
122
157
|
* A minimal stand-in for a model row: getDisplayItems only needs getColumnValue,
|
|
@@ -144,7 +179,9 @@ describe("NotificationMethodUtil.getSelectForNotificationMethods", () => {
|
|
|
144
179
|
[
|
|
145
180
|
"userCall",
|
|
146
181
|
"userEmail",
|
|
182
|
+
"userMicrosoftTeams",
|
|
147
183
|
"userPush",
|
|
184
|
+
"userSlack",
|
|
148
185
|
"userSms",
|
|
149
186
|
"userTelegram",
|
|
150
187
|
"userWebhook",
|
|
@@ -171,6 +208,14 @@ describe("NotificationMethodUtil.getSelectForNotificationMethods", () => {
|
|
|
171
208
|
telegramUserHandle: true,
|
|
172
209
|
telegramChatId: true,
|
|
173
210
|
});
|
|
211
|
+
expect(select["userSlack"]).toEqual({
|
|
212
|
+
slackUserName: true,
|
|
213
|
+
slackUserId: true,
|
|
214
|
+
});
|
|
215
|
+
expect(select["userMicrosoftTeams"]).toEqual({
|
|
216
|
+
microsoftTeamsUserName: true,
|
|
217
|
+
microsoftTeamsUserId: true,
|
|
218
|
+
});
|
|
174
219
|
});
|
|
175
220
|
|
|
176
221
|
test("selects ONLY name for a webhook — never the credential-bearing URL or secret", () => {
|
|
@@ -284,6 +329,51 @@ describe("NotificationMethodUtil.getDisplayItems", () => {
|
|
|
284
329
|
expect(items).toEqual([{ title: "Telegram", value: "999" }]);
|
|
285
330
|
});
|
|
286
331
|
|
|
332
|
+
test("prefers the Slack user name over the Slack member id", () => {
|
|
333
|
+
const items: Array<NotificationMethodDisplayItem> =
|
|
334
|
+
NotificationMethodUtil.getDisplayItems(
|
|
335
|
+
reader({
|
|
336
|
+
userSlack: { slackUserName: "alice", slackUserId: "U0123ABCD" },
|
|
337
|
+
}),
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
expect(items).toEqual([{ title: "Slack", value: "alice" }]);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
test("falls back to the Slack member id when the user name is absent", () => {
|
|
344
|
+
const items: Array<NotificationMethodDisplayItem> =
|
|
345
|
+
NotificationMethodUtil.getDisplayItems(
|
|
346
|
+
reader({ userSlack: { slackUserId: "U0123ABCD" } }),
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
expect(items).toEqual([{ title: "Slack", value: "U0123ABCD" }]);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
test("prefers the Microsoft Teams user name over the Teams user id", () => {
|
|
353
|
+
const items: Array<NotificationMethodDisplayItem> =
|
|
354
|
+
NotificationMethodUtil.getDisplayItems(
|
|
355
|
+
reader({
|
|
356
|
+
userMicrosoftTeams: {
|
|
357
|
+
microsoftTeamsUserName: "Alice Example",
|
|
358
|
+
microsoftTeamsUserId: "29:1abc",
|
|
359
|
+
},
|
|
360
|
+
}),
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
expect(items).toEqual([
|
|
364
|
+
{ title: "Microsoft Teams", value: "Alice Example" },
|
|
365
|
+
]);
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
test("falls back to the Teams user id when the user name is absent", () => {
|
|
369
|
+
const items: Array<NotificationMethodDisplayItem> =
|
|
370
|
+
NotificationMethodUtil.getDisplayItems(
|
|
371
|
+
reader({ userMicrosoftTeams: { microsoftTeamsUserId: "29:1abc" } }),
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
expect(items).toEqual([{ title: "Microsoft Teams", value: "29:1abc" }]);
|
|
375
|
+
});
|
|
376
|
+
|
|
287
377
|
test("ignores a relation whose value is not an object", () => {
|
|
288
378
|
expect(
|
|
289
379
|
NotificationMethodUtil.getDisplayItems(
|
|
@@ -306,12 +396,14 @@ describe("NotificationMethodUtil.getDisplayItems", () => {
|
|
|
306
396
|
reader({
|
|
307
397
|
userPush: { deviceName: "Pixel" },
|
|
308
398
|
userEmail: { email: "jane@example.com" },
|
|
399
|
+
userSlack: { slackUserName: "alice" },
|
|
309
400
|
userWebhook: { name: "Hook" },
|
|
310
401
|
}),
|
|
311
402
|
);
|
|
312
403
|
|
|
313
404
|
expect(items).toEqual([
|
|
314
405
|
{ title: "Email", value: "jane@example.com" },
|
|
406
|
+
{ title: "Slack", value: "alice" },
|
|
315
407
|
{ title: "Webhook", value: "Hook" },
|
|
316
408
|
{ title: "Push", value: "Pixel" },
|
|
317
409
|
]);
|
|
@@ -370,6 +462,32 @@ describe("NotificationMethodUtil.getLabel", () => {
|
|
|
370
462
|
);
|
|
371
463
|
});
|
|
372
464
|
|
|
465
|
+
test("labels a Slack method by user name, then member id, then Unknown Account", () => {
|
|
466
|
+
expect(NotificationMethodUtil.getLabel(slack(ID.a, "alice"))).toBe(
|
|
467
|
+
"Slack: alice",
|
|
468
|
+
);
|
|
469
|
+
expect(
|
|
470
|
+
NotificationMethodUtil.getLabel(slack(ID.b, undefined, "U0123ABCD")),
|
|
471
|
+
).toBe("Slack: U0123ABCD");
|
|
472
|
+
expect(NotificationMethodUtil.getLabel(slack(ID.c))).toBe(
|
|
473
|
+
"Slack: Unknown Account",
|
|
474
|
+
);
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
test("labels a Teams method by user name, then user id, then Unknown Account", () => {
|
|
478
|
+
expect(
|
|
479
|
+
NotificationMethodUtil.getLabel(microsoftTeams(ID.a, "Alice Example")),
|
|
480
|
+
).toBe("Microsoft Teams: Alice Example");
|
|
481
|
+
expect(
|
|
482
|
+
NotificationMethodUtil.getLabel(
|
|
483
|
+
microsoftTeams(ID.b, undefined, "29:1abc"),
|
|
484
|
+
),
|
|
485
|
+
).toBe("Microsoft Teams: 29:1abc");
|
|
486
|
+
expect(NotificationMethodUtil.getLabel(microsoftTeams(ID.c))).toBe(
|
|
487
|
+
"Microsoft Teams: Unknown Account",
|
|
488
|
+
);
|
|
489
|
+
});
|
|
490
|
+
|
|
373
491
|
test("labels call, sms, whatsapp with the phone number and their prefix", () => {
|
|
374
492
|
expect(NotificationMethodUtil.getLabel(call(ID.a, "+15555550100"))).toBe(
|
|
375
493
|
"Call: +15555550100",
|
|
@@ -418,6 +536,8 @@ describe("NotificationMethodUtil.getDropdownOptions", () => {
|
|
|
418
536
|
userPush: [push(ID.d, "Pixel")],
|
|
419
537
|
userWhatsApps: [whatsApp(ID.e, "+15555550102")],
|
|
420
538
|
userTelegrams: [telegram(ID.f, "@jane")],
|
|
539
|
+
userSlacks: [slack(ID.h, "alice")],
|
|
540
|
+
userMicrosoftTeamsAccounts: [microsoftTeams(ID.i, "Alice Example")],
|
|
421
541
|
userWebhooks: [webhook(ID.g, "Hook")],
|
|
422
542
|
};
|
|
423
543
|
|
|
@@ -434,6 +554,8 @@ describe("NotificationMethodUtil.getDropdownOptions", () => {
|
|
|
434
554
|
"Push: Pixel",
|
|
435
555
|
"WhatsApp: +15555550102",
|
|
436
556
|
"Telegram: @jane",
|
|
557
|
+
"Slack: alice",
|
|
558
|
+
"Microsoft Teams: Alice Example",
|
|
437
559
|
"Webhook: Hook",
|
|
438
560
|
]);
|
|
439
561
|
});
|
|
@@ -465,6 +587,8 @@ describe("NotificationMethodUtil.setSelectedMethodOnRule", () => {
|
|
|
465
587
|
userPush: [push(ID.d, "Pixel")],
|
|
466
588
|
userWhatsApps: [whatsApp(ID.e, "+15555550102")],
|
|
467
589
|
userTelegrams: [telegram(ID.f, "@jane")],
|
|
590
|
+
userSlacks: [slack(ID.h, "alice")],
|
|
591
|
+
userMicrosoftTeamsAccounts: [microsoftTeams(ID.i, "Alice Example")],
|
|
468
592
|
userWebhooks: [webhook(ID.g, "Hook")],
|
|
469
593
|
};
|
|
470
594
|
}
|
|
@@ -489,6 +613,8 @@ describe("NotificationMethodUtil.setSelectedMethodOnRule", () => {
|
|
|
489
613
|
expect(rule.userPushId).toBeUndefined();
|
|
490
614
|
expect(rule.userWhatsAppId).toBeUndefined();
|
|
491
615
|
expect(rule.userTelegramId).toBeUndefined();
|
|
616
|
+
expect(rule.userSlackId).toBeUndefined();
|
|
617
|
+
expect(rule.userMicrosoftTeamsId).toBeUndefined();
|
|
492
618
|
});
|
|
493
619
|
|
|
494
620
|
test("maps each method type to its own foreign key", () => {
|
|
@@ -499,6 +625,8 @@ describe("NotificationMethodUtil.setSelectedMethodOnRule", () => {
|
|
|
499
625
|
{ id: ID.d, key: "userPushId" },
|
|
500
626
|
{ id: ID.e, key: "userWhatsAppId" },
|
|
501
627
|
{ id: ID.f, key: "userTelegramId" },
|
|
628
|
+
{ id: ID.h, key: "userSlackId" },
|
|
629
|
+
{ id: ID.i, key: "userMicrosoftTeamsId" },
|
|
502
630
|
{ id: ID.g, key: "userWebhookId" },
|
|
503
631
|
];
|
|
504
632
|
|
|
@@ -464,4 +464,109 @@ describe("PermissionGate", () => {
|
|
|
464
464
|
).toBeNull();
|
|
465
465
|
});
|
|
466
466
|
});
|
|
467
|
+
/*
|
|
468
|
+
* Column-level gating, added for https://github.com/OneUptime/oneuptime/issues/3360.
|
|
469
|
+
*
|
|
470
|
+
* Record-level gating decides whether to render a button. Column-level
|
|
471
|
+
* gating decides whether a field may go into a SELECT, and the consequence
|
|
472
|
+
* of getting it wrong is much worse: ColumnPermission on the server throws
|
|
473
|
+
* `User is not allowed to read on <column> column of <model>` and fails the
|
|
474
|
+
* ENTIRE request, so one over-eager field blanks the whole page rather than
|
|
475
|
+
* one value. Monitor's secret keys are the first columns on Monitor a
|
|
476
|
+
* legitimate dashboard user can be refused, which is what made this helper
|
|
477
|
+
* necessary.
|
|
478
|
+
*/
|
|
479
|
+
describe("canReadColumn", () => {
|
|
480
|
+
test("refuses a secret key column to a Viewer", () => {
|
|
481
|
+
permissionsForTest = [Permission.Viewer];
|
|
482
|
+
|
|
483
|
+
expect(
|
|
484
|
+
PermissionGate.canReadColumn(new Monitor(), "serverMonitorSecretKey"),
|
|
485
|
+
).toBe(false);
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
test("allows a secret key column to a role that can rotate it", () => {
|
|
489
|
+
permissionsForTest = [Permission.ProjectAdmin];
|
|
490
|
+
|
|
491
|
+
expect(
|
|
492
|
+
PermissionGate.canReadColumn(new Monitor(), "serverMonitorSecretKey"),
|
|
493
|
+
).toBe(true);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
test("still allows the columns a Viewer is meant to see", () => {
|
|
497
|
+
/*
|
|
498
|
+
* The regression that would break the monitor page for read-only users:
|
|
499
|
+
* if this ever returns false, Pages/Monitor/View/Index.tsx stops asking
|
|
500
|
+
* for monitorType and the page cannot decide what kind of monitor it is
|
|
501
|
+
* looking at.
|
|
502
|
+
*/
|
|
503
|
+
permissionsForTest = [Permission.Viewer];
|
|
504
|
+
|
|
505
|
+
expect(PermissionGate.canReadColumn(new Monitor(), "monitorType")).toBe(
|
|
506
|
+
true,
|
|
507
|
+
);
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
test("allows a master admin everything", () => {
|
|
511
|
+
isMasterAdminForTest = true;
|
|
512
|
+
permissionsForTest = [];
|
|
513
|
+
|
|
514
|
+
expect(
|
|
515
|
+
PermissionGate.canReadColumn(new Monitor(), "serverMonitorSecretKey"),
|
|
516
|
+
).toBe(true);
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
test("fails closed while the permission snapshot has not loaded", () => {
|
|
520
|
+
/*
|
|
521
|
+
* The opposite call from PermissionGate.check, and deliberately so.
|
|
522
|
+
* check() hides a button rather than accuse someone of lacking a
|
|
523
|
+
* permission they hold. Here the recoverable outcome is omitting the
|
|
524
|
+
* field - the page renders without one value. Failing open would send
|
|
525
|
+
* the column and hard-fail the request.
|
|
526
|
+
*/
|
|
527
|
+
permissionsForTest = [];
|
|
528
|
+
|
|
529
|
+
expect(
|
|
530
|
+
PermissionGate.canReadColumn(new Monitor(), "serverMonitorSecretKey"),
|
|
531
|
+
).toBe(false);
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
test("allows a column that declares no read access control", () => {
|
|
535
|
+
/*
|
|
536
|
+
* Nothing to enforce, and ColumnPermission agrees - it only refuses
|
|
537
|
+
* columns that name permissions the user does not hold.
|
|
538
|
+
*/
|
|
539
|
+
permissionsForTest = [Permission.Viewer];
|
|
540
|
+
|
|
541
|
+
expect(
|
|
542
|
+
PermissionGate.canReadColumn(
|
|
543
|
+
{
|
|
544
|
+
getColumnAccessControlForAllColumns: () => {
|
|
545
|
+
return { someColumn: { create: [], read: [], update: [] } };
|
|
546
|
+
},
|
|
547
|
+
},
|
|
548
|
+
"someColumn",
|
|
549
|
+
),
|
|
550
|
+
).toBe(true);
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
test("allows a column name the model does not know about", () => {
|
|
554
|
+
permissionsForTest = [Permission.Viewer];
|
|
555
|
+
|
|
556
|
+
expect(PermissionGate.canReadColumn(new Monitor(), "noSuchColumn")).toBe(
|
|
557
|
+
true,
|
|
558
|
+
);
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
test("honours an explicitly supplied permission snapshot", () => {
|
|
562
|
+
// Storage says Viewer; the caller passes something else and wins.
|
|
563
|
+
permissionsForTest = [Permission.Viewer];
|
|
564
|
+
|
|
565
|
+
expect(
|
|
566
|
+
PermissionGate.canReadColumn(new Monitor(), "serverMonitorSecretKey", {
|
|
567
|
+
permissions: [Permission.ProjectOwner],
|
|
568
|
+
}),
|
|
569
|
+
).toBe(true);
|
|
570
|
+
});
|
|
571
|
+
});
|
|
467
572
|
});
|