@oneuptime/common 14.0.7 → 14.0.8

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.
Files changed (440) hide show
  1. package/Models/DatabaseModels/Incident.ts +267 -1
  2. package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
  3. package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
  4. package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
  5. package/Models/DatabaseModels/StatusPage.ts +55 -0
  6. package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
  7. package/Server/API/IncidentAPI.ts +162 -0
  8. package/Server/API/StatusPageAPI.ts +487 -171
  9. package/Server/API/StatusPageSubscriberAPI.ts +63 -15
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  18. package/Server/Infrastructure/Semaphore.ts +10 -0
  19. package/Server/Middleware/IdentityRateLimit.ts +108 -3
  20. package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
  21. package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
  22. package/Server/Services/DatabaseService.ts +93 -10
  23. package/Server/Services/IncidentCustomFieldService.ts +276 -1
  24. package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
  25. package/Server/Services/IncidentEpisodeService.ts +15 -0
  26. package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
  27. package/Server/Services/IncidentPublicNoteService.ts +30 -1
  28. package/Server/Services/IncidentService.ts +1535 -65
  29. package/Server/Services/IncidentStateTimelineService.ts +13 -0
  30. package/Server/Services/IncidentTemplateService.ts +109 -0
  31. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
  32. package/Server/Services/ScheduledMaintenanceService.ts +68 -18
  33. package/Server/Services/SmsService.ts +10 -0
  34. package/Server/Services/StatusPageService.ts +65 -8
  35. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
  36. package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
  37. package/Server/Services/StatusPageSubscriberService.ts +1161 -64
  38. package/Server/Types/Markdown.ts +153 -6
  39. package/Server/Types/Workflow/Components/Email.ts +61 -2
  40. package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
  41. package/Server/Utils/DataSource/EgressGuard.ts +66 -21
  42. package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
  43. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
  44. package/Server/Utils/SSRFProtection.ts +76 -16
  45. package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
  46. package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
  47. package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
  48. package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
  49. package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
  50. package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
  51. package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
  52. package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
  53. package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
  54. package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
  55. package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
  56. package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
  57. package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
  58. package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
  59. package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
  60. package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
  61. package/Server/Utils/StatusPageResource.ts +51 -20
  62. package/Server/Utils/VM/VMAPI.ts +1 -0
  63. package/Server/Utils/VM/VMRunner.ts +10 -0
  64. package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
  65. package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
  66. package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
  67. package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
  68. package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
  69. package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
  70. package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
  71. package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
  72. package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
  73. package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
  74. package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
  75. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +242 -5
  76. package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
  77. package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
  78. package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
  79. package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
  80. package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
  81. package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
  82. package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
  83. package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
  84. package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
  85. package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
  86. package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
  87. package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
  88. package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
  89. package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
  90. package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
  91. package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
  92. package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
  93. package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
  94. package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
  95. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
  96. package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
  97. package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
  98. package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
  99. package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
  100. package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
  101. package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
  102. package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
  103. package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
  104. package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
  105. package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
  106. package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
  107. package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
  108. package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
  109. package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
  110. package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
  111. package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
  112. package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
  113. package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
  114. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
  115. package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
  116. package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
  117. package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
  118. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
  119. package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
  120. package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
  121. package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
  122. package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
  123. package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
  124. package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
  125. package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
  126. package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
  127. package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
  128. package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
  129. package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
  130. package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
  131. package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
  132. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
  133. package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
  134. package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
  135. package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
  136. package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
  137. package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
  138. package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
  139. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
  140. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
  141. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
  142. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
  143. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
  144. package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
  145. package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
  146. package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
  147. package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
  148. package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
  149. package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
  150. package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
  151. package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
  152. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
  153. package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
  154. package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
  155. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
  156. package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
  157. package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
  158. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
  159. package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
  160. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
  161. package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
  162. package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
  163. package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
  164. package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
  165. package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
  166. package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
  167. package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
  168. package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
  169. package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
  170. package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
  171. package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
  172. package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
  173. package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
  174. package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
  175. package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
  176. package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
  177. package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
  178. package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
  179. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
  180. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
  181. package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
  182. package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
  183. package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
  184. package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
  185. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
  186. package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
  187. package/Tests/Types/SafeHtml.test.ts +102 -0
  188. package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
  189. package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
  190. package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
  191. package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
  192. package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
  193. package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
  194. package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
  195. package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
  196. package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
  197. package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
  198. package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
  199. package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
  200. package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
  201. package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
  202. package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
  203. package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
  204. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
  205. package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
  206. package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
  207. package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
  208. package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
  209. package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
  210. package/Types/CustomField/CustomFieldOrder.ts +55 -0
  211. package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
  212. package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
  213. package/Types/CustomField/CustomFieldType.ts +14 -0
  214. package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
  215. package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
  216. package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
  217. package/Types/SafeHtml.ts +93 -0
  218. package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
  219. package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
  220. package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
  221. package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
  222. package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
  223. package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
  224. package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
  225. package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
  226. package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
  227. package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
  228. package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
  229. package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
  230. package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
  231. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
  232. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
  233. package/UI/Components/Forms/ModelForm.tsx +70 -8
  234. package/UI/Components/Forms/Validation.ts +1 -1
  235. package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
  236. package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
  237. package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
  238. package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
  239. package/UI/Components/ModelTable/ModelTable.tsx +6 -7
  240. package/UI/Utils/SensitiveUrlToken.ts +10 -5
  241. package/Utils/API.ts +247 -2
  242. package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
  243. package/Utils/Markdown/MarkdownEscape.ts +65 -0
  244. package/Utils/ProbeNetworkFailureUtil.ts +673 -0
  245. package/build/dist/Models/DatabaseModels/Incident.js +267 -1
  246. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  247. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
  248. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  249. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
  250. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  251. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
  252. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  253. package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
  254. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  255. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
  256. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  257. package/build/dist/Server/API/IncidentAPI.js +100 -1
  258. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  259. package/build/dist/Server/API/StatusPageAPI.js +417 -176
  260. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  261. package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
  262. package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
  263. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
  264. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
  265. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
  266. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
  267. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
  268. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
  269. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
  270. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
  271. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
  272. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
  273. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
  274. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
  275. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
  276. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
  277. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  278. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  279. package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
  280. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  281. package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
  282. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  283. package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
  284. package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
  285. package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
  286. package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
  287. package/build/dist/Server/Services/DatabaseService.js +56 -7
  288. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  289. package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
  290. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  291. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
  292. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  293. package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
  294. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  295. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
  296. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
  297. package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
  298. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  299. package/build/dist/Server/Services/IncidentService.js +1052 -0
  300. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  301. package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
  302. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  303. package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
  304. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  305. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
  306. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  307. package/build/dist/Server/Services/ScheduledMaintenanceService.js +47 -17
  308. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  309. package/build/dist/Server/Services/SmsService.js +2 -22
  310. package/build/dist/Server/Services/SmsService.js.map +1 -1
  311. package/build/dist/Server/Services/StatusPageService.js +47 -9
  312. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  313. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
  314. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  315. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
  316. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
  317. package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
  318. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  319. package/build/dist/Server/Types/Markdown.js +110 -6
  320. package/build/dist/Server/Types/Markdown.js.map +1 -1
  321. package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
  322. package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
  323. package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
  324. package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
  325. package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
  326. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  327. package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
  328. package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
  329. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
  330. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  331. package/build/dist/Server/Utils/SSRFProtection.js +48 -6
  332. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  333. package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
  334. package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
  335. package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
  336. package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
  337. package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
  338. package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
  339. package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
  340. package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
  341. package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
  342. package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
  343. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
  344. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
  345. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
  346. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
  347. package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
  348. package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
  349. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
  350. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
  351. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
  352. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
  353. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
  354. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
  355. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
  356. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
  357. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
  358. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
  359. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
  360. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
  361. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
  362. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
  363. package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
  364. package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
  365. package/build/dist/Server/Utils/StatusPageResource.js +39 -7
  366. package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
  367. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  368. package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
  369. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  370. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
  371. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
  372. package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
  373. package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
  374. package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
  375. package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
  376. package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
  377. package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
  378. package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
  379. package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
  380. package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
  381. package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
  382. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
  383. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
  384. package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
  385. package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
  386. package/build/dist/Types/SafeHtml.js +84 -0
  387. package/build/dist/Types/SafeHtml.js.map +1 -0
  388. package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
  389. package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
  390. package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
  391. package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
  392. package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
  393. package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
  394. package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
  395. package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
  396. package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
  397. package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
  398. package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
  399. package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
  400. package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
  401. package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
  402. package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
  403. package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
  404. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
  405. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
  406. package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
  407. package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
  408. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
  409. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
  410. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
  411. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
  412. package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
  413. package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
  414. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
  415. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
  416. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
  417. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  418. package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
  419. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  420. package/build/dist/UI/Components/Forms/Validation.js +1 -1
  421. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  422. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  423. package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
  424. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
  425. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  426. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
  427. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  428. package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
  429. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  430. package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
  431. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
  432. package/build/dist/Utils/API.js +177 -1
  433. package/build/dist/Utils/API.js.map +1 -1
  434. package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
  435. package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
  436. package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
  437. package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
  438. package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
  439. package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
  440. package/package.json +1 -1
