@oneuptime/common 12.0.28 → 12.0.30
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/DashboardDomain.ts +43 -0
- package/Models/DatabaseModels/Index.ts +11 -0
- package/Models/DatabaseModels/MonitorTemplate.ts +15 -3
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
- package/Models/DatabaseModels/StatusPageDomain.ts +43 -0
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
- package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
- package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
- package/Server/API/DashboardDomainAPI.ts +74 -0
- package/Server/API/MicrosoftTeamsAPI.ts +81 -180
- package/Server/API/OnCallCalendarAPI.ts +2194 -0
- package/Server/API/StatusPageDomainAPI.ts +74 -0
- package/Server/EnvironmentConfig.ts +138 -0
- package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.ts +43 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.ts +40 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
- package/Server/Middleware/ProjectAuthorization.ts +6 -1
- package/Server/Services/DashboardDomainService.ts +131 -0
- package/Server/Services/Index.ts +12 -0
- package/Server/Services/LogPipelineProcessorService.ts +88 -0
- package/Server/Services/MonitorTemplateService.ts +70 -11
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
- package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
- package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
- package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
- package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
- package/Server/Services/StatusPageDomainService.ts +163 -3
- package/Server/Services/StatusPagePrivateUserSessionService.ts +197 -56
- package/Server/Services/TeamMemberService.ts +489 -1
- package/Server/Services/TeamService.ts +50 -0
- package/Server/Services/UserNotificationSettingService.ts +44 -1
- package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
- package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
- package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
- package/Server/Types/Domain.ts +17 -0
- package/Server/Utils/APIKey/AccessPermission.ts +24 -0
- package/Server/Utils/Greenlock/Greenlock.ts +156 -58
- package/Server/Utils/LogPipelineProcessorValidation.ts +112 -0
- package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
- package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
- package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
- package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
- package/Server/Utils/Response.ts +134 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +1094 -45
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +153 -17
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +23 -11
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +0 -170
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.ts +158 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +23 -11
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +35 -13
- package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +505 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
- package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +106 -0
- package/Tests/App/StatusPage/StatusPageLoginCodeUtil.test.ts +84 -0
- package/Tests/App/StatusPage/StatusPageRedirectSafety.test.ts +119 -0
- package/Tests/Models/MonitorTemplateMonitorNameColumn.test.ts +258 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
- package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
- package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
- package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
- package/Tests/Server/API/CustomDomainReissueSslAPI.test.ts +469 -0
- package/Tests/Server/API/Helpers.ts +8 -0
- package/Tests/Server/API/MicrosoftTeamsBotMessagesEndpoint.test.ts +729 -0
- package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +26 -0
- package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +402 -0
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
- package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +369 -0
- package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -0
- package/Tests/Server/Services/AddCertificateReissueRequestedAtToDomainsMigration.test.ts +287 -0
- package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +477 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
- package/Tests/Server/Services/LogPipelineProcessorSaveValidation.test.ts +249 -0
- package/Tests/Server/Services/MonitorTemplateServiceBulkSync.test.ts +549 -0
- package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +16 -3
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +57 -0
- package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
- package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +151 -15
- package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +587 -0
- package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
- package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
- package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
- package/Tests/Server/Types/Database/Permissions/ApiKeyFileAccess.test.ts +286 -0
- package/Tests/Server/Types/Database/Permissions/MonitorTemplateColumnAccess.test.ts +328 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
- package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAndIsNull.test.ts +83 -0
- package/Tests/Server/Utils/AI/SRE/ConfidenceSignal.test.ts +377 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +16 -1
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +250 -0
- package/Tests/Server/Utils/LogPipelineProcessorValidation.test.ts +198 -0
- package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
- package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
- package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +48 -9
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsAuth.test.ts +726 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +74 -11
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +1107 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +20 -3
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +51 -11
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +1246 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +961 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +653 -0
- package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
- package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +880 -0
- package/Tests/Types/API/HTTPResponse.test.ts +175 -0
- package/Tests/Types/API/Route.test.ts +36 -4
- package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
- package/Tests/Types/Database/DatabaseProperty.test.ts +171 -0
- package/Tests/Types/DateLocalShortDateTimeString.test.ts +518 -0
- package/Tests/Types/DateLocalTimeString.test.ts +259 -0
- package/Tests/Types/DateUserPrefers12HourFormat.test.ts +316 -0
- package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
- package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
- package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
- package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
- package/Tests/UI/Components/LogsHistogram.test.tsx +41 -2
- package/Tests/UI/Components/LogsViewerEmptyStateTimeRange.test.tsx +212 -0
- package/Tests/UI/Components/TelemetryChartClockFormat.test.tsx +359 -0
- package/Tests/UI/Components/TimeRangePickerClockFormat.test.tsx +422 -0
- package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +146 -8
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +520 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/Navigation.test.ts +82 -0
- package/Tests/Utils/Array.test.ts +100 -0
- package/Tests/Utils/CertificateReissue.test.ts +225 -0
- package/Tests/Utils/Grok/Grok.test.ts +492 -0
- package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +181 -13
- package/Types/API/Route.ts +20 -5
- package/Types/Calendar/ICalendar.ts +442 -0
- package/Types/Date.ts +143 -13
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
- package/Types/OnCallDutyPolicy/Layer.ts +190 -35
- package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
- package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
- package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
- package/Types/Rum/SessionReplay.ts +62 -1
- package/UI/Components/Date/TimeRangePickerDropdown.tsx +9 -5
- package/UI/Components/LogsViewer/LogsViewer.tsx +12 -7
- package/UI/Components/LogsViewer/components/HistogramTooltip.tsx +18 -17
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +21 -28
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +2 -4
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +2 -4
- package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +17 -16
- package/UI/Utils/Navigation.ts +42 -0
- package/Utils/Array.ts +37 -0
- package/Utils/CertificateReissue.ts +128 -0
- package/Utils/Grok/Grok.ts +461 -0
- package/Utils/Grok/GrokPatterns.ts +118 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +58 -6
- package/build/dist/Models/DatabaseModels/DashboardDomain.js +44 -0
- package/build/dist/Models/DatabaseModels/DashboardDomain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +11 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +17 -4
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageDomain.js +44 -0
- package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
- package/build/dist/Server/API/DashboardDomainAPI.js +43 -1
- package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +74 -118
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageDomainAPI.js +43 -1
- package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +102 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.js +28 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js +6 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +104 -0
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +12 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogPipelineProcessorService.js +65 -0
- package/build/dist/Server/Services/LogPipelineProcessorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +57 -11
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/StatusPageDomainService.js +132 -3
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +112 -32
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +396 -1
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +43 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
- package/build/dist/Server/Types/Domain.js +16 -0
- package/build/dist/Server/Types/Domain.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +24 -0
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/Greenlock/Greenlock.js +110 -35
- package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
- package/build/dist/Server/Utils/LogPipelineProcessorValidation.js +77 -0
- package/build/dist/Server/Utils/LogPipelineProcessorValidation.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +97 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +777 -36
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +108 -17
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +9 -1
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +17 -6
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +0 -159
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.js +128 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +17 -6
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -13
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/Route.js +16 -5
- package/build/dist/Types/API/Route.js.map +1 -1
- package/build/dist/Types/Calendar/ICalendar.js +290 -0
- package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
- package/build/dist/Types/Date.js +115 -13
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +38 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +9 -5
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +12 -7
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js +15 -14
- package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +17 -22
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +2 -4
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +2 -4
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +15 -14
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +30 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/Utils/Array.js +25 -0
- package/build/dist/Utils/Array.js.map +1 -1
- package/build/dist/Utils/CertificateReissue.js +97 -0
- package/build/dist/Utils/CertificateReissue.js.map +1 -0
- package/build/dist/Utils/Grok/Grok.js +324 -0
- package/build/dist/Utils/Grok/Grok.js.map +1 -0
- package/build/dist/Utils/Grok/GrokPatterns.js +112 -0
- package/build/dist/Utils/Grok/GrokPatterns.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +63 -3
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
- package/package.json +1 -1
- package/UI/Utils/JsonWebToken.ts +0 -14
- package/build/dist/UI/Utils/JsonWebToken.js +0 -10
- package/build/dist/UI/Utils/JsonWebToken.js.map +0 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import Project from "./Project";
|
|
2
|
+
import User from "./User";
|
|
3
|
+
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
|
4
|
+
import Route from "../../Types/API/Route";
|
|
5
|
+
import AllowAccessIfSubscriptionIsUnpaid from "../../Types/Database/AccessControl/AllowAccessIfSubscriptionIsUnpaid";
|
|
6
|
+
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
|
7
|
+
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
|
8
|
+
import ColumnType from "../../Types/Database/ColumnType";
|
|
9
|
+
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
|
10
|
+
import CurrentUserCanAccessRecordBy from "../../Types/Database/CurrentUserCanAccessRecordBy";
|
|
11
|
+
import TableColumn from "../../Types/Database/TableColumn";
|
|
12
|
+
import TableColumnType from "../../Types/Database/TableColumnType";
|
|
13
|
+
import TableMetadata from "../../Types/Database/TableMetadata";
|
|
14
|
+
import TenantColumn from "../../Types/Database/TenantColumn";
|
|
15
|
+
import IconProp from "../../Types/Icon/IconProp";
|
|
16
|
+
import ObjectID from "../../Types/ObjectID";
|
|
17
|
+
import Permission from "../../Types/Permission";
|
|
18
|
+
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* Bounds on the lead time, shared with the dashboard's custom-lead input.
|
|
22
|
+
* Below 15 minutes the reminder races the shift's own hand-off notification;
|
|
23
|
+
* above two weeks the roster is not settled enough to be worth interrupting
|
|
24
|
+
* for.
|
|
25
|
+
*/
|
|
26
|
+
export const MIN_MINUTES_BEFORE_SHIFT: number = 15;
|
|
27
|
+
export const MAX_MINUTES_BEFORE_SHIFT: number = 14 * 24 * 60;
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* "Remind me N minutes before my on-call shift starts."
|
|
31
|
+
*
|
|
32
|
+
* One row per lead time a user has configured in a project - the settings
|
|
33
|
+
* page's chips (1 week / 1 day / 1 hour / 15 min / custom) are rows here.
|
|
34
|
+
* UNIQUE (projectId, userId, minutesBeforeShift) makes a double-click on a
|
|
35
|
+
* chip a no-op rather than a duplicate reminder. The reminder worker reads
|
|
36
|
+
* these, materializes the user's upcoming shifts, and sends through the
|
|
37
|
+
* user's notification settings for SEND_BEFORE_USER_ON_CALL_SHIFT_STARTS.
|
|
38
|
+
*
|
|
39
|
+
* Shaped like UserNotificationSetting: tenant scoped, owned by the user
|
|
40
|
+
* (@CurrentUserCanAccessRecordBy), every operation open to the owner and to
|
|
41
|
+
* nobody else. The service bounds minutesBeforeShift to 15 min ... 2 weeks.
|
|
42
|
+
*/
|
|
43
|
+
@TenantColumn("projectId")
|
|
44
|
+
@AllowAccessIfSubscriptionIsUnpaid()
|
|
45
|
+
@TableAccessControl({
|
|
46
|
+
create: [Permission.CurrentUser],
|
|
47
|
+
read: [Permission.CurrentUser],
|
|
48
|
+
delete: [Permission.CurrentUser],
|
|
49
|
+
update: [Permission.CurrentUser],
|
|
50
|
+
})
|
|
51
|
+
@CrudApiEndpoint(new Route("/user-on-call-shift-reminder"))
|
|
52
|
+
@Entity({
|
|
53
|
+
name: "UserOnCallShiftReminder",
|
|
54
|
+
})
|
|
55
|
+
@TableMetadata({
|
|
56
|
+
tableName: "UserOnCallShiftReminder",
|
|
57
|
+
singularName: "On-Call Shift Reminder",
|
|
58
|
+
pluralName: "On-Call Shift Reminders",
|
|
59
|
+
icon: IconProp.Bell,
|
|
60
|
+
tableDescription:
|
|
61
|
+
"How long before an on-call shift starts a user wants to be reminded.",
|
|
62
|
+
})
|
|
63
|
+
@CurrentUserCanAccessRecordBy("userId")
|
|
64
|
+
@Index(["projectId", "userId", "minutesBeforeShift"], { unique: true })
|
|
65
|
+
export default class UserOnCallShiftReminder extends BaseModel {
|
|
66
|
+
@ColumnAccessControl({
|
|
67
|
+
create: [Permission.CurrentUser],
|
|
68
|
+
read: [Permission.CurrentUser],
|
|
69
|
+
update: [],
|
|
70
|
+
})
|
|
71
|
+
@TableColumn({
|
|
72
|
+
manyToOneRelationColumn: "projectId",
|
|
73
|
+
type: TableColumnType.Entity,
|
|
74
|
+
modelType: Project,
|
|
75
|
+
title: "Project",
|
|
76
|
+
description: "Relation to Project Resource in which this object belongs",
|
|
77
|
+
})
|
|
78
|
+
@ManyToOne(
|
|
79
|
+
() => {
|
|
80
|
+
return Project;
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
eager: false,
|
|
84
|
+
nullable: true,
|
|
85
|
+
onDelete: "CASCADE",
|
|
86
|
+
orphanedRowAction: "nullify",
|
|
87
|
+
},
|
|
88
|
+
)
|
|
89
|
+
@JoinColumn({ name: "projectId" })
|
|
90
|
+
public project?: Project = undefined;
|
|
91
|
+
|
|
92
|
+
@ColumnAccessControl({
|
|
93
|
+
create: [Permission.CurrentUser],
|
|
94
|
+
read: [Permission.CurrentUser],
|
|
95
|
+
update: [],
|
|
96
|
+
})
|
|
97
|
+
@Index()
|
|
98
|
+
@TableColumn({
|
|
99
|
+
type: TableColumnType.ObjectID,
|
|
100
|
+
required: true,
|
|
101
|
+
canReadOnRelationQuery: true,
|
|
102
|
+
title: "Project ID",
|
|
103
|
+
description: "ID of your OneUptime Project in which this object belongs",
|
|
104
|
+
example: "5f8b9c0d-e1a2-4b3c-8d5e-6f7a8b9c0d1e",
|
|
105
|
+
})
|
|
106
|
+
@Column({
|
|
107
|
+
type: ColumnType.ObjectID,
|
|
108
|
+
nullable: false,
|
|
109
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
110
|
+
})
|
|
111
|
+
public projectId?: ObjectID = undefined;
|
|
112
|
+
|
|
113
|
+
@ColumnAccessControl({
|
|
114
|
+
create: [Permission.CurrentUser],
|
|
115
|
+
read: [Permission.CurrentUser],
|
|
116
|
+
update: [],
|
|
117
|
+
})
|
|
118
|
+
@TableColumn({
|
|
119
|
+
manyToOneRelationColumn: "userId",
|
|
120
|
+
type: TableColumnType.Entity,
|
|
121
|
+
modelType: User,
|
|
122
|
+
title: "User",
|
|
123
|
+
description: "Relation to the User who wants to be reminded",
|
|
124
|
+
})
|
|
125
|
+
@ManyToOne(
|
|
126
|
+
() => {
|
|
127
|
+
return User;
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
eager: false,
|
|
131
|
+
nullable: true,
|
|
132
|
+
onDelete: "CASCADE",
|
|
133
|
+
orphanedRowAction: "nullify",
|
|
134
|
+
},
|
|
135
|
+
)
|
|
136
|
+
@JoinColumn({ name: "userId" })
|
|
137
|
+
public user?: User = undefined;
|
|
138
|
+
|
|
139
|
+
@ColumnAccessControl({
|
|
140
|
+
create: [Permission.CurrentUser],
|
|
141
|
+
read: [Permission.CurrentUser],
|
|
142
|
+
update: [],
|
|
143
|
+
})
|
|
144
|
+
@Index()
|
|
145
|
+
@TableColumn({
|
|
146
|
+
type: TableColumnType.ObjectID,
|
|
147
|
+
required: true,
|
|
148
|
+
canReadOnRelationQuery: true,
|
|
149
|
+
title: "User ID",
|
|
150
|
+
description: "ID of the User who wants to be reminded",
|
|
151
|
+
example: "7c9d8e0f-a1b2-4c3d-9e5f-8a7b9c0d1e2f",
|
|
152
|
+
})
|
|
153
|
+
@Column({
|
|
154
|
+
type: ColumnType.ObjectID,
|
|
155
|
+
nullable: false,
|
|
156
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
157
|
+
})
|
|
158
|
+
public userId?: ObjectID = undefined;
|
|
159
|
+
|
|
160
|
+
/*
|
|
161
|
+
* Lead time in minutes. 15 ... 20160 (two weeks), enforced by the service:
|
|
162
|
+
* below 15 the reminder races the shift's own hand-off notification, above
|
|
163
|
+
* two weeks the roster is not settled enough to be worth interrupting for.
|
|
164
|
+
*/
|
|
165
|
+
@ColumnAccessControl({
|
|
166
|
+
create: [Permission.CurrentUser],
|
|
167
|
+
read: [Permission.CurrentUser],
|
|
168
|
+
update: [Permission.CurrentUser],
|
|
169
|
+
})
|
|
170
|
+
@TableColumn({
|
|
171
|
+
required: true,
|
|
172
|
+
type: TableColumnType.Number,
|
|
173
|
+
canReadOnRelationQuery: true,
|
|
174
|
+
title: "Minutes Before Shift",
|
|
175
|
+
description:
|
|
176
|
+
"How many minutes before the shift starts to send the reminder (15 to 20160).",
|
|
177
|
+
example: 60,
|
|
178
|
+
})
|
|
179
|
+
@Column({
|
|
180
|
+
type: ColumnType.Number,
|
|
181
|
+
nullable: false,
|
|
182
|
+
})
|
|
183
|
+
public minutesBeforeShift?: number = undefined;
|
|
184
|
+
|
|
185
|
+
@ColumnAccessControl({
|
|
186
|
+
create: [],
|
|
187
|
+
read: [],
|
|
188
|
+
update: [],
|
|
189
|
+
})
|
|
190
|
+
@TableColumn({
|
|
191
|
+
manyToOneRelationColumn: "deletedByUserId",
|
|
192
|
+
type: TableColumnType.Entity,
|
|
193
|
+
title: "Deleted by User",
|
|
194
|
+
modelType: User,
|
|
195
|
+
description:
|
|
196
|
+
"Relation to User who deleted this object (if this object was deleted by a User)",
|
|
197
|
+
})
|
|
198
|
+
@ManyToOne(
|
|
199
|
+
() => {
|
|
200
|
+
return User;
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
cascade: false,
|
|
204
|
+
eager: false,
|
|
205
|
+
nullable: true,
|
|
206
|
+
onDelete: "SET NULL",
|
|
207
|
+
orphanedRowAction: "nullify",
|
|
208
|
+
},
|
|
209
|
+
)
|
|
210
|
+
@JoinColumn({ name: "deletedByUserId" })
|
|
211
|
+
public deletedByUser?: User = undefined;
|
|
212
|
+
|
|
213
|
+
@ColumnAccessControl({
|
|
214
|
+
create: [],
|
|
215
|
+
read: [],
|
|
216
|
+
update: [],
|
|
217
|
+
})
|
|
218
|
+
@TableColumn({
|
|
219
|
+
type: TableColumnType.ObjectID,
|
|
220
|
+
title: "Deleted by User ID",
|
|
221
|
+
description:
|
|
222
|
+
"User ID who deleted this object (if this object was deleted by a User)",
|
|
223
|
+
example: "7c9d8e0f-a1b2-4c3d-9e5f-8a7b9c0d1e2f",
|
|
224
|
+
})
|
|
225
|
+
@Column({
|
|
226
|
+
type: ColumnType.ObjectID,
|
|
227
|
+
nullable: true,
|
|
228
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
229
|
+
})
|
|
230
|
+
public deletedByUserId?: ObjectID = undefined;
|
|
231
|
+
}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import OnCallDutyPolicySchedule from "./OnCallDutyPolicySchedule";
|
|
2
|
+
import Project from "./Project";
|
|
3
|
+
import User from "./User";
|
|
4
|
+
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
|
5
|
+
import Route from "../../Types/API/Route";
|
|
6
|
+
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
|
7
|
+
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
|
8
|
+
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
9
|
+
import ColumnType from "../../Types/Database/ColumnType";
|
|
10
|
+
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
|
11
|
+
import TableColumn from "../../Types/Database/TableColumn";
|
|
12
|
+
import TableColumnType from "../../Types/Database/TableColumnType";
|
|
13
|
+
import TableMetadata from "../../Types/Database/TableMetadata";
|
|
14
|
+
import TenantColumn from "../../Types/Database/TenantColumn";
|
|
15
|
+
import IconProp from "../../Types/Icon/IconProp";
|
|
16
|
+
import ObjectID from "../../Types/ObjectID";
|
|
17
|
+
import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* What a shift reminder log row records.
|
|
21
|
+
*
|
|
22
|
+
* reminder - the ordinary "your shift starts in N minutes" message.
|
|
23
|
+
* catch-up - a late reminder for a shift the user only just acquired
|
|
24
|
+
* (an override created inside one of their lead windows).
|
|
25
|
+
* reassigned - "your shift at 18:00 is now covered by B", sent when a
|
|
26
|
+
* shift the user was already reminded about moves away.
|
|
27
|
+
*/
|
|
28
|
+
export enum UserOnCallShiftReminderLogKind {
|
|
29
|
+
Reminder = "reminder",
|
|
30
|
+
CatchUp = "catch-up",
|
|
31
|
+
Reassigned = "reassigned",
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* The idempotency ledger of the shift-reminder worker.
|
|
36
|
+
*
|
|
37
|
+
* A reminder is CLAIMED by inserting a row (sentAt NULL), SENT, then STAMPED
|
|
38
|
+
* (sentAt set). The UNIQUE index over (userId, schedule, shiftStartsAt,
|
|
39
|
+
* minutesBeforeShift, kind) is the whole point: two worker replicas, a
|
|
40
|
+
* re-run after a crash, or a watermark that re-covers the same window all
|
|
41
|
+
* collapse into one send, because only one insert can win. shiftStartsAt is
|
|
42
|
+
* minute-truncated and seam-normalised by the worker so a start that moves
|
|
43
|
+
* by a second does not mint a new key.
|
|
44
|
+
*
|
|
45
|
+
* Postgres rather than Redis because compose Redis is non-persistent
|
|
46
|
+
* (`--save "" --appendonly no`), and a cache flush must never re-page anyone.
|
|
47
|
+
*
|
|
48
|
+
* ROOT ONLY. Every table access list is empty: nothing about this ledger is a
|
|
49
|
+
* user-facing resource, and a user who could delete their own claim rows
|
|
50
|
+
* could re-trigger reminders. The CRUD route exists only so the model is
|
|
51
|
+
* addressable like every other tenant model; every operation on it is denied.
|
|
52
|
+
*/
|
|
53
|
+
@TenantColumn("projectId")
|
|
54
|
+
@TableAccessControl({
|
|
55
|
+
create: [],
|
|
56
|
+
read: [],
|
|
57
|
+
delete: [],
|
|
58
|
+
update: [],
|
|
59
|
+
})
|
|
60
|
+
@CrudApiEndpoint(new Route("/user-on-call-shift-reminder-log"))
|
|
61
|
+
@Entity({
|
|
62
|
+
name: "UserOnCallShiftReminderLog",
|
|
63
|
+
})
|
|
64
|
+
@TableMetadata({
|
|
65
|
+
tableName: "UserOnCallShiftReminderLog",
|
|
66
|
+
singularName: "On-Call Shift Reminder Log",
|
|
67
|
+
pluralName: "On-Call Shift Reminder Logs",
|
|
68
|
+
icon: IconProp.Bell,
|
|
69
|
+
tableDescription:
|
|
70
|
+
"Ledger of shift reminders claimed and sent, so each reminder is sent exactly once.",
|
|
71
|
+
})
|
|
72
|
+
@Index(
|
|
73
|
+
[
|
|
74
|
+
"userId",
|
|
75
|
+
"onCallDutyPolicyScheduleId",
|
|
76
|
+
"shiftStartsAt",
|
|
77
|
+
"minutesBeforeShift",
|
|
78
|
+
"kind",
|
|
79
|
+
],
|
|
80
|
+
{ unique: true },
|
|
81
|
+
)
|
|
82
|
+
export default class UserOnCallShiftReminderLog extends BaseModel {
|
|
83
|
+
@ColumnAccessControl({
|
|
84
|
+
create: [],
|
|
85
|
+
read: [],
|
|
86
|
+
update: [],
|
|
87
|
+
})
|
|
88
|
+
@TableColumn({
|
|
89
|
+
manyToOneRelationColumn: "projectId",
|
|
90
|
+
type: TableColumnType.Entity,
|
|
91
|
+
modelType: Project,
|
|
92
|
+
title: "Project",
|
|
93
|
+
description: "Relation to Project Resource in which this object belongs",
|
|
94
|
+
})
|
|
95
|
+
@ManyToOne(
|
|
96
|
+
() => {
|
|
97
|
+
return Project;
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
eager: false,
|
|
101
|
+
nullable: true,
|
|
102
|
+
onDelete: "CASCADE",
|
|
103
|
+
orphanedRowAction: "nullify",
|
|
104
|
+
},
|
|
105
|
+
)
|
|
106
|
+
@JoinColumn({ name: "projectId" })
|
|
107
|
+
public project?: Project = undefined;
|
|
108
|
+
|
|
109
|
+
@ColumnAccessControl({
|
|
110
|
+
create: [],
|
|
111
|
+
read: [],
|
|
112
|
+
update: [],
|
|
113
|
+
})
|
|
114
|
+
@Index()
|
|
115
|
+
@TableColumn({
|
|
116
|
+
type: TableColumnType.ObjectID,
|
|
117
|
+
required: true,
|
|
118
|
+
canReadOnRelationQuery: true,
|
|
119
|
+
title: "Project ID",
|
|
120
|
+
description: "ID of your OneUptime Project in which this object belongs",
|
|
121
|
+
example: "5f8b9c0d-e1a2-4b3c-8d5e-6f7a8b9c0d1e",
|
|
122
|
+
})
|
|
123
|
+
@Column({
|
|
124
|
+
type: ColumnType.ObjectID,
|
|
125
|
+
nullable: false,
|
|
126
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
127
|
+
})
|
|
128
|
+
public projectId?: ObjectID = undefined;
|
|
129
|
+
|
|
130
|
+
@ColumnAccessControl({
|
|
131
|
+
create: [],
|
|
132
|
+
read: [],
|
|
133
|
+
update: [],
|
|
134
|
+
})
|
|
135
|
+
@TableColumn({
|
|
136
|
+
manyToOneRelationColumn: "userId",
|
|
137
|
+
type: TableColumnType.Entity,
|
|
138
|
+
modelType: User,
|
|
139
|
+
title: "User",
|
|
140
|
+
description: "Relation to the User this reminder was for",
|
|
141
|
+
})
|
|
142
|
+
@ManyToOne(
|
|
143
|
+
() => {
|
|
144
|
+
return User;
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
eager: false,
|
|
148
|
+
nullable: true,
|
|
149
|
+
onDelete: "CASCADE",
|
|
150
|
+
orphanedRowAction: "nullify",
|
|
151
|
+
},
|
|
152
|
+
)
|
|
153
|
+
@JoinColumn({ name: "userId" })
|
|
154
|
+
public user?: User = undefined;
|
|
155
|
+
|
|
156
|
+
@ColumnAccessControl({
|
|
157
|
+
create: [],
|
|
158
|
+
read: [],
|
|
159
|
+
update: [],
|
|
160
|
+
})
|
|
161
|
+
@Index()
|
|
162
|
+
@TableColumn({
|
|
163
|
+
type: TableColumnType.ObjectID,
|
|
164
|
+
required: true,
|
|
165
|
+
canReadOnRelationQuery: true,
|
|
166
|
+
title: "User ID",
|
|
167
|
+
description: "ID of the User this reminder was for",
|
|
168
|
+
example: "7c9d8e0f-a1b2-4c3d-9e5f-8a7b9c0d1e2f",
|
|
169
|
+
})
|
|
170
|
+
@Column({
|
|
171
|
+
type: ColumnType.ObjectID,
|
|
172
|
+
nullable: false,
|
|
173
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
174
|
+
})
|
|
175
|
+
public userId?: ObjectID = undefined;
|
|
176
|
+
|
|
177
|
+
@ColumnAccessControl({
|
|
178
|
+
create: [],
|
|
179
|
+
read: [],
|
|
180
|
+
update: [],
|
|
181
|
+
})
|
|
182
|
+
@TableColumn({
|
|
183
|
+
manyToOneRelationColumn: "onCallDutyPolicyScheduleId",
|
|
184
|
+
type: TableColumnType.Entity,
|
|
185
|
+
modelType: OnCallDutyPolicySchedule,
|
|
186
|
+
title: "On-Call Policy Schedule",
|
|
187
|
+
description: "Relation to the schedule the reminded shift is on.",
|
|
188
|
+
})
|
|
189
|
+
@ManyToOne(
|
|
190
|
+
() => {
|
|
191
|
+
return OnCallDutyPolicySchedule;
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
eager: false,
|
|
195
|
+
nullable: true,
|
|
196
|
+
onDelete: "CASCADE",
|
|
197
|
+
orphanedRowAction: "nullify",
|
|
198
|
+
},
|
|
199
|
+
)
|
|
200
|
+
@JoinColumn({ name: "onCallDutyPolicyScheduleId" })
|
|
201
|
+
public onCallDutyPolicySchedule?: OnCallDutyPolicySchedule = undefined;
|
|
202
|
+
|
|
203
|
+
@ColumnAccessControl({
|
|
204
|
+
create: [],
|
|
205
|
+
read: [],
|
|
206
|
+
update: [],
|
|
207
|
+
})
|
|
208
|
+
@Index()
|
|
209
|
+
@TableColumn({
|
|
210
|
+
type: TableColumnType.ObjectID,
|
|
211
|
+
required: true,
|
|
212
|
+
canReadOnRelationQuery: true,
|
|
213
|
+
title: "On-Call Policy Schedule ID",
|
|
214
|
+
description: "ID of the schedule the reminded shift is on.",
|
|
215
|
+
example: "5f8b9c0d-e1a2-4b3c-8d5e-6f7a8b9c0d1e",
|
|
216
|
+
})
|
|
217
|
+
@Column({
|
|
218
|
+
type: ColumnType.ObjectID,
|
|
219
|
+
nullable: false,
|
|
220
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
221
|
+
})
|
|
222
|
+
public onCallDutyPolicyScheduleId?: ObjectID = undefined;
|
|
223
|
+
|
|
224
|
+
/*
|
|
225
|
+
* The shift's start instant, minute-truncated and seam-normalised. Part of
|
|
226
|
+
* the idempotency key, so a shift whose computed start drifts by a second
|
|
227
|
+
* between two runs does not earn a second reminder.
|
|
228
|
+
*/
|
|
229
|
+
@ColumnAccessControl({
|
|
230
|
+
create: [],
|
|
231
|
+
read: [],
|
|
232
|
+
update: [],
|
|
233
|
+
})
|
|
234
|
+
@TableColumn({
|
|
235
|
+
required: true,
|
|
236
|
+
type: TableColumnType.Date,
|
|
237
|
+
title: "Shift Starts At",
|
|
238
|
+
description: "When the reminded shift starts (minute precision)",
|
|
239
|
+
example: "2024-01-15T18:00:00.000Z",
|
|
240
|
+
})
|
|
241
|
+
@Column({
|
|
242
|
+
type: ColumnType.Date,
|
|
243
|
+
nullable: false,
|
|
244
|
+
})
|
|
245
|
+
public shiftStartsAt?: Date = undefined;
|
|
246
|
+
|
|
247
|
+
/*
|
|
248
|
+
* The configured lead this reminder was sent for; 0 for change notices
|
|
249
|
+
* (catch-up / reassigned), which are not tied to a lead.
|
|
250
|
+
*/
|
|
251
|
+
@ColumnAccessControl({
|
|
252
|
+
create: [],
|
|
253
|
+
read: [],
|
|
254
|
+
update: [],
|
|
255
|
+
})
|
|
256
|
+
@TableColumn({
|
|
257
|
+
required: true,
|
|
258
|
+
isDefaultValueColumn: true,
|
|
259
|
+
defaultValue: 0,
|
|
260
|
+
type: TableColumnType.Number,
|
|
261
|
+
title: "Minutes Before Shift",
|
|
262
|
+
description:
|
|
263
|
+
"The lead time this reminder was sent for; 0 for change notices",
|
|
264
|
+
example: 60,
|
|
265
|
+
})
|
|
266
|
+
@Column({
|
|
267
|
+
type: ColumnType.Number,
|
|
268
|
+
nullable: false,
|
|
269
|
+
default: 0,
|
|
270
|
+
})
|
|
271
|
+
public minutesBeforeShift?: number = undefined;
|
|
272
|
+
|
|
273
|
+
@ColumnAccessControl({
|
|
274
|
+
create: [],
|
|
275
|
+
read: [],
|
|
276
|
+
update: [],
|
|
277
|
+
})
|
|
278
|
+
@TableColumn({
|
|
279
|
+
required: true,
|
|
280
|
+
type: TableColumnType.ShortText,
|
|
281
|
+
title: "Kind",
|
|
282
|
+
description: "reminder, catch-up or reassigned",
|
|
283
|
+
example: "reminder",
|
|
284
|
+
})
|
|
285
|
+
@Column({
|
|
286
|
+
type: ColumnType.ShortText,
|
|
287
|
+
length: ColumnLength.ShortText,
|
|
288
|
+
nullable: false,
|
|
289
|
+
})
|
|
290
|
+
public kind?: UserOnCallShiftReminderLogKind = undefined;
|
|
291
|
+
|
|
292
|
+
/*
|
|
293
|
+
* When the row was claimed. A claim older than ten minutes with sentAt still
|
|
294
|
+
* NULL is a send that died mid-flight and may be re-claimed.
|
|
295
|
+
*/
|
|
296
|
+
@ColumnAccessControl({
|
|
297
|
+
create: [],
|
|
298
|
+
read: [],
|
|
299
|
+
update: [],
|
|
300
|
+
})
|
|
301
|
+
@TableColumn({
|
|
302
|
+
required: true,
|
|
303
|
+
type: TableColumnType.Date,
|
|
304
|
+
title: "Claimed At",
|
|
305
|
+
description: "When a worker claimed this reminder for sending",
|
|
306
|
+
example: "2024-01-15T17:00:00.000Z",
|
|
307
|
+
})
|
|
308
|
+
@Index()
|
|
309
|
+
@Column({
|
|
310
|
+
type: ColumnType.Date,
|
|
311
|
+
nullable: false,
|
|
312
|
+
})
|
|
313
|
+
public claimedAt?: Date = undefined;
|
|
314
|
+
|
|
315
|
+
@ColumnAccessControl({
|
|
316
|
+
create: [],
|
|
317
|
+
read: [],
|
|
318
|
+
update: [],
|
|
319
|
+
})
|
|
320
|
+
@TableColumn({
|
|
321
|
+
type: TableColumnType.Date,
|
|
322
|
+
title: "Sent At",
|
|
323
|
+
description: "When the reminder was actually sent; NULL while claimed",
|
|
324
|
+
example: "2024-01-15T17:00:02.000Z",
|
|
325
|
+
})
|
|
326
|
+
@Column({
|
|
327
|
+
type: ColumnType.Date,
|
|
328
|
+
nullable: true,
|
|
329
|
+
})
|
|
330
|
+
public sentAt?: Date = undefined;
|
|
331
|
+
}
|
|
@@ -238,5 +238,79 @@ export default class DashboardDomainAPI extends BaseAPI<
|
|
|
238
238
|
}
|
|
239
239
|
},
|
|
240
240
|
);
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* Reissue SSL API. Backs the "Reissue SSL Certificate" button in the
|
|
244
|
+
* dashboard, for a customer who wants a fresh certificate now rather than
|
|
245
|
+
* whenever the renewal cron next gets to this domain.
|
|
246
|
+
*
|
|
247
|
+
* The throttle that keeps this from becoming a way to spend the shared
|
|
248
|
+
* Let's Encrypt allowance lives in the service, alongside the write that
|
|
249
|
+
* claims it - a check here would be a check the automated callers do not
|
|
250
|
+
* share, and one an extra caller could forget.
|
|
251
|
+
*/
|
|
252
|
+
this.router.get(
|
|
253
|
+
`${new this.entityType().getCrudApiPath()?.toString()}/reissue-ssl/:id`,
|
|
254
|
+
UserMiddleware.getUserMiddleware,
|
|
255
|
+
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
256
|
+
try {
|
|
257
|
+
if (!DashboardCNameRecord) {
|
|
258
|
+
return Response.sendErrorResponse(
|
|
259
|
+
req,
|
|
260
|
+
res,
|
|
261
|
+
new BadDataException(
|
|
262
|
+
`Custom Domains not enabled for this
|
|
263
|
+
OneUptime installation. Please contact
|
|
264
|
+
your server admin to enable this
|
|
265
|
+
feature.`,
|
|
266
|
+
),
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
271
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
272
|
+
|
|
273
|
+
const id: ObjectID = new ObjectID(req.params["id"] as string);
|
|
274
|
+
|
|
275
|
+
/*
|
|
276
|
+
* Scoped by the caller's own props, so a domain in someone else's
|
|
277
|
+
* project is indistinguishable from one that does not exist.
|
|
278
|
+
*/
|
|
279
|
+
const domainCount: PositiveNumber =
|
|
280
|
+
await DashboardDomainService.countBy({
|
|
281
|
+
query: {
|
|
282
|
+
_id: id.toString(),
|
|
283
|
+
},
|
|
284
|
+
props: databaseProps,
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
if (domainCount.toNumber() === 0) {
|
|
288
|
+
return Response.sendErrorResponse(
|
|
289
|
+
req,
|
|
290
|
+
res,
|
|
291
|
+
new BadDataException(
|
|
292
|
+
"The domain does not exist or user does not have access to it.",
|
|
293
|
+
),
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
logger.debug(
|
|
298
|
+
"Reissuing SSL",
|
|
299
|
+
getLogAttributesFromRequest(req as OneUptimeRequest),
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
await DashboardDomainService.reissueCert(id);
|
|
303
|
+
|
|
304
|
+
logger.debug(
|
|
305
|
+
"SSL reissued for domain id - " + id.toString(),
|
|
306
|
+
getLogAttributesFromRequest(req as OneUptimeRequest),
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
return Response.sendEmptySuccessResponse(req, res);
|
|
310
|
+
} catch (e) {
|
|
311
|
+
next(e);
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
);
|
|
241
315
|
}
|
|
242
316
|
}
|