@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.
Files changed (367) hide show
  1. package/Models/DatabaseModels/DashboardDomain.ts +43 -0
  2. package/Models/DatabaseModels/Index.ts +11 -0
  3. package/Models/DatabaseModels/MonitorTemplate.ts +15 -3
  4. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
  5. package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
  6. package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
  7. package/Models/DatabaseModels/StatusPageDomain.ts +43 -0
  8. package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
  9. package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
  10. package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
  11. package/Server/API/DashboardDomainAPI.ts +74 -0
  12. package/Server/API/MicrosoftTeamsAPI.ts +81 -180
  13. package/Server/API/OnCallCalendarAPI.ts +2194 -0
  14. package/Server/API/StatusPageDomainAPI.ts +74 -0
  15. package/Server/EnvironmentConfig.ts +138 -0
  16. package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.ts +43 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.ts +40 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  21. package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
  22. package/Server/Middleware/ProjectAuthorization.ts +6 -1
  23. package/Server/Services/DashboardDomainService.ts +131 -0
  24. package/Server/Services/Index.ts +12 -0
  25. package/Server/Services/LogPipelineProcessorService.ts +88 -0
  26. package/Server/Services/MonitorTemplateService.ts +70 -11
  27. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
  28. package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
  29. package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
  30. package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
  31. package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
  32. package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
  33. package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
  34. package/Server/Services/StatusPageDomainService.ts +163 -3
  35. package/Server/Services/StatusPagePrivateUserSessionService.ts +197 -56
  36. package/Server/Services/TeamMemberService.ts +489 -1
  37. package/Server/Services/TeamService.ts +50 -0
  38. package/Server/Services/UserNotificationSettingService.ts +44 -1
  39. package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
  40. package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
  41. package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
  42. package/Server/Types/Domain.ts +17 -0
  43. package/Server/Utils/APIKey/AccessPermission.ts +24 -0
  44. package/Server/Utils/Greenlock/Greenlock.ts +156 -58
  45. package/Server/Utils/LogPipelineProcessorValidation.ts +112 -0
  46. package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
  47. package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
  48. package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
  49. package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
  50. package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
  51. package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
  52. package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
  53. package/Server/Utils/Response.ts +134 -0
  54. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +1094 -45
  55. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +153 -17
  56. package/Server/Utils/StartServer.ts +10 -0
  57. package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
  58. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +23 -11
  59. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.ts +0 -170
  60. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.ts +158 -0
  61. package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +23 -11
  62. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +35 -13
  63. package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +505 -0
  64. package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
  65. package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
  66. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
  67. package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
  68. package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
  69. package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
  70. package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
  71. package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
  72. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +106 -0
  73. package/Tests/App/StatusPage/StatusPageLoginCodeUtil.test.ts +84 -0
  74. package/Tests/App/StatusPage/StatusPageRedirectSafety.test.ts +119 -0
  75. package/Tests/Models/MonitorTemplateMonitorNameColumn.test.ts +258 -0
  76. package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
  77. package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
  78. package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
  79. package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
  80. package/Tests/Server/API/CustomDomainReissueSslAPI.test.ts +469 -0
  81. package/Tests/Server/API/Helpers.ts +8 -0
  82. package/Tests/Server/API/MicrosoftTeamsBotMessagesEndpoint.test.ts +729 -0
  83. package/Tests/Server/API/MicrosoftTeamsBotTestEndpoint.test.ts +26 -0
  84. package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +402 -0
  85. package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
  86. package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
  87. package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
  88. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +369 -0
  89. package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
  90. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -0
  91. package/Tests/Server/Services/AddCertificateReissueRequestedAtToDomainsMigration.test.ts +287 -0
  92. package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +477 -0
  93. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
  94. package/Tests/Server/Services/LogPipelineProcessorSaveValidation.test.ts +249 -0
  95. package/Tests/Server/Services/MonitorTemplateServiceBulkSync.test.ts +549 -0
  96. package/Tests/Server/Services/MonitorTemplateServiceNetworkDeviceSync.test.ts +16 -3
  97. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +57 -0
  98. package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
  99. package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
  100. package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
  101. package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +151 -15
  102. package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +587 -0
  103. package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
  104. package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
  105. package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
  106. package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
  107. package/Tests/Server/Types/Database/Permissions/ApiKeyFileAccess.test.ts +286 -0
  108. package/Tests/Server/Types/Database/Permissions/MonitorTemplateColumnAccess.test.ts +328 -0
  109. package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
  110. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAndIsNull.test.ts +83 -0
  111. package/Tests/Server/Utils/AI/SRE/ConfidenceSignal.test.ts +377 -0
  112. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +16 -1
  113. package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +250 -0
  114. package/Tests/Server/Utils/LogPipelineProcessorValidation.test.ts +198 -0
  115. package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
  116. package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
  117. package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
  118. package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
  119. package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
  120. package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
  121. package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
  122. package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
  123. package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
  124. package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
  125. package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +48 -9
  126. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsAuth.test.ts +726 -0
  127. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +74 -11
  128. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +1107 -0
  129. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +20 -3
  130. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +51 -11
  131. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +1246 -0
  132. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +961 -0
  133. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +653 -0
  134. package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
  135. package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
  136. package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +880 -0
  137. package/Tests/Types/API/HTTPResponse.test.ts +175 -0
  138. package/Tests/Types/API/Route.test.ts +36 -4
  139. package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
  140. package/Tests/Types/Database/DatabaseProperty.test.ts +171 -0
  141. package/Tests/Types/DateLocalShortDateTimeString.test.ts +518 -0
  142. package/Tests/Types/DateLocalTimeString.test.ts +259 -0
  143. package/Tests/Types/DateUserPrefers12HourFormat.test.ts +316 -0
  144. package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
  145. package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
  146. package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
  147. package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
  148. package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
  149. package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
  150. package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
  151. package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
  152. package/Tests/UI/Components/LogsHistogram.test.tsx +41 -2
  153. package/Tests/UI/Components/LogsViewerEmptyStateTimeRange.test.tsx +212 -0
  154. package/Tests/UI/Components/TelemetryChartClockFormat.test.tsx +359 -0
  155. package/Tests/UI/Components/TimeRangePickerClockFormat.test.tsx +422 -0
  156. package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +146 -8
  157. package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +520 -0
  158. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
  159. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  160. package/Tests/UI/Utils/Navigation.test.ts +82 -0
  161. package/Tests/Utils/Array.test.ts +100 -0
  162. package/Tests/Utils/CertificateReissue.test.ts +225 -0
  163. package/Tests/Utils/Grok/Grok.test.ts +492 -0
  164. package/Tests/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.test.ts +181 -13
  165. package/Types/API/Route.ts +20 -5
  166. package/Types/Calendar/ICalendar.ts +442 -0
  167. package/Types/Date.ts +143 -13
  168. package/Types/Email/EmailTemplateType.ts +2 -0
  169. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  170. package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
  171. package/Types/OnCallDutyPolicy/Layer.ts +190 -35
  172. package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
  173. package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
  174. package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
  175. package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
  176. package/Types/Rum/SessionReplay.ts +62 -1
  177. package/UI/Components/Date/TimeRangePickerDropdown.tsx +9 -5
  178. package/UI/Components/LogsViewer/LogsViewer.tsx +12 -7
  179. package/UI/Components/LogsViewer/components/HistogramTooltip.tsx +18 -17
  180. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +21 -28
  181. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +2 -4
  182. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +2 -4
  183. package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +17 -16
  184. package/UI/Utils/Navigation.ts +42 -0
  185. package/Utils/Array.ts +37 -0
  186. package/Utils/CertificateReissue.ts +128 -0
  187. package/Utils/Grok/Grok.ts +461 -0
  188. package/Utils/Grok/GrokPatterns.ts +118 -0
  189. package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +58 -6
  190. package/build/dist/Models/DatabaseModels/DashboardDomain.js +44 -0
  191. package/build/dist/Models/DatabaseModels/DashboardDomain.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/Index.js +11 -0
  193. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +17 -4
  195. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  196. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
  197. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
  199. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
  200. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
  201. package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
  202. package/build/dist/Models/DatabaseModels/StatusPageDomain.js +44 -0
  203. package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
  205. package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
  206. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
  207. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
  208. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
  209. package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
  210. package/build/dist/Server/API/DashboardDomainAPI.js +43 -1
  211. package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
  212. package/build/dist/Server/API/MicrosoftTeamsAPI.js +74 -118
  213. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  214. package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
  215. package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
  216. package/build/dist/Server/API/StatusPageDomainAPI.js +43 -1
  217. package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
  218. package/build/dist/Server/EnvironmentConfig.js +102 -0
  219. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  220. package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
  221. package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.js +34 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790200000000-AllowNullMonitorNameOnMonitorTemplate.js.map +1 -0
  224. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.js +28 -0
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790300000000-AddCertificateReissueRequestedAtToDomains.js.map +1 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  230. package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
  231. package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
  232. package/build/dist/Server/Middleware/ProjectAuthorization.js +6 -1
  233. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  234. package/build/dist/Server/Services/DashboardDomainService.js +104 -0
  235. package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
  236. package/build/dist/Server/Services/Index.js +12 -0
  237. package/build/dist/Server/Services/Index.js.map +1 -1
  238. package/build/dist/Server/Services/LogPipelineProcessorService.js +65 -0
  239. package/build/dist/Server/Services/LogPipelineProcessorService.js.map +1 -1
  240. package/build/dist/Server/Services/MonitorTemplateService.js +57 -11
  241. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  242. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
  243. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  244. package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
  245. package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
  246. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
  247. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
  248. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
  249. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
  250. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
  251. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  252. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
  253. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
  254. package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
  255. package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
  256. package/build/dist/Server/Services/StatusPageDomainService.js +132 -3
  257. package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
  258. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +112 -32
  259. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
  260. package/build/dist/Server/Services/TeamMemberService.js +396 -1
  261. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  262. package/build/dist/Server/Services/TeamService.js +43 -0
  263. package/build/dist/Server/Services/TeamService.js.map +1 -1
  264. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
  265. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  266. package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
  267. package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
  268. package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
  269. package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
  270. package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
  271. package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
  272. package/build/dist/Server/Types/Domain.js +16 -0
  273. package/build/dist/Server/Types/Domain.js.map +1 -1
  274. package/build/dist/Server/Utils/APIKey/AccessPermission.js +24 -0
  275. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  276. package/build/dist/Server/Utils/Greenlock/Greenlock.js +110 -35
  277. package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
  278. package/build/dist/Server/Utils/LogPipelineProcessorValidation.js +77 -0
  279. package/build/dist/Server/Utils/LogPipelineProcessorValidation.js.map +1 -0
  280. package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
  281. package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
  282. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
  283. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
  284. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
  285. package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
  286. package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
  287. package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
  288. package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
  289. package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
  290. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
  291. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
  292. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
  293. package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
  294. package/build/dist/Server/Utils/Response.js +97 -0
  295. package/build/dist/Server/Utils/Response.js.map +1 -1
  296. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +777 -36
  297. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
  298. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +108 -17
  299. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  300. package/build/dist/Server/Utils/StartServer.js +9 -1
  301. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  302. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
  303. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  304. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +17 -6
  305. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
  306. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js +0 -159
  307. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Auth.js.map +1 -1
  308. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.js +128 -0
  309. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Authorization.js.map +1 -0
  310. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +17 -6
  311. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
  312. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -13
  313. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  314. package/build/dist/Types/API/Route.js +16 -5
  315. package/build/dist/Types/API/Route.js.map +1 -1
  316. package/build/dist/Types/Calendar/ICalendar.js +290 -0
  317. package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
  318. package/build/dist/Types/Date.js +115 -13
  319. package/build/dist/Types/Date.js.map +1 -1
  320. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  321. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  322. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  323. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  324. package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
  325. package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
  326. package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
  327. package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
  328. package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
  329. package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
  330. package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
  331. package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
  332. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
  333. package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
  334. package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
  335. package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
  336. package/build/dist/Types/Rum/SessionReplay.js +38 -0
  337. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  338. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +9 -5
  339. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -1
  340. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +12 -7
  341. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  342. package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js +15 -14
  343. package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js.map +1 -1
  344. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +17 -22
  345. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  346. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +2 -4
  347. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  348. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +2 -4
  349. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  350. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +15 -14
  351. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -1
  352. package/build/dist/UI/Utils/Navigation.js +30 -0
  353. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  354. package/build/dist/Utils/Array.js +25 -0
  355. package/build/dist/Utils/Array.js.map +1 -1
  356. package/build/dist/Utils/CertificateReissue.js +97 -0
  357. package/build/dist/Utils/CertificateReissue.js.map +1 -0
  358. package/build/dist/Utils/Grok/Grok.js +324 -0
  359. package/build/dist/Utils/Grok/Grok.js.map +1 -0
  360. package/build/dist/Utils/Grok/GrokPatterns.js +112 -0
  361. package/build/dist/Utils/Grok/GrokPatterns.js.map +1 -0
  362. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +63 -3
  363. package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
  364. package/package.json +1 -1
  365. package/UI/Utils/JsonWebToken.ts +0 -14
  366. package/build/dist/UI/Utils/JsonWebToken.js +0 -10
  367. package/build/dist/UI/Utils/JsonWebToken.js.map +0 -1