@@ -0,0 +1,631 @@
1
+ import SortOrder from "../../../Types/BaseDatabase/SortOrder";
2
+ import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
3
+ import BadDataException from "../../../Types/Exception/BadDataException";
4
+ import ObjectID from "../../../Types/ObjectID";
5
+ import IncidentScopeAddedPagesNotification from "../../../Types/StatusPage/IncidentScopeAddedPagesNotification";
6
+ import IncidentEpisodeMemberService from "../../Services/IncidentEpisodeMemberService";
7
+ import IncidentService from "../../Services/IncidentService";
8
+ import StatusPageResourceService from "../../Services/StatusPageResourceService";
9
+ import StatusPageSubscriberService from "../../Services/StatusPageSubscriberService";
10
+ import QueryHelper from "../../Types/Database/QueryHelper";
11
+ import logger from "../Logger";
12
+ import { StatusPageExclusionReason, } from "./StatusPageExclusion";
13
+ /*
14
+ * Which status pages an incident reaches - which pages show it, and whose
15
+ * subscribers hear about it. This is the only place that decides it; the
16
+ * subscriber jobs, the public status page and the reports all ask here, and
17
+ * a guard test (IncidentStatusPageScopeCallSites.test.ts) fails on code that
18
+ * works it out for itself from an incident's monitors.
19
+ *
20
+ * An incident reaches a status page through its monitors: a page reaches
21
+ * every incident on a monitor it lists (directly or through a monitor group).
22
+ * Two things narrow that:
23
+ *
24
+ * - Incident.statusPages. A scoped incident (isScopedToStatusPages) reaches
25
+ * only the pages it is limited to AMONG the pages its monitors reach. The
26
+ * two sets intersect: a scope never puts an incident on a page that does
27
+ * not list its monitors. A scope whose pages have all been deleted is a
28
+ * scope to nothing - the incident reaches no page at all, rather than every
29
+ * page its monitors reach.
30
+ * - StatusPage.onlyShowScopedIncidents. Such a page never reaches an unscoped
31
+ * incident, so an incident a monitor, Slack, Teams, the API or AI created
32
+ * on a monitor shared by many pages reaches none of them until someone
33
+ * scopes it.
34
+ *
35
+ * Both flags fail closed. isScopedToStatusPages is read here, never trusted
36
+ * from a caller. A status page whose onlyShowScopedIncidents was not loaded
37
+ * is treated as showing only scoped incidents, and an incident whose scope
38
+ * was not loaded is in no page's scope: a select that forgets a column then
39
+ * hides an incident, visibly, instead of broadcasting it to pages that opted
40
+ * out.
41
+ *
42
+ * Scope is applied in SQL for the status page queries (two queries split on
43
+ * isScopedToStatusPages), never as a post-filter: those queries are capped at
44
+ * LIMIT_PER_PROJECT, and a filter applied after the cap would silently drop
45
+ * incidents that are in scope.
46
+ *
47
+ * Nothing here selects statusPages, isScopedToStatusPages or
48
+ * statusPagesNotifiedOnCreation into the incidents it returns for display, so
49
+ * one audience's page names cannot reach another audience's public page.
50
+ */
51
+ export { StatusPageExclusionReason };
52
+ // The incident columns that say where an incident reaches. Never public.
53
+ export const INCIDENT_SCOPE_COLUMNS = [
54
+ "statusPages",
55
+ "isScopedToStatusPages",
56
+ "statusPagesNotifiedOnCreation",
57
+ ];
58
+ /*
59
+ * What isIncidentInScope reads of an incident, for a caller that reads
60
+ * incidents by id (an episode's members) and applies the scope in memory.
61
+ * Such a caller removes the columns again (removeScopeColumns) before
62
+ * anything it read is serialized.
63
+ */
64
+ export const INCIDENT_SCOPE_SELECT = {
65
+ isScopedToStatusPages: true,
66
+ statusPages: {
67
+ _id: true,
68
+ },
69
+ };
70
+ // What every subscriber job reads of the resources an incident affects.
71
+ export const SUBSCRIBER_NOTIFICATION_RESOURCE_SELECT = {
72
+ _id: true,
73
+ displayName: true,
74
+ statusPageId: true,
75
+ statusPageGroupId: true,
76
+ statusPageGroup: {
77
+ name: true,
78
+ },
79
+ };
80
+ export default class IncidentStatusPageScope {
81
+ /*
82
+ * The status pages these saved incidents reach, with the resources each
83
+ * page lists that they affect. Several incidents - an episode's members -
84
+ * reach the union of what each one reaches, each through its own scope.
85
+ *
86
+ * Each incident needs _id and its monitors. Its scope is read from the
87
+ * database here rather than taken from the objects passed in, so a caller
88
+ * that did not select it (or selected it a while ago) cannot widen the
89
+ * reach. An incident that is no longer found reaches nothing.
90
+ */
91
+ static async resolvePagesForIncidents(data) {
92
+ const incidentIds = [];
93
+ for (const incident of data.incidents) {
94
+ const incidentId = this.getIncidentId(incident);
95
+ if (!incidentId) {
96
+ throw new BadDataException("Cannot work out which status pages an incident reaches without its id.");
97
+ }
98
+ if (!incidentIds.includes(incidentId)) {
99
+ incidentIds.push(incidentId);
100
+ }
101
+ }
102
+ const scopes = await this.getIncidentScopes(incidentIds);
103
+ const reaches = [];
104
+ for (const incident of data.incidents) {
105
+ const incidentId = this.getIncidentId(incident);
106
+ reaches.push({
107
+ incidentId: incidentId,
108
+ monitorIds: this.getMonitorIds(incident.monitors),
109
+ /*
110
+ * Not found: deleted since, or not readable. Scoped to nothing, so it
111
+ * reaches no page.
112
+ */
113
+ scopedStatusPageIds: Object.prototype.hasOwnProperty.call(scopes, incidentId)
114
+ ? scopes[incidentId]
115
+ : [],
116
+ });
117
+ }
118
+ return this.resolvePagesForReaches({
119
+ reaches: reaches,
120
+ resourceSelect: data.resourceSelect,
121
+ });
122
+ }
123
+ /*
124
+ * The status pages an incident that is not saved yet would reach: the
125
+ * monitors and pages picked on a form. An empty page list is unscoped, the
126
+ * way IncidentService derives isScopedToStatusPages on create.
127
+ */
128
+ static async resolvePagesForDraftIncident(data) {
129
+ const statusPageIds = IncidentScopeAddedPagesNotification.normalizeStatusPageIds(data.statusPageIds || []);
130
+ return this.resolvePagesForReaches({
131
+ reaches: [
132
+ {
133
+ monitorIds: data.monitorIds,
134
+ scopedStatusPageIds: statusPageIds.length > 0 ? statusPageIds : null,
135
+ },
136
+ ],
137
+ resourceSelect: data.resourceSelect,
138
+ });
139
+ }
140
+ /*
141
+ * The incidents of an episode, each with its _id and monitors, ready for
142
+ * resolvePagesForIncidents. An episode reaches the union of the pages its
143
+ * member incidents reach.
144
+ */
145
+ static async getEpisodeMemberIncidents(incidentEpisodeId) {
146
+ const members = await IncidentEpisodeMemberService.findBy({
147
+ query: {
148
+ incidentEpisodeId: incidentEpisodeId,
149
+ },
150
+ select: {
151
+ incidentId: true,
152
+ incident: {
153
+ _id: true,
154
+ monitors: {
155
+ _id: true,
156
+ },
157
+ },
158
+ },
159
+ props: {
160
+ isRoot: true,
161
+ },
162
+ limit: LIMIT_PER_PROJECT,
163
+ skip: 0,
164
+ });
165
+ const incidents = [];
166
+ const seenIncidentIds = new Set();
167
+ for (const member of members) {
168
+ const incident = member.incident;
169
+ if (!incident) {
170
+ continue;
171
+ }
172
+ // The relation's own _id, or the member's foreign key when it is not.
173
+ if (!incident._id && member.incidentId) {
174
+ incident._id = member.incidentId.toString();
175
+ }
176
+ const incidentId = this.getIncidentId(incident);
177
+ if (!incidentId || seenIncidentIds.has(incidentId)) {
178
+ continue;
179
+ }
180
+ seenIncidentIds.add(incidentId);
181
+ incidents.push(incident);
182
+ }
183
+ return incidents;
184
+ }
185
+ /*
186
+ * The pages a set of reaches adds up to. Unscoped incidents are looked up
187
+ * together (their pages are filtered the same way); each scoped incident on
188
+ * its own, since its resources are filtered to its own pages.
189
+ */
190
+ static async resolvePagesForReaches(data) {
191
+ const resourceSelect = Object.assign(Object.assign({}, (data.resourceSelect || SUBSCRIBER_NOTIFICATION_RESOURCE_SELECT)), {
192
+ // Needed to group and to dedupe, whatever the caller asked for.
193
+ _id: true, statusPageId: true });
194
+ const isScoped = data.reaches.some((reach) => {
195
+ return reach.scopedStatusPageIds !== null;
196
+ });
197
+ const batches = [];
198
+ const unscopedMonitorIds = this.distinctMonitorIds(data.reaches
199
+ .filter((reach) => {
200
+ return reach.scopedStatusPageIds === null;
201
+ })
202
+ .flatMap((reach) => {
203
+ return reach.monitorIds;
204
+ }));
205
+ if (unscopedMonitorIds.length > 0) {
206
+ batches.push({
207
+ resources: await StatusPageResourceService.findByMonitors({
208
+ monitorIds: unscopedMonitorIds,
209
+ select: resourceSelect,
210
+ }),
211
+ scopedStatusPageIds: null,
212
+ });
213
+ }
214
+ for (const reach of data.reaches) {
215
+ if (reach.scopedStatusPageIds === null) {
216
+ continue;
217
+ }
218
+ const monitorIds = this.distinctMonitorIds(reach.monitorIds);
219
+ // Scoped to nothing, or on no monitor: it reaches no page to look up.
220
+ if (reach.scopedStatusPageIds.length === 0 || monitorIds.length === 0) {
221
+ continue;
222
+ }
223
+ batches.push({
224
+ resources: await StatusPageResourceService.findByMonitors({
225
+ monitorIds: monitorIds,
226
+ select: resourceSelect,
227
+ }),
228
+ scopedStatusPageIds: reach.scopedStatusPageIds,
229
+ });
230
+ }
231
+ const candidateStatusPageIds = [];
232
+ for (const batch of batches) {
233
+ for (const resource of batch.resources) {
234
+ const statusPageId = this.normalizeId(resource.statusPageId);
235
+ if (statusPageId && !candidateStatusPageIds.includes(statusPageId)) {
236
+ candidateStatusPageIds.push(statusPageId);
237
+ }
238
+ }
239
+ }
240
+ if (candidateStatusPageIds.length === 0) {
241
+ return {
242
+ statusPages: [],
243
+ statusPageToResources: {},
244
+ isScoped: isScoped,
245
+ excludedStatusPages: [],
246
+ };
247
+ }
248
+ const loadedStatusPages = await StatusPageSubscriberService.getStatusPagesToSendNotification(candidateStatusPageIds.map((id) => {
249
+ return new ObjectID(id);
250
+ }));
251
+ const statusPageById = new Map();
252
+ for (const statusPage of loadedStatusPages) {
253
+ const statusPageId = this.normalizeId(statusPage._id);
254
+ if (statusPageId) {
255
+ statusPageById.set(statusPageId, statusPage);
256
+ }
257
+ }
258
+ // Keyed by the lower-cased page id while collecting.
259
+ const reachedResources = new Map();
260
+ /*
261
+ * The pages a scoped incident's monitors are on that its scope left out:
262
+ * it is limited to other pages. A page only an unscoped incident's
263
+ * monitors reached, and which only shows scoped incidents, is left out for
264
+ * that instead.
265
+ */
266
+ const outsideScopedIncidentReach = new Set();
267
+ for (const batch of batches) {
268
+ for (const resource of batch.resources) {
269
+ const statusPageId = this.normalizeId(resource.statusPageId);
270
+ if (!statusPageId) {
271
+ continue;
272
+ }
273
+ const statusPage = statusPageById.get(statusPageId);
274
+ // Deleted since the resource was read: nothing to tell.
275
+ if (!statusPage) {
276
+ continue;
277
+ }
278
+ const isInScope = batch.scopedStatusPageIds === null
279
+ ? !this.showsOnlyScopedIncidents(statusPage)
280
+ : batch.scopedStatusPageIds.includes(statusPageId);
281
+ if (!isInScope) {
282
+ if (batch.scopedStatusPageIds !== null) {
283
+ outsideScopedIncidentReach.add(statusPageId);
284
+ }
285
+ continue;
286
+ }
287
+ const resources = reachedResources.get(statusPageId) || [];
288
+ const resourceId = this.normalizeId(resource._id);
289
+ const isDuplicate = resources.some((existing) => {
290
+ return (resourceId !== undefined &&
291
+ this.normalizeId(existing._id) === resourceId);
292
+ });
293
+ if (!isDuplicate) {
294
+ resources.push(resource);
295
+ }
296
+ reachedResources.set(statusPageId, resources);
297
+ }
298
+ }
299
+ const statusPages = [];
300
+ const excludedStatusPages = [];
301
+ const statusPageToResources = {};
302
+ for (const [statusPageId, statusPage] of statusPageById.entries()) {
303
+ const resources = reachedResources.get(statusPageId);
304
+ if (resources && resources.length > 0) {
305
+ statusPages.push(statusPage);
306
+ // Keyed as the subscriber jobs look pages up: by the page's own _id.
307
+ statusPageToResources[statusPage._id || statusPageId] = resources;
308
+ continue;
309
+ }
310
+ /*
311
+ * Why it was left out. A scoped incident that lists the page's monitors
312
+ * but not the page is limited to other pages, whatever the page's own
313
+ * setting; only a page reached by unscoped incidents alone was left
314
+ * out because it only shows incidents limited to it.
315
+ */
316
+ excludedStatusPages.push({
317
+ statusPage: statusPage,
318
+ reason: !outsideScopedIncidentReach.has(statusPageId) &&
319
+ this.showsOnlyScopedIncidents(statusPage)
320
+ ? StatusPageExclusionReason.OnlyShowsScopedIncidents
321
+ : StatusPageExclusionReason.OutsideIncidentScope,
322
+ });
323
+ }
324
+ statusPages.sort(this.compareStatusPagesByName);
325
+ excludedStatusPages.sort((a, b) => {
326
+ return this.compareStatusPagesByName(a.statusPage, b.statusPage);
327
+ });
328
+ logger.debug(`Incident status page scope: ${data.reaches.length} incident(s) reach ${statusPages.length} status page(s); ${excludedStatusPages.length} left out by scope.`);
329
+ return {
330
+ statusPages: statusPages,
331
+ statusPageToResources: statusPageToResources,
332
+ isScoped: isScoped,
333
+ excludedStatusPages: excludedStatusPages,
334
+ };
335
+ }
336
+ /*
337
+ * The incidents a status page shows that match `query`. The caller's query
338
+ * keeps its monitors filter (the pages' monitors); this runs it twice,
339
+ * split on isScopedToStatusPages:
340
+ *
341
+ * - unscoped incidents, unless the page only shows scoped incidents;
342
+ * - incidents scoped to this page (the join-table filter QueryUtil builds
343
+ * from an id list, as the scheduled maintenance queries use).
344
+ *
345
+ * The two halves are disjoint. They are merged, sorted by `sort` as the
346
+ * database would have, and cut to `skip` and `limit` - each half is read up
347
+ * to skip + limit rows, so the cut sees every row that can make the page.
348
+ * Sort keys must be top-level columns; any the caller did not select are
349
+ * read for the merge and removed again.
350
+ */
351
+ static async findIncidentsForStatusPage(data) {
352
+ const skip = Math.max(0, data.skip || 0);
353
+ const limit = Math.max(0, data.limit);
354
+ if (limit === 0) {
355
+ return [];
356
+ }
357
+ const sort = data.sort;
358
+ const sortKeys = Object.keys(sort || {});
359
+ const select = Object.assign({}, data.select);
360
+ const addedKeys = [];
361
+ for (const key of ["_id", ...sortKeys]) {
362
+ if (!select[key]) {
363
+ select[key] = true;
364
+ addedKeys.push(key);
365
+ }
366
+ }
367
+ const results = await Promise.all(this.getScopedQueries({
368
+ statusPage: data.statusPage,
369
+ query: data.query,
370
+ }).map((query) => {
371
+ return IncidentService.findBy({
372
+ query: query,
373
+ select: select,
374
+ sort: sort,
375
+ limit: skip + limit,
376
+ skip: 0,
377
+ props: data.props,
378
+ });
379
+ }));
380
+ const incidents = this.mergeIncidents({
381
+ results: results,
382
+ sort: sort,
383
+ }).slice(skip, skip + limit);
384
+ for (const incident of incidents) {
385
+ for (const key of addedKeys) {
386
+ // _id stays: it is what every caller keys on.
387
+ if (key !== "_id") {
388
+ delete incident[key];
389
+ }
390
+ }
391
+ }
392
+ return incidents;
393
+ }
394
+ // The one incident matching `query` that a status page shows, if any.
395
+ static async findOneIncidentForStatusPage(data) {
396
+ const incidents = await this.findIncidentsForStatusPage({
397
+ statusPage: data.statusPage,
398
+ query: data.query,
399
+ select: data.select,
400
+ sort: data.sort,
401
+ limit: 1,
402
+ skip: 0,
403
+ props: data.props,
404
+ });
405
+ return incidents[0] || null;
406
+ }
407
+ /*
408
+ * How many incidents matching `query` a status page shows: the unscoped
409
+ * ones (unless the page only shows scoped incidents) plus the ones scoped
410
+ * to it. The two counts are disjoint, so they add up. Only the project's
411
+ * incidents that are visible on status pages count.
412
+ */
413
+ static async countIncidentsForStatusPage(data) {
414
+ const counts = await Promise.all(this.getScopedQueries({
415
+ statusPage: data.statusPage,
416
+ query: Object.assign(Object.assign({}, data.query), { projectId: data.projectId, isVisibleOnStatusPage: true }),
417
+ }).map((query) => {
418
+ return IncidentService.countBy({
419
+ query: query,
420
+ props: data.props || {
421
+ isRoot: true,
422
+ },
423
+ });
424
+ }));
425
+ return counts.reduce((total, count) => {
426
+ return total + count.toNumber();
427
+ }, 0);
428
+ }
429
+ /*
430
+ * Whether a status page shows this incident, as far as scope goes (whether
431
+ * the page lists its monitors is the caller's query). For incidents already
432
+ * read, like an episode's members: the incident needs isScopedToStatusPages
433
+ * and statusPages loaded, and the page onlyShowScopedIncidents. Missing
434
+ * either fails closed.
435
+ */
436
+ static isIncidentInScope(incident, statusPage) {
437
+ if (incident.isScopedToStatusPages === true) {
438
+ const statusPageId = this.getStatusPageId(statusPage);
439
+ return Boolean(statusPageId &&
440
+ IncidentScopeAddedPagesNotification.normalizeStatusPageIds(incident.statusPages).includes(statusPageId));
441
+ }
442
+ if (incident.isScopedToStatusPages === false) {
443
+ return !this.showsOnlyScopedIncidents(statusPage);
444
+ }
445
+ // Not loaded: in no page's scope.
446
+ return false;
447
+ }
448
+ /*
449
+ * Removes the scope columns from an incident about to be serialized for a
450
+ * public status page - the model or its JSON - in case a select brought
451
+ * them in.
452
+ */
453
+ static removeScopeColumns(incident) {
454
+ for (const column of INCIDENT_SCOPE_COLUMNS) {
455
+ delete incident[column];
456
+ }
457
+ return incident;
458
+ }
459
+ /*
460
+ * Visiting order for a send: by name, then id. Email and SMS go once per
461
+ * address across the pages of a scoped incident, so the page visited first
462
+ * is the one whose template, branding and unsubscribe link a person on
463
+ * several of them gets - and name order makes that predictable.
464
+ */
465
+ static compareStatusPagesByName(a, b) {
466
+ const nameA = (a.name || a.pageTitle || "").trim();
467
+ const nameB = (b.name || b.pageTitle || "").trim();
468
+ const byName = nameA.localeCompare(nameB, "en", {
469
+ sensitivity: "base",
470
+ numeric: true,
471
+ });
472
+ if (byName !== 0) {
473
+ return byName;
474
+ }
475
+ return (a._id || "").localeCompare(b._id || "");
476
+ }
477
+ // The two halves of a display query for one status page.
478
+ static getScopedQueries(data) {
479
+ const statusPageId = this.getStatusPageId(data.statusPage);
480
+ if (!statusPageId) {
481
+ throw new BadDataException("Cannot find the incidents a status page shows without its id.");
482
+ }
483
+ const queries = [];
484
+ if (!this.showsOnlyScopedIncidents(data.statusPage)) {
485
+ queries.push(Object.assign(Object.assign({}, data.query), { isScopedToStatusPages: false }));
486
+ }
487
+ queries.push(Object.assign(Object.assign({}, data.query), { isScopedToStatusPages: true,
488
+ // An id list on an entity-array column becomes a join-table filter.
489
+ statusPages: [statusPageId] }));
490
+ return queries;
491
+ }
492
+ /*
493
+ * One list out of the two halves: each incident once, sorted by `sort`
494
+ * the way Postgres sorts - NULLs last ascending and first descending. With
495
+ * no sort, unscoped incidents come first, as each half came back.
496
+ */
497
+ static mergeIncidents(data) {
498
+ const merged = [];
499
+ const seen = new Set();
500
+ for (const incident of data.results.flat()) {
501
+ const incidentId = this.getIncidentId(incident);
502
+ if (incidentId) {
503
+ if (seen.has(incidentId)) {
504
+ continue;
505
+ }
506
+ seen.add(incidentId);
507
+ }
508
+ merged.push(incident);
509
+ }
510
+ const sortEntries = Object.entries(data.sort || {});
511
+ if (sortEntries.length === 0) {
512
+ return merged;
513
+ }
514
+ return merged.sort((a, b) => {
515
+ for (const [key, order] of sortEntries) {
516
+ const compared = this.compareSortValues(a[key], b[key]);
517
+ if (compared !== 0) {
518
+ return order === SortOrder.Descending ? -compared : compared;
519
+ }
520
+ }
521
+ return 0;
522
+ });
523
+ }
524
+ // Ascending order of two column values; a missing value sorts last.
525
+ static compareSortValues(a, b) {
526
+ const aMissing = a === undefined || a === null;
527
+ const bMissing = b === undefined || b === null;
528
+ if (aMissing || bMissing) {
529
+ return aMissing === bMissing ? 0 : aMissing ? 1 : -1;
530
+ }
531
+ const aValue = a instanceof Date ? a.getTime() : a;
532
+ const bValue = b instanceof Date ? b.getTime() : b;
533
+ if (typeof aValue === "number" && typeof bValue === "number") {
534
+ return aValue - bValue;
535
+ }
536
+ if (typeof aValue === "boolean" && typeof bValue === "boolean") {
537
+ return Number(aValue) - Number(bValue);
538
+ }
539
+ return String(aValue).localeCompare(String(bValue));
540
+ }
541
+ /*
542
+ * Each incident's scope as stored: the lower-cased ids of the pages it is
543
+ * limited to, or null when unscoped. Incidents not found are left out.
544
+ */
545
+ static async getIncidentScopes(incidentIds) {
546
+ const scopes = {};
547
+ if (incidentIds.length === 0) {
548
+ return scopes;
549
+ }
550
+ const incidents = await IncidentService.findBy({
551
+ query: {
552
+ _id: QueryHelper.any(incidentIds),
553
+ },
554
+ select: {
555
+ _id: true,
556
+ isScopedToStatusPages: true,
557
+ statusPages: {
558
+ _id: true,
559
+ },
560
+ },
561
+ limit: LIMIT_MAX,
562
+ skip: 0,
563
+ props: {
564
+ isRoot: true,
565
+ },
566
+ });
567
+ for (const incident of incidents) {
568
+ const incidentId = this.getIncidentId(incident);
569
+ if (!incidentId) {
570
+ continue;
571
+ }
572
+ /*
573
+ * The flag decides, not the list: a scoped incident whose pages were
574
+ * all deleted has an empty list and still reaches nothing.
575
+ */
576
+ scopes[incidentId] =
577
+ incident.isScopedToStatusPages === false
578
+ ? null
579
+ : IncidentScopeAddedPagesNotification.normalizeStatusPageIds(incident.statusPages);
580
+ }
581
+ return scopes;
582
+ }
583
+ /*
584
+ * Whether a page only shows scoped incidents. Not loaded counts as yes (see
585
+ * the top of this file): the column is NOT NULL, so a read that has it is
586
+ * always true or false.
587
+ */
588
+ static showsOnlyScopedIncidents(statusPage) {
589
+ return statusPage.onlyShowScopedIncidents !== false;
590
+ }
591
+ static getStatusPageId(statusPage) {
592
+ return this.normalizeId(statusPage._id || statusPage.id);
593
+ }
594
+ static getIncidentId(incident) {
595
+ return this.normalizeId(incident._id || incident.id);
596
+ }
597
+ static getMonitorIds(monitors) {
598
+ return this.distinctMonitorIds((monitors || [])
599
+ .map((monitor) => {
600
+ return this.normalizeId((monitor === null || monitor === void 0 ? void 0 : monitor._id) || (monitor === null || monitor === void 0 ? void 0 : monitor.id));
601
+ })
602
+ .filter((id) => {
603
+ return Boolean(id);
604
+ })
605
+ .map((id) => {
606
+ return new ObjectID(id);
607
+ }));
608
+ }
609
+ static distinctMonitorIds(monitorIds) {
610
+ const seen = new Set();
611
+ const distinct = [];
612
+ for (const monitorId of monitorIds) {
613
+ const id = this.normalizeId(monitorId);
614
+ if (!id || seen.has(id)) {
615
+ continue;
616
+ }
617
+ seen.add(id);
618
+ distinct.push(new ObjectID(id));
619
+ }
620
+ return distinct;
621
+ }
622
+ // An id in any shape it arrives in, lower-cased as the database returns it.
623
+ static normalizeId(value) {
624
+ if (value === undefined || value === null) {
625
+ return undefined;
626
+ }
627
+ const id = value.toString().trim().toLowerCase();
628
+ return id || undefined;
629
+ }
630
+ }
631
+ //# sourceMappingURL=IncidentStatusPageScope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncidentStatusPageScope.js","sourceRoot":"","sources":["../../../../../Server/Utils/StatusPage/IncidentStatusPageScope.ts"],"names":[],"mappings":"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"}