@oneuptime/common 10.0.53 → 10.0.55
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/Metric.ts +78 -0
- package/Server/API/AIAgentDataAPI.ts +6 -1
- package/Server/API/BillingAPI.ts +28 -6
- package/Server/API/CommonAPI.ts +11 -0
- package/Server/API/DashboardAPI.ts +6 -2
- package/Server/API/DashboardDomainAPI.ts +10 -3
- package/Server/API/GitHubAPI.ts +58 -14
- package/Server/API/MicrosoftTeamsAPI.ts +97 -33
- package/Server/API/OpenSourceDeploymentAPI.ts +2 -2
- package/Server/API/SlackAPI.ts +107 -36
- package/Server/API/StatusAPI.ts +37 -16
- package/Server/API/StatusPageAPI.ts +97 -23
- package/Server/API/StatusPageDomainAPI.ts +6 -3
- package/Server/API/UserAPI.ts +3 -3
- package/Server/API/UserCallAPI.ts +5 -2
- package/Server/API/UserEmailAPI.ts +5 -2
- package/Server/API/UserPushAPI.ts +9 -3
- package/Server/API/UserSmsAPI.ts +5 -2
- package/Server/API/UserWhatsAppAPI.ts +5 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1774559064921-MigrationName.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1775735059360-MigrationName.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/NotificationMiddleware.ts +2 -2
- package/Server/Middleware/ProjectAuthorization.ts +6 -0
- package/Server/Middleware/SCIMAuthorization.ts +2 -1
- package/Server/Middleware/SlackAuthorization.ts +28 -10
- package/Server/Middleware/TelemetryIngest.ts +16 -3
- package/Server/Middleware/UserAuthorization.ts +22 -5
- package/Server/Middleware/WhatsAppAuthorization.ts +15 -4
- package/Server/Services/AIAgentService.ts +13 -6
- package/Server/Services/AIService.ts +9 -3
- package/Server/Services/AlertEpisodeFeedService.ts +17 -5
- package/Server/Services/AlertEpisodeService.ts +34 -3
- package/Server/Services/AlertEpisodeStateTimelineService.ts +80 -22
- package/Server/Services/AlertFeedService.ts +17 -5
- package/Server/Services/AlertGroupingEngineService.ts +36 -7
- package/Server/Services/AlertService.ts +60 -8
- package/Server/Services/AlertStateTimelineService.ts +29 -7
- package/Server/Services/AnalyticsDatabaseService.ts +59 -25
- package/Server/Services/BillingInvoiceService.ts +7 -3
- package/Server/Services/BillingService.ts +9 -2
- package/Server/Services/DashboardDomainService.ts +56 -22
- package/Server/Services/DashboardService.ts +11 -4
- package/Server/Services/DatabaseService.ts +31 -11
- package/Server/Services/IncidentEpisodeFeedService.ts +17 -5
- package/Server/Services/IncidentEpisodeService.ts +34 -3
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +80 -22
- package/Server/Services/IncidentFeedService.ts +33 -9
- package/Server/Services/IncidentGroupingEngineService.ts +35 -6
- package/Server/Services/IncidentService.ts +103 -9
- package/Server/Services/IncidentSlaRuleService.ts +16 -4
- package/Server/Services/IncidentSlaService.ts +20 -4
- package/Server/Services/IncidentStateTimelineService.ts +120 -31
- package/Server/Services/KubernetesClusterService.ts +62 -14
- package/Server/Services/MonitorFeedService.ts +33 -9
- package/Server/Services/MonitorProbeService.ts +46 -23
- package/Server/Services/MonitorService.ts +35 -4
- package/Server/Services/MonitorStatusTimelineService.ts +68 -20
- package/Server/Services/NotificationService.ts +4 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +53 -9
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +9 -2
- package/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.ts +29 -8
- package/Server/Services/OnCallDutyPolicyFeedService.ts +33 -8
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +97 -24
- package/Server/Services/OnCallDutyPolicyService.ts +2 -1
- package/Server/Services/OpenTelemetryIngestService.ts +51 -20
- package/Server/Services/ProbeService.ts +16 -7
- package/Server/Services/ProjectService.ts +21 -7
- package/Server/Services/ScheduledMaintenanceFeedService.ts +17 -4
- package/Server/Services/ScheduledMaintenanceService.ts +52 -6
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +72 -20
- package/Server/Services/StatusPageDomainService.ts +59 -23
- package/Server/Services/StatusPageService.ts +26 -8
- package/Server/Services/StatusPageSubscriberService.ts +382 -111
- package/Server/Services/TeamMemberService.ts +9 -3
- package/Server/Services/UserNotificationRuleService.ts +9 -3
- package/Server/Services/UserService.ts +6 -4
- package/Server/Services/UserWhatsAppService.ts +9 -3
- package/Server/Services/WorkflowService.ts +7 -3
- package/Server/Services/WorkspaceNotificationRuleService.ts +398 -156
- package/Server/Types/Domain.ts +15 -5
- package/Server/Types/Workflow/Components/API/Post.ts +22 -8
- package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +12 -4
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +10 -0
- package/Server/Utils/CodeRepository/CodeRepository.ts +62 -13
- package/Server/Utils/Express.ts +1 -0
- package/Server/Utils/Greenlock/Greenlock.ts +75 -20
- package/Server/Utils/LLM/LLMService.ts +22 -7
- package/Server/Utils/Logger.ts +93 -13
- package/Server/Utils/Monitor/MonitorAlert.ts +15 -3
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +15 -5
- package/Server/Utils/Monitor/MonitorIncident.ts +17 -3
- package/Server/Utils/Monitor/MonitorStatusTimeline.ts +6 -1
- package/Server/Utils/Profiling.ts +11 -5
- package/Server/Utils/Realtime.ts +90 -31
- package/Server/Utils/Response.ts +2 -2
- package/Server/Utils/StartServer.ts +43 -9
- package/Server/Utils/Telemetry/SpanUtil.ts +90 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +58 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +58 -15
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +19 -3
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +87 -22
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +12 -3
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/OnCallDutyPolicy.ts +25 -7
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +55 -8
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +100 -22
- package/Server/Utils/Workspace/Slack/Actions/Alert.ts +35 -9
- package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +32 -8
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +3 -1
- package/Server/Utils/Workspace/Slack/Actions/Incident.ts +52 -11
- package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +4 -1
- package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +89 -20
- package/Server/Utils/Workspace/Slack/Slack.ts +498 -247
- package/Server/Utils/Workspace/Workspace.ts +33 -11
- package/Server/Utils/Workspace/WorkspaceBase.ts +3 -1
- package/Server/Utils/Workspace/WorkspaceMessages/Alert.ts +8 -2
- package/Tests/Server/Middleware/UserAuthorization.test.ts +1 -1
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +12 -3
- package/UI/Components/Charts/Area/AreaChart.tsx +35 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +7 -0
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +33 -0
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +33 -0
- package/UI/Components/Charts/ChartLibrary/Types/FormattedExemplarPoint.ts +14 -0
- package/UI/Components/Charts/Line/LineChart.tsx +35 -1
- package/UI/Components/Charts/Types/ExemplarPoint.ts +6 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +3 -3
- package/UI/Components/Navbar/NavBar.tsx +10 -0
- package/build/dist/Models/AnalyticsModels/Metric.js +70 -0
- package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +6 -6
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +13 -13
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +5 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +2 -2
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardDomainAPI.js +3 -3
- package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +19 -19
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +34 -34
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/OpenSourceDeploymentAPI.js +2 -2
- package/build/dist/Server/API/OpenSourceDeploymentAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +38 -38
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusAPI.js +16 -16
- package/build/dist/Server/API/StatusAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +52 -52
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageDomainAPI.js +3 -3
- package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +3 -3
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +2 -2
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +2 -2
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserPushAPI.js +3 -3
- package/build/dist/Server/API/UserPushAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +2 -2
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1774559064921-MigrationName.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1774559064921-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1775735059360-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1775735059360-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/NotificationMiddleware.js +2 -2
- package/build/dist/Server/Middleware/NotificationMiddleware.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +5 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +2 -2
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SlackAuthorization.js +10 -10
- package/build/dist/Server/Middleware/SlackAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +9 -4
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +10 -5
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/WhatsAppAuthorization.js +6 -6
- package/build/dist/Server/Middleware/WhatsAppAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +13 -7
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +9 -2
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeFeedService.js +17 -5
- package/build/dist/Server/Services/AlertEpisodeFeedService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +40 -10
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js +81 -24
- package/build/dist/Server/Services/AlertEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/AlertFeedService.js +17 -5
- package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +44 -28
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +72 -20
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertStateTimelineService.js +36 -13
- package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +52 -28
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/BillingInvoiceService.js +7 -2
- package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +8 -8
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +49 -27
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +11 -4
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +32 -12
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeFeedService.js +17 -5
- package/build/dist/Server/Services/IncidentEpisodeFeedService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +40 -10
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +81 -24
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFeedService.js +34 -10
- package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +43 -29
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +116 -28
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +19 -11
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaService.js +21 -14
- package/build/dist/Server/Services/IncidentSlaService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +130 -37
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +51 -14
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/MonitorFeedService.js +34 -10
- package/build/dist/Server/Services/MonitorFeedService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +32 -16
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +42 -11
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +69 -21
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/NotificationService.js +4 -3
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +49 -12
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +9 -3
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js +26 -11
- package/build/dist/Server/Services/OnCallDutyPolicyExecutionLogTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js +34 -10
- package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +94 -37
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyService.js +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +45 -17
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +13 -7
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +33 -17
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceFeedService.js +17 -5
- package/build/dist/Server/Services/ScheduledMaintenanceFeedService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +71 -24
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +72 -24
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +55 -29
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +29 -9
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +393 -130
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -2
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +10 -2
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +8 -3
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserWhatsAppService.js +10 -2
- package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowService.js +7 -2
- package/build/dist/Server/Services/WorkflowService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +367 -180
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/Domain.js +12 -6
- package/build/dist/Server/Types/Domain.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -7
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +11 -4
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +7 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/CodeRepository.js +45 -17
- package/build/dist/Server/Utils/CodeRepository/CodeRepository.js.map +1 -1
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/Greenlock/Greenlock.js +36 -29
- package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +18 -6
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +61 -13
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +23 -20
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +13 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +25 -22
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +6 -3
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Server/Utils/Profiling.js +9 -6
- package/build/dist/Server/Utils/Profiling.js.map +1 -1
- package/build/dist/Server/Utils/Realtime.js +50 -34
- package/build/dist/Server/Utils/Realtime.js.map +1 -1
- 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 +23 -11
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +52 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +58 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +58 -15
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +19 -5
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +90 -26
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +12 -3
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/OnCallDutyPolicy.js +25 -7
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/OnCallDutyPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +58 -19
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +102 -29
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +38 -9
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +34 -8
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +3 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +55 -13
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +5 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +91 -26
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +355 -270
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Workspace.js +21 -12
- package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +3 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Alert.js +9 -2
- package/build/dist/Server/Utils/Workspace/WorkspaceMessages/Alert.js.map +1 -1
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +1 -1
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +1 -1
- package/build/dist/Tests/Server/Services/AnalyticsDatabaseService.test.js +12 -6
- package/build/dist/Tests/Server/Services/AnalyticsDatabaseService.test.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +20 -2
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +9 -2
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +9 -2
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedExemplarPoint.js +2 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedExemplarPoint.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +20 -2
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ExemplarPoint.js +2 -0
- package/build/dist/UI/Components/Charts/Types/ExemplarPoint.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +3 -3
- package/build/dist/UI/Components/Navbar/NavBar.js +9 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@ import CreateBy from "../Types/Database/CreateBy";
|
|
|
9
9
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
10
10
|
import { OnCreate } from "../Types/Database/Hooks";
|
|
11
11
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
12
|
-
import logger from "../Utils/Logger";
|
|
12
|
+
import logger, { LogAttributes } from "../Utils/Logger";
|
|
13
13
|
import DatabaseService from "./DatabaseService";
|
|
14
14
|
import MailService from "./MailService";
|
|
15
15
|
import ProjectCallSMSConfigService from "./ProjectCallSMSConfigService";
|
|
@@ -43,38 +43,63 @@ export class Service extends DatabaseService<Model> {
|
|
|
43
43
|
protected override async onBeforeCreate(
|
|
44
44
|
data: CreateBy<Model>,
|
|
45
45
|
): Promise<OnCreate<Model>> {
|
|
46
|
-
logger.debug("onBeforeCreate called with data:"
|
|
47
|
-
|
|
46
|
+
logger.debug("onBeforeCreate called with data:", {
|
|
47
|
+
projectId: data.data.projectId?.toString(),
|
|
48
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
49
|
+
} as LogAttributes);
|
|
50
|
+
logger.debug(data, {
|
|
51
|
+
projectId: data.data.projectId?.toString(),
|
|
52
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
53
|
+
} as LogAttributes);
|
|
48
54
|
|
|
49
55
|
if (!data.data.statusPageId) {
|
|
50
|
-
logger.debug("Status Page ID is missing."
|
|
56
|
+
logger.debug("Status Page ID is missing.", {
|
|
57
|
+
projectId: data.data.projectId?.toString(),
|
|
58
|
+
} as LogAttributes);
|
|
51
59
|
throw new BadDataException("Status Page ID is required.");
|
|
52
60
|
}
|
|
53
61
|
|
|
54
62
|
if (!data.data.projectId) {
|
|
55
|
-
logger.debug("Project ID is missing."
|
|
63
|
+
logger.debug("Project ID is missing.", {
|
|
64
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
65
|
+
} as LogAttributes);
|
|
56
66
|
throw new BadDataException("Project ID is required.");
|
|
57
67
|
}
|
|
58
68
|
|
|
59
69
|
const projectId: ObjectID = data.data.projectId;
|
|
60
|
-
logger.debug(`Project ID: ${projectId}
|
|
70
|
+
logger.debug(`Project ID: ${projectId}`, {
|
|
71
|
+
projectId: data.data.projectId?.toString(),
|
|
72
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
73
|
+
} as LogAttributes);
|
|
61
74
|
|
|
62
75
|
// if the project is on the free plan, then only allow 1 status page.
|
|
63
76
|
if (IsBillingEnabled) {
|
|
64
|
-
logger.debug("Billing is enabled."
|
|
77
|
+
logger.debug("Billing is enabled.", {
|
|
78
|
+
projectId: data.data.projectId?.toString(),
|
|
79
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
80
|
+
} as LogAttributes);
|
|
65
81
|
const currentPlan: CurrentPlan =
|
|
66
82
|
await ProjectService.getCurrentPlan(projectId);
|
|
67
|
-
logger.debug(`Current Plan: ${JSON.stringify(currentPlan)}
|
|
83
|
+
logger.debug(`Current Plan: ${JSON.stringify(currentPlan)}`, {
|
|
84
|
+
projectId: data.data.projectId?.toString(),
|
|
85
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
86
|
+
} as LogAttributes);
|
|
68
87
|
|
|
69
88
|
if (currentPlan.isSubscriptionUnpaid) {
|
|
70
|
-
logger.debug("Subscription is unpaid."
|
|
89
|
+
logger.debug("Subscription is unpaid.", {
|
|
90
|
+
projectId: data.data.projectId?.toString(),
|
|
91
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
92
|
+
} as LogAttributes);
|
|
71
93
|
throw new BadDataException(
|
|
72
94
|
"Your subscription is unpaid. Please update your payment method and to add subscribers.",
|
|
73
95
|
);
|
|
74
96
|
}
|
|
75
97
|
|
|
76
98
|
if (currentPlan.plan === PlanType.Free) {
|
|
77
|
-
logger.debug("Current plan is Free."
|
|
99
|
+
logger.debug("Current plan is Free.", {
|
|
100
|
+
projectId: data.data.projectId?.toString(),
|
|
101
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
102
|
+
} as LogAttributes);
|
|
78
103
|
const subscribersCount: PositiveNumber = await this.countBy({
|
|
79
104
|
query: {
|
|
80
105
|
projectId: projectId,
|
|
@@ -83,11 +108,18 @@ export class Service extends DatabaseService<Model> {
|
|
|
83
108
|
isRoot: true,
|
|
84
109
|
},
|
|
85
110
|
});
|
|
86
|
-
logger.debug(`Subscribers Count: ${subscribersCount.toNumber()}
|
|
111
|
+
logger.debug(`Subscribers Count: ${subscribersCount.toNumber()}`, {
|
|
112
|
+
projectId: data.data.projectId?.toString(),
|
|
113
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
114
|
+
} as LogAttributes);
|
|
87
115
|
|
|
88
116
|
if (subscribersCount.toNumber() >= AllowedSubscribersCountInFreePlan) {
|
|
89
117
|
logger.debug(
|
|
90
118
|
"Reached maximum allowed subscriber limit for the free plan.",
|
|
119
|
+
{
|
|
120
|
+
projectId: data.data.projectId?.toString(),
|
|
121
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
122
|
+
} as LogAttributes,
|
|
91
123
|
);
|
|
92
124
|
throw new BadDataException(
|
|
93
125
|
`You have reached the maximum allowed subscriber limit for the free plan. Please upgrade your plan to add more subscribers.`,
|
|
@@ -99,7 +131,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
99
131
|
let subscriber: Model | null = null;
|
|
100
132
|
|
|
101
133
|
if (data.data.subscriberEmail) {
|
|
102
|
-
logger.debug(`Subscriber Email: ${data.data.subscriberEmail}
|
|
134
|
+
logger.debug(`Subscriber Email: ${data.data.subscriberEmail}`, {
|
|
135
|
+
projectId: data.data.projectId?.toString(),
|
|
136
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
137
|
+
} as LogAttributes);
|
|
103
138
|
subscriber = await this.findOneBy({
|
|
104
139
|
query: {
|
|
105
140
|
statusPageId: data.data.statusPageId,
|
|
@@ -114,18 +149,30 @@ export class Service extends DatabaseService<Model> {
|
|
|
114
149
|
ignoreHooks: true,
|
|
115
150
|
},
|
|
116
151
|
});
|
|
117
|
-
logger.debug(`Found Subscriber by Email: ${JSON.stringify(subscriber)}
|
|
152
|
+
logger.debug(`Found Subscriber by Email: ${JSON.stringify(subscriber)}`, {
|
|
153
|
+
projectId: data.data.projectId?.toString(),
|
|
154
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
155
|
+
} as LogAttributes);
|
|
118
156
|
}
|
|
119
157
|
|
|
120
158
|
if (data.data.subscriberPhone) {
|
|
121
|
-
logger.debug(`Subscriber Phone: ${data.data.subscriberPhone}
|
|
159
|
+
logger.debug(`Subscriber Phone: ${data.data.subscriberPhone}`, {
|
|
160
|
+
projectId: data.data.projectId?.toString(),
|
|
161
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
162
|
+
} as LogAttributes);
|
|
122
163
|
// check if this project has SMS enabled.
|
|
123
164
|
const isSMSEnabled: boolean =
|
|
124
165
|
await ProjectService.isSMSNotificationsEnabled(projectId);
|
|
125
|
-
logger.debug(`Is SMS Enabled: ${isSMSEnabled}
|
|
166
|
+
logger.debug(`Is SMS Enabled: ${isSMSEnabled}`, {
|
|
167
|
+
projectId: data.data.projectId?.toString(),
|
|
168
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
169
|
+
} as LogAttributes);
|
|
126
170
|
|
|
127
171
|
if (!isSMSEnabled) {
|
|
128
|
-
logger.debug("SMS notifications are not enabled for this project."
|
|
172
|
+
logger.debug("SMS notifications are not enabled for this project.", {
|
|
173
|
+
projectId: data.data.projectId?.toString(),
|
|
174
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
175
|
+
} as LogAttributes);
|
|
129
176
|
throw new BadDataException(
|
|
130
177
|
"SMS notifications are not enabled for this project. Please enable SMS notifications in the Project Settings > Notifications Settings.",
|
|
131
178
|
);
|
|
@@ -146,11 +193,17 @@ export class Service extends DatabaseService<Model> {
|
|
|
146
193
|
},
|
|
147
194
|
});
|
|
148
195
|
|
|
149
|
-
logger.debug(`Found Subscriber by Phone: ${JSON.stringify(subscriber)}
|
|
196
|
+
logger.debug(`Found Subscriber by Phone: ${JSON.stringify(subscriber)}`, {
|
|
197
|
+
projectId: data.data.projectId?.toString(),
|
|
198
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
199
|
+
} as LogAttributes);
|
|
150
200
|
}
|
|
151
201
|
|
|
152
202
|
if (subscriber && !subscriber.isUnsubscribed) {
|
|
153
|
-
logger.debug("Subscriber is already subscribed and not unsubscribed."
|
|
203
|
+
logger.debug("Subscriber is already subscribed and not unsubscribed.", {
|
|
204
|
+
projectId: data.data.projectId?.toString(),
|
|
205
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
206
|
+
} as LogAttributes);
|
|
154
207
|
throw new BadDataException(
|
|
155
208
|
"You are already subscribed to this status page.",
|
|
156
209
|
);
|
|
@@ -158,7 +211,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
158
211
|
|
|
159
212
|
// if the user is unsubscribed, delete this record and it'll create a new one.
|
|
160
213
|
if (subscriber) {
|
|
161
|
-
logger.debug("Subscriber is unsubscribed. Deleting old record."
|
|
214
|
+
logger.debug("Subscriber is unsubscribed. Deleting old record.", {
|
|
215
|
+
projectId: data.data.projectId?.toString(),
|
|
216
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
217
|
+
} as LogAttributes);
|
|
162
218
|
await this.deleteOneBy({
|
|
163
219
|
query: {
|
|
164
220
|
_id: subscriber?._id as string,
|
|
@@ -172,7 +228,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
172
228
|
|
|
173
229
|
const statuspages: Array<StatusPage> =
|
|
174
230
|
await this.getStatusPagesToSendNotification([data.data.statusPageId]);
|
|
175
|
-
logger.debug(`Status Pages: ${JSON.stringify(statuspages)}
|
|
231
|
+
logger.debug(`Status Pages: ${JSON.stringify(statuspages)}`, {
|
|
232
|
+
projectId: data.data.projectId?.toString(),
|
|
233
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
234
|
+
} as LogAttributes);
|
|
176
235
|
|
|
177
236
|
const statuspage: StatusPage | undefined = statuspages.find(
|
|
178
237
|
(statuspage: StatusPage) => {
|
|
@@ -183,19 +242,31 @@ export class Service extends DatabaseService<Model> {
|
|
|
183
242
|
);
|
|
184
243
|
|
|
185
244
|
if (!statuspage || !statuspage.projectId) {
|
|
186
|
-
logger.debug("Status Page not found or Project ID is missing."
|
|
245
|
+
logger.debug("Status Page not found or Project ID is missing.", {
|
|
246
|
+
projectId: data.data.projectId?.toString(),
|
|
247
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
248
|
+
} as LogAttributes);
|
|
187
249
|
throw new BadDataException("Status Page not found");
|
|
188
250
|
}
|
|
189
251
|
|
|
190
252
|
data.data.projectId = statuspage.projectId;
|
|
191
|
-
logger.debug(`Updated Project ID: ${data.data.projectId}
|
|
253
|
+
logger.debug(`Updated Project ID: ${data.data.projectId}`, {
|
|
254
|
+
projectId: data.data.projectId?.toString(),
|
|
255
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
256
|
+
} as LogAttributes);
|
|
192
257
|
|
|
193
258
|
const isEmailSubscriber: boolean = Boolean(data.data.subscriberEmail);
|
|
194
259
|
const isSubscriptionConfirmed: boolean = Boolean(
|
|
195
260
|
data.data.isSubscriptionConfirmed,
|
|
196
261
|
);
|
|
197
|
-
logger.debug(`Is Email Subscriber: ${isEmailSubscriber}
|
|
198
|
-
|
|
262
|
+
logger.debug(`Is Email Subscriber: ${isEmailSubscriber}`, {
|
|
263
|
+
projectId: data.data.projectId?.toString(),
|
|
264
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
265
|
+
} as LogAttributes);
|
|
266
|
+
logger.debug(`Is Subscription Confirmed: ${isSubscriptionConfirmed}`, {
|
|
267
|
+
projectId: data.data.projectId?.toString(),
|
|
268
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
269
|
+
} as LogAttributes);
|
|
199
270
|
|
|
200
271
|
if (isEmailSubscriber && !isSubscriptionConfirmed) {
|
|
201
272
|
data.data.isSubscriptionConfirmed = false;
|
|
@@ -204,6 +275,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
204
275
|
}
|
|
205
276
|
logger.debug(
|
|
206
277
|
`Final Subscription Confirmed: ${data.data.isSubscriptionConfirmed}`,
|
|
278
|
+
{
|
|
279
|
+
projectId: data.data.projectId?.toString(),
|
|
280
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
281
|
+
} as LogAttributes,
|
|
207
282
|
);
|
|
208
283
|
|
|
209
284
|
// if slack incoming webhook is provided, then see if it starts with https://hooks.slack.com/services/
|
|
@@ -211,13 +286,20 @@ export class Service extends DatabaseService<Model> {
|
|
|
211
286
|
if (data.data.slackIncomingWebhookUrl) {
|
|
212
287
|
logger.debug(
|
|
213
288
|
`Slack Incoming Webhook URL: ${data.data.slackIncomingWebhookUrl}`,
|
|
289
|
+
{
|
|
290
|
+
projectId: data.data.projectId?.toString(),
|
|
291
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
292
|
+
} as LogAttributes,
|
|
214
293
|
);
|
|
215
294
|
if (
|
|
216
295
|
!SlackUtil.isValidSlackIncomingWebhookUrl(
|
|
217
296
|
data.data.slackIncomingWebhookUrl,
|
|
218
297
|
)
|
|
219
298
|
) {
|
|
220
|
-
logger.debug("Invalid Slack Incoming Webhook URL."
|
|
299
|
+
logger.debug("Invalid Slack Incoming Webhook URL.", {
|
|
300
|
+
projectId: data.data.projectId?.toString(),
|
|
301
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
302
|
+
} as LogAttributes);
|
|
221
303
|
throw new BadDataException("Invalid Slack Incoming Webhook URL.");
|
|
222
304
|
}
|
|
223
305
|
}
|
|
@@ -226,13 +308,20 @@ export class Service extends DatabaseService<Model> {
|
|
|
226
308
|
if (data.data.microsoftTeamsIncomingWebhookUrl) {
|
|
227
309
|
logger.debug(
|
|
228
310
|
`Microsoft Teams Incoming Webhook URL: ${data.data.microsoftTeamsIncomingWebhookUrl}`,
|
|
311
|
+
{
|
|
312
|
+
projectId: data.data.projectId?.toString(),
|
|
313
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
314
|
+
} as LogAttributes,
|
|
229
315
|
);
|
|
230
316
|
if (
|
|
231
317
|
!MicrosoftTeamsUtil.isValidMicrosoftTeamsIncomingWebhookUrl(
|
|
232
318
|
data.data.microsoftTeamsIncomingWebhookUrl,
|
|
233
319
|
)
|
|
234
320
|
) {
|
|
235
|
-
logger.debug("Invalid Microsoft Teams Incoming Webhook URL."
|
|
321
|
+
logger.debug("Invalid Microsoft Teams Incoming Webhook URL.", {
|
|
322
|
+
projectId: data.data.projectId?.toString(),
|
|
323
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
324
|
+
} as LogAttributes);
|
|
236
325
|
throw new BadDataException(
|
|
237
326
|
"Invalid Microsoft Teams Incoming Webhook URL.",
|
|
238
327
|
);
|
|
@@ -245,10 +334,20 @@ export class Service extends DatabaseService<Model> {
|
|
|
245
334
|
).toString();
|
|
246
335
|
logger.debug(
|
|
247
336
|
`Subscription Confirmation Token: ${data.data.subscriptionConfirmationToken}`,
|
|
337
|
+
{
|
|
338
|
+
projectId: data.data.projectId?.toString(),
|
|
339
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
340
|
+
} as LogAttributes,
|
|
248
341
|
);
|
|
249
342
|
|
|
250
|
-
logger.debug("onBeforeCreate processed data:"
|
|
251
|
-
|
|
343
|
+
logger.debug("onBeforeCreate processed data:", {
|
|
344
|
+
projectId: data.data.projectId?.toString(),
|
|
345
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
346
|
+
} as LogAttributes);
|
|
347
|
+
logger.debug(data, {
|
|
348
|
+
projectId: data.data.projectId?.toString(),
|
|
349
|
+
statusPageId: data.data.statusPageId?.toString(),
|
|
350
|
+
} as LogAttributes);
|
|
252
351
|
|
|
253
352
|
return { createBy: data, carryForward: statuspage };
|
|
254
353
|
}
|
|
@@ -258,30 +357,42 @@ export class Service extends DatabaseService<Model> {
|
|
|
258
357
|
onCreate: OnCreate<Model>,
|
|
259
358
|
createdItem: Model,
|
|
260
359
|
): Promise<Model> {
|
|
261
|
-
logger.debug("onCreateSuccess called with createdItem:"
|
|
262
|
-
|
|
360
|
+
logger.debug("onCreateSuccess called with createdItem:", {
|
|
361
|
+
projectId: createdItem.projectId?.toString(),
|
|
362
|
+
} as LogAttributes);
|
|
363
|
+
logger.debug(createdItem, {
|
|
364
|
+
projectId: createdItem.projectId?.toString(),
|
|
365
|
+
} as LogAttributes);
|
|
263
366
|
|
|
264
367
|
if (!createdItem.statusPageId) {
|
|
265
|
-
logger.debug("Status Page ID is missing in createdItem."
|
|
368
|
+
logger.debug("Status Page ID is missing in createdItem.", {
|
|
369
|
+
projectId: createdItem.projectId?.toString(),
|
|
370
|
+
} as LogAttributes);
|
|
266
371
|
return createdItem;
|
|
267
372
|
}
|
|
268
373
|
|
|
269
374
|
const statusPageURL: string = await StatusPageService.getStatusPageURL(
|
|
270
375
|
createdItem.statusPageId,
|
|
271
376
|
);
|
|
272
|
-
logger.debug(`Status Page URL: ${statusPageURL}
|
|
377
|
+
logger.debug(`Status Page URL: ${statusPageURL}`, {
|
|
378
|
+
projectId: createdItem.projectId?.toString(),
|
|
379
|
+
} as LogAttributes);
|
|
273
380
|
|
|
274
381
|
const statusPageName: string =
|
|
275
382
|
onCreate.carryForward.pageTitle ||
|
|
276
383
|
onCreate.carryForward.name ||
|
|
277
384
|
"Status Page";
|
|
278
|
-
logger.debug(`Status Page Name: ${statusPageName}
|
|
385
|
+
logger.debug(`Status Page Name: ${statusPageName}`, {
|
|
386
|
+
projectId: createdItem.projectId?.toString(),
|
|
387
|
+
} as LogAttributes);
|
|
279
388
|
|
|
280
389
|
const unsubscribeLink: string = this.getUnsubscribeLink(
|
|
281
390
|
URL.fromString(statusPageURL),
|
|
282
391
|
createdItem.id!,
|
|
283
392
|
).toString();
|
|
284
|
-
logger.debug(`Unsubscribe Link: ${unsubscribeLink}
|
|
393
|
+
logger.debug(`Unsubscribe Link: ${unsubscribeLink}`, {
|
|
394
|
+
projectId: createdItem.projectId?.toString(),
|
|
395
|
+
} as LogAttributes);
|
|
285
396
|
|
|
286
397
|
if (
|
|
287
398
|
createdItem.statusPageId &&
|
|
@@ -291,6 +402,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
291
402
|
) {
|
|
292
403
|
logger.debug(
|
|
293
404
|
"Subscriber has a phone number and sendYouHaveSubscribedMessage is true.",
|
|
405
|
+
{ projectId: createdItem.projectId?.toString() } as LogAttributes,
|
|
294
406
|
);
|
|
295
407
|
const statusPage: StatusPage | null = await StatusPageService.findOneBy({
|
|
296
408
|
query: {
|
|
@@ -312,12 +424,15 @@ export class Service extends DatabaseService<Model> {
|
|
|
312
424
|
});
|
|
313
425
|
|
|
314
426
|
if (!statusPage) {
|
|
315
|
-
logger.debug("Status Page not found."
|
|
427
|
+
logger.debug("Status Page not found.", {
|
|
428
|
+
projectId: createdItem.projectId?.toString(),
|
|
429
|
+
} as LogAttributes);
|
|
316
430
|
return createdItem;
|
|
317
431
|
}
|
|
318
432
|
|
|
319
433
|
logger.debug(
|
|
320
434
|
`Status Page Call SMS Config: ${JSON.stringify(statusPage.callSmsConfig)}`,
|
|
435
|
+
{ projectId: createdItem.projectId?.toString() } as LogAttributes,
|
|
321
436
|
);
|
|
322
437
|
|
|
323
438
|
SmsService.sendSms(
|
|
@@ -334,7 +449,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
334
449
|
statusPageId: createdItem.statusPageId!,
|
|
335
450
|
},
|
|
336
451
|
).catch((err: Error) => {
|
|
337
|
-
logger.error(err
|
|
452
|
+
logger.error(err, {
|
|
453
|
+
projectId: createdItem.projectId?.toString(),
|
|
454
|
+
} as LogAttributes);
|
|
338
455
|
});
|
|
339
456
|
}
|
|
340
457
|
|
|
@@ -343,15 +460,20 @@ export class Service extends DatabaseService<Model> {
|
|
|
343
460
|
createdItem.subscriberEmail &&
|
|
344
461
|
createdItem._id
|
|
345
462
|
) {
|
|
346
|
-
logger.debug("Subscriber has an email."
|
|
463
|
+
logger.debug("Subscriber has an email.", {
|
|
464
|
+
projectId: createdItem.projectId?.toString(),
|
|
465
|
+
} as LogAttributes);
|
|
347
466
|
const isSubcriptionConfirmed: boolean = Boolean(
|
|
348
467
|
createdItem.isSubscriptionConfirmed,
|
|
349
468
|
);
|
|
350
|
-
logger.debug(`Is Subscription Confirmed: ${isSubcriptionConfirmed}
|
|
469
|
+
logger.debug(`Is Subscription Confirmed: ${isSubcriptionConfirmed}`, {
|
|
470
|
+
projectId: createdItem.projectId?.toString(),
|
|
471
|
+
} as LogAttributes);
|
|
351
472
|
|
|
352
473
|
if (!isSubcriptionConfirmed) {
|
|
353
474
|
logger.debug(
|
|
354
475
|
"Subscription is not confirmed. Sending confirmation email.",
|
|
476
|
+
{ projectId: createdItem.projectId?.toString() } as LogAttributes,
|
|
355
477
|
);
|
|
356
478
|
await this.sendConfirmSubscriptionEmail({
|
|
357
479
|
subscriberId: createdItem.id!,
|
|
@@ -361,6 +483,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
361
483
|
if (isSubcriptionConfirmed && createdItem.sendYouHaveSubscribedMessage) {
|
|
362
484
|
logger.debug(
|
|
363
485
|
"Subscription is confirmed and sendYouHaveSubscribedMessage is true. Sending 'You have subscribed' email.",
|
|
486
|
+
{ projectId: createdItem.projectId?.toString() } as LogAttributes,
|
|
364
487
|
);
|
|
365
488
|
await this.sendYouHaveSubscribedEmail({
|
|
366
489
|
subscriberId: createdItem.id!,
|
|
@@ -370,7 +493,9 @@ export class Service extends DatabaseService<Model> {
|
|
|
370
493
|
|
|
371
494
|
// if slack incoming webhook is provided, then send a message to the slack channel.
|
|
372
495
|
if (createdItem.slackIncomingWebhookUrl) {
|
|
373
|
-
logger.debug("Sending Slack notification for new subscriber."
|
|
496
|
+
logger.debug("Sending Slack notification for new subscriber.", {
|
|
497
|
+
projectId: createdItem.projectId?.toString(),
|
|
498
|
+
} as LogAttributes);
|
|
374
499
|
const slackMessage: string = `## 📢 New Subscription to ${statusPageName}
|
|
375
500
|
|
|
376
501
|
**You have successfully subscribed to receive status updates!**
|
|
@@ -386,18 +511,26 @@ You will receive real-time notifications for:
|
|
|
386
511
|
|
|
387
512
|
Stay informed about service availability! 🚀`;
|
|
388
513
|
|
|
389
|
-
logger.debug(`Slack Message: ${slackMessage}
|
|
514
|
+
logger.debug(`Slack Message: ${slackMessage}`, {
|
|
515
|
+
projectId: createdItem.projectId?.toString(),
|
|
516
|
+
} as LogAttributes);
|
|
390
517
|
|
|
391
518
|
SlackUtil.sendMessageToChannelViaIncomingWebhook({
|
|
392
519
|
url: URL.fromString(createdItem.slackIncomingWebhookUrl.toString()),
|
|
393
520
|
text: SlackUtil.convertMarkdownToSlackRichText(slackMessage),
|
|
394
521
|
})
|
|
395
522
|
.then(() => {
|
|
396
|
-
logger.debug("Slack notification sent successfully."
|
|
523
|
+
logger.debug("Slack notification sent successfully.", {
|
|
524
|
+
projectId: createdItem.projectId?.toString(),
|
|
525
|
+
} as LogAttributes);
|
|
397
526
|
})
|
|
398
527
|
.catch((err: Error) => {
|
|
399
|
-
logger.error("Error sending Slack notification:"
|
|
400
|
-
|
|
528
|
+
logger.error("Error sending Slack notification:", {
|
|
529
|
+
projectId: createdItem.projectId?.toString(),
|
|
530
|
+
} as LogAttributes);
|
|
531
|
+
logger.error(err, {
|
|
532
|
+
projectId: createdItem.projectId?.toString(),
|
|
533
|
+
} as LogAttributes);
|
|
401
534
|
});
|
|
402
535
|
}
|
|
403
536
|
|
|
@@ -406,7 +539,9 @@ Stay informed about service availability! 🚀`;
|
|
|
406
539
|
createdItem.microsoftTeamsIncomingWebhookUrl &&
|
|
407
540
|
createdItem.sendYouHaveSubscribedMessage
|
|
408
541
|
) {
|
|
409
|
-
logger.debug("Sending Microsoft Teams notification for new subscriber."
|
|
542
|
+
logger.debug("Sending Microsoft Teams notification for new subscriber.", {
|
|
543
|
+
projectId: createdItem.projectId?.toString(),
|
|
544
|
+
} as LogAttributes);
|
|
410
545
|
const teamsMessage: string = `## 📢 New Subscription to ${statusPageName}
|
|
411
546
|
|
|
412
547
|
**You have successfully subscribed to receive status updates!**
|
|
@@ -422,7 +557,9 @@ You will receive real-time notifications for:
|
|
|
422
557
|
|
|
423
558
|
Stay informed about service availability! 🚀`;
|
|
424
559
|
|
|
425
|
-
logger.debug(`Teams Message: ${teamsMessage}
|
|
560
|
+
logger.debug(`Teams Message: ${teamsMessage}`, {
|
|
561
|
+
projectId: createdItem.projectId?.toString(),
|
|
562
|
+
} as LogAttributes);
|
|
426
563
|
|
|
427
564
|
MicrosoftTeamsUtil.sendMessageToChannelViaIncomingWebhook({
|
|
428
565
|
url: URL.fromString(
|
|
@@ -431,15 +568,23 @@ Stay informed about service availability! 🚀`;
|
|
|
431
568
|
text: teamsMessage,
|
|
432
569
|
})
|
|
433
570
|
.then(() => {
|
|
434
|
-
logger.debug("Microsoft Teams notification sent successfully."
|
|
571
|
+
logger.debug("Microsoft Teams notification sent successfully.", {
|
|
572
|
+
projectId: createdItem.projectId?.toString(),
|
|
573
|
+
} as LogAttributes);
|
|
435
574
|
})
|
|
436
575
|
.catch((err: Error) => {
|
|
437
|
-
logger.error("Error sending Microsoft Teams notification:"
|
|
438
|
-
|
|
576
|
+
logger.error("Error sending Microsoft Teams notification:", {
|
|
577
|
+
projectId: createdItem.projectId?.toString(),
|
|
578
|
+
} as LogAttributes);
|
|
579
|
+
logger.error(err, {
|
|
580
|
+
projectId: createdItem.projectId?.toString(),
|
|
581
|
+
} as LogAttributes);
|
|
439
582
|
});
|
|
440
583
|
}
|
|
441
584
|
|
|
442
|
-
logger.debug("onCreateSuccess completed."
|
|
585
|
+
logger.debug("onCreateSuccess completed.", {
|
|
586
|
+
projectId: createdItem.projectId?.toString(),
|
|
587
|
+
} as LogAttributes);
|
|
443
588
|
return createdItem;
|
|
444
589
|
}
|
|
445
590
|
|
|
@@ -447,8 +592,12 @@ Stay informed about service availability! 🚀`;
|
|
|
447
592
|
public async sendConfirmSubscriptionEmail(data: {
|
|
448
593
|
subscriberId: ObjectID;
|
|
449
594
|
}): Promise<void> {
|
|
450
|
-
logger.debug("sendConfirmSubscriptionEmail called with data:"
|
|
451
|
-
|
|
595
|
+
logger.debug("sendConfirmSubscriptionEmail called with data:", {
|
|
596
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
597
|
+
} as LogAttributes);
|
|
598
|
+
logger.debug(data, {
|
|
599
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
600
|
+
} as LogAttributes);
|
|
452
601
|
|
|
453
602
|
// get subscriber
|
|
454
603
|
const subscriber: Model | null = await this.findOneBy({
|
|
@@ -468,11 +617,15 @@ Stay informed about service availability! 🚀`;
|
|
|
468
617
|
ignoreHooks: true,
|
|
469
618
|
},
|
|
470
619
|
});
|
|
471
|
-
logger.debug(`Found Subscriber: ${JSON.stringify(subscriber)}
|
|
620
|
+
logger.debug(`Found Subscriber: ${JSON.stringify(subscriber)}`, {
|
|
621
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
622
|
+
} as LogAttributes);
|
|
472
623
|
|
|
473
624
|
// get status page
|
|
474
625
|
if (!subscriber || !subscriber.statusPageId) {
|
|
475
|
-
logger.debug("Subscriber or Status Page ID is missing."
|
|
626
|
+
logger.debug("Subscriber or Status Page ID is missing.", {
|
|
627
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
628
|
+
} as LogAttributes);
|
|
476
629
|
return;
|
|
477
630
|
}
|
|
478
631
|
|
|
@@ -501,27 +654,39 @@ Stay informed about service availability! 🚀`;
|
|
|
501
654
|
ignoreHooks: true,
|
|
502
655
|
},
|
|
503
656
|
});
|
|
504
|
-
logger.debug(`Found Status Page: ${JSON.stringify(statusPage)}
|
|
657
|
+
logger.debug(`Found Status Page: ${JSON.stringify(statusPage)}`, {
|
|
658
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
659
|
+
} as LogAttributes);
|
|
505
660
|
|
|
506
661
|
if (!statusPage || !statusPage.id) {
|
|
507
|
-
logger.debug("Status Page not found or ID is missing."
|
|
662
|
+
logger.debug("Status Page not found or ID is missing.", {
|
|
663
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
664
|
+
} as LogAttributes);
|
|
508
665
|
return;
|
|
509
666
|
}
|
|
510
667
|
|
|
511
668
|
const statusPageURL: string = await StatusPageService.getStatusPageURL(
|
|
512
669
|
statusPage.id,
|
|
513
670
|
);
|
|
514
|
-
logger.debug(`Status Page URL: ${statusPageURL}
|
|
671
|
+
logger.debug(`Status Page URL: ${statusPageURL}`, {
|
|
672
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
673
|
+
} as LogAttributes);
|
|
515
674
|
|
|
516
675
|
const statusPageName: string =
|
|
517
676
|
statusPage.pageTitle || statusPage.name || "Status Page";
|
|
518
|
-
logger.debug(`Status Page Name: ${statusPageName}
|
|
677
|
+
logger.debug(`Status Page Name: ${statusPageName}`, {
|
|
678
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
679
|
+
} as LogAttributes);
|
|
519
680
|
|
|
520
681
|
const host: Hostname = await DatabaseConfig.getHost();
|
|
521
|
-
logger.debug(`Host: ${host}
|
|
682
|
+
logger.debug(`Host: ${host}`, {
|
|
683
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
684
|
+
} as LogAttributes);
|
|
522
685
|
|
|
523
686
|
const httpProtocol: Protocol = await DatabaseConfig.getHttpProtocol();
|
|
524
|
-
logger.debug(`HTTP Protocol: ${httpProtocol}
|
|
687
|
+
logger.debug(`HTTP Protocol: ${httpProtocol}`, {
|
|
688
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
689
|
+
} as LogAttributes);
|
|
525
690
|
const statusPageIdString: string | null =
|
|
526
691
|
statusPage.id?.toString() || statusPage._id?.toString() || null;
|
|
527
692
|
|
|
@@ -530,7 +695,9 @@ Stay informed about service availability! 🚀`;
|
|
|
530
695
|
confirmationToken: subscriber.subscriptionConfirmationToken || "",
|
|
531
696
|
statusPageSubscriberId: subscriber.id!,
|
|
532
697
|
}).toString();
|
|
533
|
-
logger.debug(`Confirm Subscription Link: ${confirmSubscriptionLink}
|
|
698
|
+
logger.debug(`Confirm Subscription Link: ${confirmSubscriptionLink}`, {
|
|
699
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
700
|
+
} as LogAttributes);
|
|
534
701
|
|
|
535
702
|
if (
|
|
536
703
|
subscriber.statusPageId &&
|
|
@@ -541,7 +708,9 @@ Stay informed about service availability! 🚀`;
|
|
|
541
708
|
URL.fromString(statusPageURL),
|
|
542
709
|
subscriber.id!,
|
|
543
710
|
).toString();
|
|
544
|
-
logger.debug(`Unsubscribe URL: ${unsubscribeUrl}
|
|
711
|
+
logger.debug(`Unsubscribe URL: ${unsubscribeUrl}`, {
|
|
712
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
713
|
+
} as LogAttributes);
|
|
545
714
|
|
|
546
715
|
MailService.sendMail(
|
|
547
716
|
{
|
|
@@ -573,11 +742,17 @@ Stay informed about service availability! 🚀`;
|
|
|
573
742
|
statusPageId: statusPage.id!,
|
|
574
743
|
},
|
|
575
744
|
).catch((err: Error) => {
|
|
576
|
-
logger.error(err
|
|
745
|
+
logger.error(err, {
|
|
746
|
+
projectId: subscriber.projectId?.toString(),
|
|
747
|
+
} as LogAttributes);
|
|
577
748
|
});
|
|
578
|
-
logger.debug("Confirmation email sent."
|
|
749
|
+
logger.debug("Confirmation email sent.", {
|
|
750
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
751
|
+
} as LogAttributes);
|
|
579
752
|
} else {
|
|
580
|
-
logger.debug("Subscriber email or ID is missing."
|
|
753
|
+
logger.debug("Subscriber email or ID is missing.", {
|
|
754
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
755
|
+
} as LogAttributes);
|
|
581
756
|
}
|
|
582
757
|
}
|
|
583
758
|
|
|
@@ -585,8 +760,12 @@ Stay informed about service availability! 🚀`;
|
|
|
585
760
|
public async sendYouHaveSubscribedEmail(data: {
|
|
586
761
|
subscriberId: ObjectID;
|
|
587
762
|
}): Promise<void> {
|
|
588
|
-
logger.debug("sendYouHaveSubscribedEmail called with data:"
|
|
589
|
-
|
|
763
|
+
logger.debug("sendYouHaveSubscribedEmail called with data:", {
|
|
764
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
765
|
+
} as LogAttributes);
|
|
766
|
+
logger.debug(data, {
|
|
767
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
768
|
+
} as LogAttributes);
|
|
590
769
|
|
|
591
770
|
// get subscriber
|
|
592
771
|
const subscriber: Model | null = await this.findOneBy({
|
|
@@ -605,11 +784,15 @@ Stay informed about service availability! 🚀`;
|
|
|
605
784
|
ignoreHooks: true,
|
|
606
785
|
},
|
|
607
786
|
});
|
|
608
|
-
logger.debug(`Found Subscriber: ${JSON.stringify(subscriber)}
|
|
787
|
+
logger.debug(`Found Subscriber: ${JSON.stringify(subscriber)}`, {
|
|
788
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
789
|
+
} as LogAttributes);
|
|
609
790
|
|
|
610
791
|
// get status page
|
|
611
792
|
if (!subscriber || !subscriber.statusPageId) {
|
|
612
|
-
logger.debug("Subscriber or Status Page ID is missing."
|
|
793
|
+
logger.debug("Subscriber or Status Page ID is missing.", {
|
|
794
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
795
|
+
} as LogAttributes);
|
|
613
796
|
return;
|
|
614
797
|
}
|
|
615
798
|
|
|
@@ -638,27 +821,39 @@ Stay informed about service availability! 🚀`;
|
|
|
638
821
|
ignoreHooks: true,
|
|
639
822
|
},
|
|
640
823
|
});
|
|
641
|
-
logger.debug(`Found Status Page: ${JSON.stringify(statusPage)}
|
|
824
|
+
logger.debug(`Found Status Page: ${JSON.stringify(statusPage)}`, {
|
|
825
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
826
|
+
} as LogAttributes);
|
|
642
827
|
|
|
643
828
|
if (!statusPage || !statusPage.id) {
|
|
644
|
-
logger.debug("Status Page not found or ID is missing."
|
|
829
|
+
logger.debug("Status Page not found or ID is missing.", {
|
|
830
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
831
|
+
} as LogAttributes);
|
|
645
832
|
return;
|
|
646
833
|
}
|
|
647
834
|
|
|
648
835
|
const statusPageURL: string = await StatusPageService.getStatusPageURL(
|
|
649
836
|
statusPage.id,
|
|
650
837
|
);
|
|
651
|
-
logger.debug(`Status Page URL: ${statusPageURL}
|
|
838
|
+
logger.debug(`Status Page URL: ${statusPageURL}`, {
|
|
839
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
840
|
+
} as LogAttributes);
|
|
652
841
|
|
|
653
842
|
const statusPageName: string =
|
|
654
843
|
statusPage.pageTitle || statusPage.name || "Status Page";
|
|
655
|
-
logger.debug(`Status Page Name: ${statusPageName}
|
|
844
|
+
logger.debug(`Status Page Name: ${statusPageName}`, {
|
|
845
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
846
|
+
} as LogAttributes);
|
|
656
847
|
|
|
657
848
|
const host: Hostname = await DatabaseConfig.getHost();
|
|
658
|
-
logger.debug(`Host: ${host}
|
|
849
|
+
logger.debug(`Host: ${host}`, {
|
|
850
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
851
|
+
} as LogAttributes);
|
|
659
852
|
|
|
660
853
|
const httpProtocol: Protocol = await DatabaseConfig.getHttpProtocol();
|
|
661
|
-
logger.debug(`HTTP Protocol: ${httpProtocol}
|
|
854
|
+
logger.debug(`HTTP Protocol: ${httpProtocol}`, {
|
|
855
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
856
|
+
} as LogAttributes);
|
|
662
857
|
const statusPageIdString: string | null =
|
|
663
858
|
statusPage.id?.toString() || statusPage._id?.toString() || null;
|
|
664
859
|
|
|
@@ -666,14 +861,18 @@ Stay informed about service availability! 🚀`;
|
|
|
666
861
|
URL.fromString(statusPageURL),
|
|
667
862
|
subscriber.id!,
|
|
668
863
|
).toString();
|
|
669
|
-
logger.debug(`Unsubscribe Link: ${unsubscribeLink}
|
|
864
|
+
logger.debug(`Unsubscribe Link: ${unsubscribeLink}`, {
|
|
865
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
866
|
+
} as LogAttributes);
|
|
670
867
|
|
|
671
868
|
if (
|
|
672
869
|
subscriber.statusPageId &&
|
|
673
870
|
subscriber.subscriberEmail &&
|
|
674
871
|
subscriber._id
|
|
675
872
|
) {
|
|
676
|
-
logger.debug("Subscriber has an email and ID."
|
|
873
|
+
logger.debug("Subscriber has an email and ID.", {
|
|
874
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
875
|
+
} as LogAttributes);
|
|
677
876
|
MailService.sendMail(
|
|
678
877
|
{
|
|
679
878
|
toEmail: subscriber.subscriberEmail,
|
|
@@ -703,12 +902,20 @@ Stay informed about service availability! 🚀`;
|
|
|
703
902
|
statusPageId: statusPage.id!,
|
|
704
903
|
},
|
|
705
904
|
).catch((err: Error) => {
|
|
706
|
-
logger.error("Error sending subscription email:"
|
|
707
|
-
|
|
905
|
+
logger.error("Error sending subscription email:", {
|
|
906
|
+
projectId: subscriber.projectId?.toString(),
|
|
907
|
+
} as LogAttributes);
|
|
908
|
+
logger.error(err, {
|
|
909
|
+
projectId: subscriber.projectId?.toString(),
|
|
910
|
+
} as LogAttributes);
|
|
708
911
|
});
|
|
709
|
-
logger.debug("Subscription email sent successfully."
|
|
912
|
+
logger.debug("Subscription email sent successfully.", {
|
|
913
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
914
|
+
} as LogAttributes);
|
|
710
915
|
} else {
|
|
711
|
-
logger.debug("Subscriber email or ID is missing."
|
|
916
|
+
logger.debug("Subscriber email or ID is missing.", {
|
|
917
|
+
statusPageSubscriberId: data.subscriberId?.toString(),
|
|
918
|
+
} as LogAttributes);
|
|
712
919
|
}
|
|
713
920
|
}
|
|
714
921
|
|
|
@@ -717,8 +924,12 @@ Stay informed about service availability! 🚀`;
|
|
|
717
924
|
confirmationToken: string;
|
|
718
925
|
statusPageSubscriberId: ObjectID;
|
|
719
926
|
}): URL {
|
|
720
|
-
logger.debug("getConfirmSubscriptionLink called with data:"
|
|
721
|
-
|
|
927
|
+
logger.debug("getConfirmSubscriptionLink called with data:", {
|
|
928
|
+
statusPageSubscriberId: data.statusPageSubscriberId?.toString(),
|
|
929
|
+
} as LogAttributes);
|
|
930
|
+
logger.debug(data, {
|
|
931
|
+
statusPageSubscriberId: data.statusPageSubscriberId?.toString(),
|
|
932
|
+
} as LogAttributes);
|
|
722
933
|
|
|
723
934
|
const confirmSubscriptionLink: URL = URL.fromString(
|
|
724
935
|
data.statusPageUrl,
|
|
@@ -728,6 +939,9 @@ Stay informed about service availability! 🚀`;
|
|
|
728
939
|
|
|
729
940
|
logger.debug(
|
|
730
941
|
`Generated Confirm Subscription Link: ${confirmSubscriptionLink.toString()}`,
|
|
942
|
+
{
|
|
943
|
+
statusPageSubscriberId: data.statusPageSubscriberId?.toString(),
|
|
944
|
+
} as LogAttributes,
|
|
731
945
|
);
|
|
732
946
|
return confirmSubscriptionLink;
|
|
733
947
|
}
|
|
@@ -737,10 +951,18 @@ Stay informed about service availability! 🚀`;
|
|
|
737
951
|
statusPageId: ObjectID,
|
|
738
952
|
props: DatabaseCommonInteractionProps,
|
|
739
953
|
): Promise<Array<Model>> {
|
|
740
|
-
logger.debug("getSubscribersByStatusPage called with statusPageId:"
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
logger.debug(
|
|
954
|
+
logger.debug("getSubscribersByStatusPage called with statusPageId:", {
|
|
955
|
+
statusPageId: statusPageId?.toString(),
|
|
956
|
+
} as LogAttributes);
|
|
957
|
+
logger.debug(statusPageId, {
|
|
958
|
+
statusPageId: statusPageId?.toString(),
|
|
959
|
+
} as LogAttributes);
|
|
960
|
+
logger.debug("DatabaseCommonInteractionProps:", {
|
|
961
|
+
statusPageId: statusPageId?.toString(),
|
|
962
|
+
} as LogAttributes);
|
|
963
|
+
logger.debug(props, {
|
|
964
|
+
statusPageId: statusPageId?.toString(),
|
|
965
|
+
} as LogAttributes);
|
|
744
966
|
|
|
745
967
|
const subscribers: Array<Model> = await this.findBy({
|
|
746
968
|
query: {
|
|
@@ -765,8 +987,12 @@ Stay informed about service availability! 🚀`;
|
|
|
765
987
|
props: props,
|
|
766
988
|
});
|
|
767
989
|
|
|
768
|
-
logger.debug("Found subscribers:"
|
|
769
|
-
|
|
990
|
+
logger.debug("Found subscribers:", {
|
|
991
|
+
statusPageId: statusPageId?.toString(),
|
|
992
|
+
} as LogAttributes);
|
|
993
|
+
logger.debug(subscribers, {
|
|
994
|
+
statusPageId: statusPageId?.toString(),
|
|
995
|
+
} as LogAttributes);
|
|
770
996
|
|
|
771
997
|
return subscribers;
|
|
772
998
|
}
|
|
@@ -775,17 +1001,29 @@ Stay informed about service availability! 🚀`;
|
|
|
775
1001
|
statusPageUrl: URL,
|
|
776
1002
|
statusPageSubscriberId: ObjectID,
|
|
777
1003
|
): URL {
|
|
778
|
-
logger.debug("getUnsubscribeLink called with statusPageUrl:"
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
logger.debug(
|
|
1004
|
+
logger.debug("getUnsubscribeLink called with statusPageUrl:", {
|
|
1005
|
+
statusPageSubscriberId: statusPageSubscriberId?.toString(),
|
|
1006
|
+
} as LogAttributes);
|
|
1007
|
+
logger.debug(statusPageUrl, {
|
|
1008
|
+
statusPageSubscriberId: statusPageSubscriberId?.toString(),
|
|
1009
|
+
} as LogAttributes);
|
|
1010
|
+
logger.debug("statusPageSubscriberId:", {
|
|
1011
|
+
statusPageSubscriberId: statusPageSubscriberId?.toString(),
|
|
1012
|
+
} as LogAttributes);
|
|
1013
|
+
logger.debug(statusPageSubscriberId, {
|
|
1014
|
+
statusPageSubscriberId: statusPageSubscriberId?.toString(),
|
|
1015
|
+
} as LogAttributes);
|
|
782
1016
|
|
|
783
1017
|
const unsubscribeLink: URL = URL.fromString(
|
|
784
1018
|
statusPageUrl.toString(),
|
|
785
1019
|
).addRoute("/update-subscription/" + statusPageSubscriberId.toString());
|
|
786
1020
|
|
|
787
|
-
logger.debug("Generated Unsubscribe Link:"
|
|
788
|
-
|
|
1021
|
+
logger.debug("Generated Unsubscribe Link:", {
|
|
1022
|
+
statusPageSubscriberId: statusPageSubscriberId?.toString(),
|
|
1023
|
+
} as LogAttributes);
|
|
1024
|
+
logger.debug(unsubscribeLink, {
|
|
1025
|
+
statusPageSubscriberId: statusPageSubscriberId?.toString(),
|
|
1026
|
+
} as LogAttributes);
|
|
789
1027
|
|
|
790
1028
|
return unsubscribeLink;
|
|
791
1029
|
}
|
|
@@ -796,13 +1034,19 @@ Stay informed about service availability! 🚀`;
|
|
|
796
1034
|
statusPage: StatusPage;
|
|
797
1035
|
eventType: StatusPageEventType;
|
|
798
1036
|
}): boolean {
|
|
799
|
-
logger.debug("shouldSendNotification called with data:"
|
|
800
|
-
|
|
1037
|
+
logger.debug("shouldSendNotification called with data:", {
|
|
1038
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1039
|
+
} as LogAttributes);
|
|
1040
|
+
logger.debug(data, {
|
|
1041
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1042
|
+
} as LogAttributes);
|
|
801
1043
|
|
|
802
1044
|
let shouldSendNotification: boolean = true; // default to true.
|
|
803
1045
|
|
|
804
1046
|
if (data.subscriber.isUnsubscribed) {
|
|
805
|
-
logger.debug("Subscriber is unsubscribed."
|
|
1047
|
+
logger.debug("Subscriber is unsubscribed.", {
|
|
1048
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1049
|
+
} as LogAttributes);
|
|
806
1050
|
shouldSendNotification = false;
|
|
807
1051
|
return shouldSendNotification;
|
|
808
1052
|
}
|
|
@@ -817,6 +1061,7 @@ Stay informed about service availability! 🚀`;
|
|
|
817
1061
|
) {
|
|
818
1062
|
logger.debug(
|
|
819
1063
|
"Subscriber can choose resources and is not subscribed to all resources.",
|
|
1064
|
+
{ statusPageId: data.statusPage?.id?.toString() } as LogAttributes,
|
|
820
1065
|
);
|
|
821
1066
|
const subscriberResourceIds: Array<string> =
|
|
822
1067
|
data.subscriber.statusPageResources?.map(
|
|
@@ -825,27 +1070,37 @@ Stay informed about service availability! 🚀`;
|
|
|
825
1070
|
},
|
|
826
1071
|
) || [];
|
|
827
1072
|
|
|
828
|
-
logger.debug(`Subscriber Resource IDs: ${subscriberResourceIds}
|
|
1073
|
+
logger.debug(`Subscriber Resource IDs: ${subscriberResourceIds}`, {
|
|
1074
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1075
|
+
} as LogAttributes);
|
|
829
1076
|
|
|
830
1077
|
let shouldSendNotificationForResource: boolean = false;
|
|
831
1078
|
|
|
832
1079
|
if (subscriberResourceIds.length === 0) {
|
|
833
|
-
logger.debug("Subscriber has no resource IDs."
|
|
1080
|
+
logger.debug("Subscriber has no resource IDs.", {
|
|
1081
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1082
|
+
} as LogAttributes);
|
|
834
1083
|
shouldSendNotificationForResource = false;
|
|
835
1084
|
} else {
|
|
836
1085
|
for (const resource of data.statusPageResources) {
|
|
837
|
-
logger.debug(`Checking resource: ${resource.id}
|
|
1086
|
+
logger.debug(`Checking resource: ${resource.id}`, {
|
|
1087
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1088
|
+
} as LogAttributes);
|
|
838
1089
|
if (
|
|
839
1090
|
subscriberResourceIds.includes(resource.id?.toString() as string)
|
|
840
1091
|
) {
|
|
841
|
-
logger.debug("Resource ID matches subscriber's resource ID."
|
|
1092
|
+
logger.debug("Resource ID matches subscriber's resource ID.", {
|
|
1093
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1094
|
+
} as LogAttributes);
|
|
842
1095
|
shouldSendNotificationForResource = true;
|
|
843
1096
|
}
|
|
844
1097
|
}
|
|
845
1098
|
}
|
|
846
1099
|
|
|
847
1100
|
if (!shouldSendNotificationForResource) {
|
|
848
|
-
logger.debug("Should not send notification for resource."
|
|
1101
|
+
logger.debug("Should not send notification for resource.", {
|
|
1102
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1103
|
+
} as LogAttributes);
|
|
849
1104
|
shouldSendNotification = false;
|
|
850
1105
|
}
|
|
851
1106
|
}
|
|
@@ -858,27 +1113,36 @@ Stay informed about service availability! 🚀`;
|
|
|
858
1113
|
) {
|
|
859
1114
|
logger.debug(
|
|
860
1115
|
"Subscriber can choose event types and is not subscribed to all event types.",
|
|
1116
|
+
{ statusPageId: data.statusPage?.id?.toString() } as LogAttributes,
|
|
861
1117
|
);
|
|
862
1118
|
const subscriberEventTypes: Array<StatusPageEventType> =
|
|
863
1119
|
data.subscriber.statusPageEventTypes || [];
|
|
864
1120
|
|
|
865
|
-
logger.debug(`Subscriber Event Types: ${subscriberEventTypes}
|
|
1121
|
+
logger.debug(`Subscriber Event Types: ${subscriberEventTypes}`, {
|
|
1122
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1123
|
+
} as LogAttributes);
|
|
866
1124
|
|
|
867
1125
|
let shouldSendNotificationForEventType: boolean = false;
|
|
868
1126
|
|
|
869
1127
|
if (subscriberEventTypes.includes(data.eventType)) {
|
|
870
|
-
logger.debug("Event type matches subscriber's event type."
|
|
1128
|
+
logger.debug("Event type matches subscriber's event type.", {
|
|
1129
|
+
statusPageId: data.statusPage?.id?.toString(),
|
|
1130
|
+
} as LogAttributes);
|
|
871
1131
|
shouldSendNotificationForEventType = true;
|
|
872
1132
|
}
|
|
873
1133
|
|
|
874
1134
|
if (!shouldSendNotificationForEventType) {
|
|
875
|
-
logger.debug(
|
|
1135
|
+
logger.debug(
|
|
1136
|
+
"Should not send notification for event type.",
|
|
1137
|
+
{} as LogAttributes,
|
|
1138
|
+
);
|
|
876
1139
|
shouldSendNotification = false;
|
|
877
1140
|
}
|
|
878
1141
|
}
|
|
879
1142
|
|
|
880
1143
|
logger.debug(
|
|
881
1144
|
`Final decision on shouldSendNotification: ${shouldSendNotification}`,
|
|
1145
|
+
{} as LogAttributes,
|
|
882
1146
|
);
|
|
883
1147
|
return shouldSendNotification;
|
|
884
1148
|
}
|
|
@@ -887,8 +1151,11 @@ Stay informed about service availability! 🚀`;
|
|
|
887
1151
|
public async getStatusPagesToSendNotification(
|
|
888
1152
|
statusPageIds: Array<ObjectID>,
|
|
889
1153
|
): Promise<Array<StatusPage>> {
|
|
890
|
-
logger.debug(
|
|
891
|
-
|
|
1154
|
+
logger.debug(
|
|
1155
|
+
"getStatusPagesToSendNotification called with statusPageIds:",
|
|
1156
|
+
{} as LogAttributes,
|
|
1157
|
+
);
|
|
1158
|
+
logger.debug(statusPageIds, {} as LogAttributes);
|
|
892
1159
|
|
|
893
1160
|
const statusPages: Array<StatusPage> = await StatusPageService.findBy({
|
|
894
1161
|
query: {
|
|
@@ -937,8 +1204,8 @@ Stay informed about service availability! 🚀`;
|
|
|
937
1204
|
},
|
|
938
1205
|
});
|
|
939
1206
|
|
|
940
|
-
logger.debug("Found status pages:");
|
|
941
|
-
logger.debug(statusPages);
|
|
1207
|
+
logger.debug("Found status pages:", {} as LogAttributes);
|
|
1208
|
+
logger.debug(statusPages, {} as LogAttributes);
|
|
942
1209
|
|
|
943
1210
|
return statusPages;
|
|
944
1211
|
}
|
|
@@ -1000,8 +1267,12 @@ You will receive real-time notifications for:
|
|
|
1000
1267
|
text: SlackUtil.convertMarkdownToSlackRichText(markdownMessage),
|
|
1001
1268
|
});
|
|
1002
1269
|
} catch (error) {
|
|
1003
|
-
logger.error("Error sending test Slack notification:"
|
|
1004
|
-
|
|
1270
|
+
logger.error("Error sending test Slack notification:", {
|
|
1271
|
+
projectId: statusPage?.projectId?.toString(),
|
|
1272
|
+
} as LogAttributes);
|
|
1273
|
+
logger.error(error, {
|
|
1274
|
+
projectId: statusPage?.projectId?.toString(),
|
|
1275
|
+
} as LogAttributes);
|
|
1005
1276
|
throw error;
|
|
1006
1277
|
}
|
|
1007
1278
|
}
|