@@ -238,6 +238,18 @@ describe("GET /microsoft-bot/test", () => {
238
238
  "the installed Teams app package belonging to this deployment",
239
239
  ["installed", "this deployment"],
240
240
  ],
241
+ /*
242
+ * Reachability is listed apart from the endpoint being *configured*
243
+ * because the two fail separately and are indistinguishable from in
244
+ * here. A correctly configured endpoint on a deployment Azure cannot
245
+ * dial produces working outbound alerts and a completely dead bot —
246
+ * which reads as a half-broken integration rather than a network
247
+ * problem, and is how this endpoint's blessing gets misread.
248
+ */
249
+ [
250
+ "Azure Bot Service being able to reach this deployment",
251
+ ["reach this deployment", "public internet"],
252
+ ],
241
253
  ])(
242
254
  "notVerified explicitly disclaims %s",
243
255
  async (_label: string, requiredFragments: Array<string>) => {
@@ -257,6 +269,20 @@ describe("GET /microsoft-bot/test", () => {
257
269
  },
258
270
  );
259
271
 
272
+ test("notVerified warns that a working alert does not test reachability", async () => {
273
+ /*
274
+ * The trap this endpoint exists to avoid: an admin whose alerts arrive
275
+ * in Teams reads that as proof the bot is wired up, when outbound
276
+ * notifications go out over a connection OneUptime opens itself and
277
+ * never touch the inbound path the bot depends on.
278
+ */
279
+ const response: InvokedResponse = await callBotTest();
280
+ const joined: string = joinStrings(response.body["notVerified"]);
281
+
282
+ expect(joined).toContain("outbound notifications work without it");
283
+ expect(joined).toContain("working alert does not test this");
284
+ });
285
+
260
286
  test("nextStep names the client id and tells the admin to compare it against the installed app's bot id", async () => {
261
287
  const response: InvokedResponse = await callBotTest();
262
288
  const nextStep: string = response.body["nextStep"] as string;
@@ -0,0 +1,402 @@
1
+ import { afterEach, describe, expect, jest, test } from "@jest/globals";
2
+ import type { TurnContext } from "botbuilder";
3
+ import type { SpyInstance } from "jest-mock";
4
+ import MicrosoftTeamsAPI from "../../../Server/API/MicrosoftTeamsAPI";
5
+ import WorkspaceProjectAuthToken from "../../../Models/DatabaseModels/WorkspaceProjectAuthToken";
6
+ import AccessTokenService from "../../../Server/Services/AccessTokenService";
7
+ import AlertService from "../../../Server/Services/AlertService";
8
+ import IncidentService from "../../../Server/Services/IncidentService";
9
+ import TeamMemberService from "../../../Server/Services/TeamMemberService";
10
+ import WorkspaceProjectAuthTokenService from "../../../Server/Services/WorkspaceProjectAuthTokenService";
11
+ import WorkspaceUserAuthTokenService from "../../../Server/Services/WorkspaceUserAuthTokenService";
12
+ import {
13
+ ExpressRequest,
14
+ ExpressResponse,
15
+ ExpressRouter,
16
+ } from "../../../Server/Utils/Express";
17
+ import {
18
+ MicrosoftTeamsAlertActionType,
19
+ MicrosoftTeamsIncidentActionType,
20
+ MicrosoftTeamsMonitorActionType,
21
+ } from "../../../Server/Utils/Workspace/MicrosoftTeams/Actions/ActionTypes";
22
+ import MicrosoftTeamsAuthAction from "../../../Server/Utils/Workspace/MicrosoftTeams/Actions/Auth";
23
+ import MicrosoftTeamsIncidentActions from "../../../Server/Utils/Workspace/MicrosoftTeams/Actions/Incident";
24
+ import MicrosoftTeamsMonitorActions from "../../../Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor";
25
+ import MicrosoftTeamsUtil from "../../../Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams";
26
+ import DatabaseCommonInteractionProps from "../../../Types/BaseDatabase/DatabaseCommonInteractionProps";
27
+ import { JSONObject } from "../../../Types/JSON";
28
+ import ObjectID from "../../../Types/ObjectID";
29
+
30
+ jest.setTimeout(30_000);
31
+
32
+ type ExpressRouterLayer = {
33
+ route?: {
34
+ path: string;
35
+ methods: Record<string, boolean>;
36
+ stack: Array<{
37
+ handle: ExpressRouteHandler;
38
+ }>;
39
+ };
40
+ };
41
+
42
+ type ExpressRouteHandler = (
43
+ request: ExpressRequest,
44
+ response: ExpressResponse,
45
+ ) => Promise<void> | void;
46
+
47
+ const LEGACY_WEBHOOK_PATH: string = "/microsoft-teams/webhook";
48
+ const BOT_FRAMEWORK_PATH: string = "/microsoft-bot/messages";
49
+
50
+ const getRouterLayers: () => Array<ExpressRouterLayer> =
51
+ (): Array<ExpressRouterLayer> => {
52
+ const router: ExpressRouter = new MicrosoftTeamsAPI().getRouter();
53
+ return (
54
+ router as unknown as {
55
+ stack: Array<ExpressRouterLayer>;
56
+ }
57
+ ).stack;
58
+ };
59
+
60
+ const dispatchThroughRouter: (
61
+ path: string,
62
+ body: JSONObject,
63
+ ) => Promise<void> = (path: string, body: JSONObject): Promise<void> => {
64
+ return new Promise<void>(
65
+ (resolve: () => void, reject: (error: Error) => void): void => {
66
+ const router: ExpressRouter = new MicrosoftTeamsAPI().getRouter();
67
+ const request: ExpressRequest = {
68
+ method: "POST",
69
+ url: path,
70
+ originalUrl: path,
71
+ baseUrl: "",
72
+ headers: {},
73
+ body: body,
74
+ } as unknown as ExpressRequest;
75
+ const response: ExpressResponse = {} as ExpressResponse;
76
+
77
+ router(request, response, (error?: unknown): void => {
78
+ if (error) {
79
+ reject(error as Error);
80
+ return;
81
+ }
82
+
83
+ resolve();
84
+ });
85
+ },
86
+ );
87
+ };
88
+
89
+ const getPostRouteHandler: (path: string) => ExpressRouteHandler = (
90
+ path: string,
91
+ ): ExpressRouteHandler => {
92
+ const layer: ExpressRouterLayer | undefined = getRouterLayers().find(
93
+ (routerLayer: ExpressRouterLayer): boolean => {
94
+ return (
95
+ routerLayer.route?.path === path &&
96
+ routerLayer.route.methods["post"] === true
97
+ );
98
+ },
99
+ );
100
+
101
+ if (!layer?.route?.stack[0]) {
102
+ throw new Error(`POST route handler not found for ${path}`);
103
+ }
104
+
105
+ return layer.route.stack[0].handle;
106
+ };
107
+
108
+ const forgedInvokeBody: (action: string) => JSONObject = (
109
+ action: string,
110
+ ): JSONObject => {
111
+ return {
112
+ type: "invoke",
113
+ from: {
114
+ id: "attacker-controlled-linked-teams-user-id",
115
+ },
116
+ conversation: {
117
+ id: "attacker-controlled-conversation-id",
118
+ },
119
+ channelData: {
120
+ team: {
121
+ id: "any-non-empty-team-id",
122
+ },
123
+ tenant: {
124
+ id: "target-connected-tenant-id",
125
+ },
126
+ },
127
+ value: {
128
+ action: action,
129
+ actionValue: "11111111-2222-4333-8444-555555555555",
130
+ },
131
+ };
132
+ };
133
+
134
+ afterEach(() => {
135
+ jest.restoreAllMocks();
136
+ });
137
+
138
+ describe("Microsoft Teams inbound route authentication", () => {
139
+ test("does not register the unauthenticated legacy webhook for any method", () => {
140
+ const legacyLayers: Array<ExpressRouterLayer> = getRouterLayers().filter(
141
+ (layer: ExpressRouterLayer): boolean => {
142
+ return layer.route?.path === LEGACY_WEBHOOK_PATH;
143
+ },
144
+ );
145
+
146
+ expect(legacyLayers).toEqual([]);
147
+ });
148
+
149
+ test("keeps exactly one POST route for the authenticated Bot Framework adapter", () => {
150
+ /*
151
+ * Counted by method rather than by layer. What must stay unique is the
152
+ * inbound POST — a second one is how the unauthenticated legacy webhook
153
+ * got in, and this test exists to keep it out. The path itself carries a
154
+ * second layer on purpose since the 405 diagnostic landed: a GET handler
155
+ * that answers a browser probe instead of letting it fall through to the
156
+ * catch-all 404, which is what convinced the reporter of #3488 that the
157
+ * route had been dropped from the build.
158
+ *
159
+ * So: exactly one layer accepts POST, and no other layer on this path
160
+ * accepts POST either. The second assertion is the one doing the security
161
+ * work — a layer registered with router.all() would accept POST while
162
+ * reporting no `post` key of its own.
163
+ */
164
+ const botFrameworkLayers: Array<ExpressRouterLayer> =
165
+ getRouterLayers().filter((layer: ExpressRouterLayer): boolean => {
166
+ return layer.route?.path === BOT_FRAMEWORK_PATH;
167
+ });
168
+
169
+ const postLayers: Array<ExpressRouterLayer> = botFrameworkLayers.filter(
170
+ (layer: ExpressRouterLayer): boolean => {
171
+ return layer.route?.methods["post"] === true;
172
+ },
173
+ );
174
+
175
+ expect(postLayers).toHaveLength(1);
176
+ expect(postLayers[0]!.route!.methods).toEqual({ post: true });
177
+
178
+ const otherLayerMethods: Array<string> = botFrameworkLayers
179
+ .filter((layer: ExpressRouterLayer): boolean => {
180
+ return layer !== postLayers[0];
181
+ })
182
+ .flatMap((layer: ExpressRouterLayer): Array<string> => {
183
+ return Object.keys(layer.route!.methods);
184
+ });
185
+
186
+ expect(otherLayerMethods).not.toContain("post");
187
+ expect(otherLayerMethods).not.toContain("_all");
188
+ });
189
+
190
+ test.each([
191
+ MicrosoftTeamsIncidentActionType.AckIncident,
192
+ MicrosoftTeamsIncidentActionType.ResolveIncident,
193
+ MicrosoftTeamsAlertActionType.AckAlert,
194
+ MicrosoftTeamsAlertActionType.ResolveAlert,
195
+ ])(
196
+ "falls through without lookup or mutation for unsigned forged %s",
197
+ async (action: string) => {
198
+ const projectLookupSpy: SpyInstance<
199
+ typeof WorkspaceProjectAuthTokenService.findOneBy
200
+ > = jest
201
+ .spyOn(WorkspaceProjectAuthTokenService, "findOneBy")
202
+ .mockResolvedValue(null);
203
+ const userLookupSpy: SpyInstance<
204
+ typeof WorkspaceUserAuthTokenService.findOneBy
205
+ > = jest
206
+ .spyOn(WorkspaceUserAuthTokenService, "findOneBy")
207
+ .mockResolvedValue(null);
208
+ const acknowledgeIncidentSpy: SpyInstance<
209
+ typeof IncidentService.acknowledgeIncident
210
+ > = jest
211
+ .spyOn(IncidentService, "acknowledgeIncident")
212
+ .mockRejectedValue(new Error("unexpected incident mutation"));
213
+ const resolveIncidentSpy: SpyInstance<
214
+ typeof IncidentService.resolveIncident
215
+ > = jest
216
+ .spyOn(IncidentService, "resolveIncident")
217
+ .mockRejectedValue(new Error("unexpected incident mutation"));
218
+ const acknowledgeAlertSpy: SpyInstance<
219
+ typeof AlertService.acknowledgeAlert
220
+ > = jest
221
+ .spyOn(AlertService, "acknowledgeAlert")
222
+ .mockRejectedValue(new Error("unexpected alert mutation"));
223
+ const resolveAlertSpy: SpyInstance<typeof AlertService.resolveAlert> =
224
+ jest
225
+ .spyOn(AlertService, "resolveAlert")
226
+ .mockRejectedValue(new Error("unexpected alert mutation"));
227
+ const botFrameworkSpy: SpyInstance<
228
+ typeof MicrosoftTeamsUtil.processBotActivity
229
+ > = jest.spyOn(MicrosoftTeamsUtil, "processBotActivity");
230
+
231
+ await dispatchThroughRouter(
232
+ LEGACY_WEBHOOK_PATH,
233
+ forgedInvokeBody(action),
234
+ );
235
+
236
+ expect(projectLookupSpy).not.toHaveBeenCalled();
237
+ expect(userLookupSpy).not.toHaveBeenCalled();
238
+ expect(acknowledgeIncidentSpy).not.toHaveBeenCalled();
239
+ expect(resolveIncidentSpy).not.toHaveBeenCalled();
240
+ expect(acknowledgeAlertSpy).not.toHaveBeenCalled();
241
+ expect(resolveAlertSpy).not.toHaveBeenCalled();
242
+ expect(botFrameworkSpy).not.toHaveBeenCalled();
243
+ },
244
+ );
245
+
246
+ test("delegates the supported endpoint to the Bot Framework adapter", async () => {
247
+ const botFrameworkSpy: SpyInstance<
248
+ typeof MicrosoftTeamsUtil.processBotActivity
249
+ > = jest
250
+ .spyOn(MicrosoftTeamsUtil, "processBotActivity")
251
+ .mockResolvedValue();
252
+ const request: ExpressRequest = {
253
+ body: forgedInvokeBody(MicrosoftTeamsIncidentActionType.ResolveIncident),
254
+ } as unknown as ExpressRequest;
255
+ const response: ExpressResponse = {} as ExpressResponse;
256
+ const handler: ExpressRouteHandler =
257
+ getPostRouteHandler(BOT_FRAMEWORK_PATH);
258
+
259
+ await handler(request, response);
260
+
261
+ expect(botFrameworkSpy).toHaveBeenCalledTimes(1);
262
+ expect(botFrameworkSpy).toHaveBeenCalledWith(request, response);
263
+ });
264
+
265
+ test("adds the linked user's accepted team IDs to the Bot invoke permission context", async () => {
266
+ const projectId: ObjectID = ObjectID.generate();
267
+ const userId: ObjectID = ObjectID.generate();
268
+ const teamIds: Array<ObjectID> = [ObjectID.generate(), ObjectID.generate()];
269
+ const projectAuth: WorkspaceProjectAuthToken =
270
+ new WorkspaceProjectAuthToken();
271
+ projectAuth.projectId = projectId;
272
+
273
+ const databaseProps: DatabaseCommonInteractionProps = {
274
+ userId: userId,
275
+ tenantId: projectId,
276
+ };
277
+
278
+ jest
279
+ .spyOn(MicrosoftTeamsUtil, "resolveProjectByTenantId")
280
+ .mockResolvedValue({
281
+ projectAuth: projectAuth,
282
+ isAmbiguous: false,
283
+ candidateProjectIds: [projectId],
284
+ });
285
+ jest
286
+ .spyOn(MicrosoftTeamsAuthAction, "getOneUptimeUserIdFromTeamsUserId")
287
+ .mockResolvedValue(userId);
288
+ jest
289
+ .spyOn(
290
+ AccessTokenService,
291
+ "getDatabaseCommonInteractionPropsByUserAndProject",
292
+ )
293
+ .mockResolvedValue(databaseProps);
294
+ const getTeamIdsSpy: SpyInstance<
295
+ typeof TeamMemberService.getTeamIdsForUser
296
+ > = jest
297
+ .spyOn(TeamMemberService, "getTeamIdsForUser")
298
+ .mockResolvedValue(teamIds);
299
+ const handleIncidentSpy: SpyInstance<
300
+ typeof MicrosoftTeamsIncidentActions.handleBotIncidentAction
301
+ > = jest
302
+ .spyOn(MicrosoftTeamsIncidentActions, "handleBotIncidentAction")
303
+ .mockResolvedValue();
304
+
305
+ const turnContext: TurnContext = {
306
+ sendActivity: jest.fn(async (): Promise<void> => {}),
307
+ } as unknown as TurnContext;
308
+
309
+ await MicrosoftTeamsUtil.handleBotInvokeActivity({
310
+ activity: {
311
+ channelData: {
312
+ tenant: {
313
+ id: "connected-tenant-id",
314
+ },
315
+ },
316
+ from: {
317
+ aadObjectId: "linked-teams-user-aad-object-id",
318
+ },
319
+ value: {
320
+ action: MicrosoftTeamsIncidentActionType.AckIncident,
321
+ actionValue: ObjectID.generate().toString(),
322
+ },
323
+ },
324
+ turnContext: turnContext,
325
+ });
326
+
327
+ expect(getTeamIdsSpy).toHaveBeenCalledWith(userId, projectId);
328
+ expect(databaseProps.userTeamIds).toEqual(teamIds);
329
+ expect(handleIncidentSpy).toHaveBeenCalledWith(
330
+ expect.objectContaining({
331
+ projectId: projectId,
332
+ oneUptimeUserId: userId,
333
+ databaseProps: expect.objectContaining({
334
+ userTeamIds: teamIds,
335
+ }),
336
+ turnContext: turnContext,
337
+ }),
338
+ );
339
+ });
340
+
341
+ test("does not load incident or alert permissions for an unrelated Bot action", async () => {
342
+ const projectId: ObjectID = ObjectID.generate();
343
+ const userId: ObjectID = ObjectID.generate();
344
+ const projectAuth: WorkspaceProjectAuthToken =
345
+ new WorkspaceProjectAuthToken();
346
+ projectAuth.projectId = projectId;
347
+
348
+ jest
349
+ .spyOn(MicrosoftTeamsUtil, "resolveProjectByTenantId")
350
+ .mockResolvedValue({
351
+ projectAuth: projectAuth,
352
+ isAmbiguous: false,
353
+ candidateProjectIds: [projectId],
354
+ });
355
+ jest
356
+ .spyOn(MicrosoftTeamsAuthAction, "getOneUptimeUserIdFromTeamsUserId")
357
+ .mockResolvedValue(userId);
358
+ const databasePropsSpy: SpyInstance<
359
+ typeof AccessTokenService.getDatabaseCommonInteractionPropsByUserAndProject
360
+ > = jest
361
+ .spyOn(
362
+ AccessTokenService,
363
+ "getDatabaseCommonInteractionPropsByUserAndProject",
364
+ )
365
+ .mockRejectedValue(new Error("unexpected permission lookup"));
366
+ const getTeamIdsSpy: SpyInstance<
367
+ typeof TeamMemberService.getTeamIdsForUser
368
+ > = jest
369
+ .spyOn(TeamMemberService, "getTeamIdsForUser")
370
+ .mockRejectedValue(new Error("unexpected team lookup"));
371
+ const handleMonitorSpy: SpyInstance<
372
+ typeof MicrosoftTeamsMonitorActions.handleBotMonitorAction
373
+ > = jest
374
+ .spyOn(MicrosoftTeamsMonitorActions, "handleBotMonitorAction")
375
+ .mockResolvedValue();
376
+ const turnContext: TurnContext = {
377
+ sendActivity: jest.fn(async (): Promise<void> => {}),
378
+ } as unknown as TurnContext;
379
+
380
+ await MicrosoftTeamsUtil.handleBotInvokeActivity({
381
+ activity: {
382
+ channelData: {
383
+ tenant: {
384
+ id: "connected-tenant-id",
385
+ },
386
+ },
387
+ from: {
388
+ aadObjectId: "linked-teams-user-aad-object-id",
389
+ },
390
+ value: {
391
+ action: MicrosoftTeamsMonitorActionType.ViewMonitor,
392
+ actionValue: ObjectID.generate().toString(),
393
+ },
394
+ },
395
+ turnContext: turnContext,
396
+ });
397
+
398
+ expect(databasePropsSpy).not.toHaveBeenCalled();
399
+ expect(getTeamIdsSpy).not.toHaveBeenCalled();
400
+ expect(handleMonitorSpy).toHaveBeenCalledTimes(1);
401
+ });
402
+ });