@oneuptime/common 11.7.0 → 11.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/DashboardDomain.ts +1 -0
- package/Models/DatabaseModels/Incident.ts +2 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/Monitor.ts +1 -0
- package/Models/DatabaseModels/MonitorStatusTimeline.ts +1 -0
- package/Models/DatabaseModels/NetworkSite.ts +1 -0
- package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +1 -0
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.ts +1 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +2 -0
- package/Models/DatabaseModels/Probe.ts +13 -13
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -0
- package/Models/DatabaseModels/StatusPage.ts +1 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
- package/Models/DatabaseModels/StatusPageDomain.ts +1 -0
- package/Models/DatabaseModels/WorkspaceNotificationSummary.ts +1 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +11 -0
- package/Server/API/BaseAPI.ts +17 -1
- package/Server/API/CommonAPI.ts +32 -0
- package/Server/API/MicrosoftTeamsAPI.ts +99 -2
- package/Server/API/ProbeAPI.ts +2 -0
- package/Server/API/SlackAPI.ts +62 -0
- package/Server/API/StatusPageAPI.ts +157 -192
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.ts +89 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.ts +61 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.ts +280 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Services/DatabaseService.ts +11 -3
- package/Server/Services/MonitorGroupService.ts +145 -0
- package/Server/Services/MonitorService.ts +231 -30
- package/Server/Services/ProbeService.ts +319 -16
- package/Server/Services/StatusPageService.ts +72 -42
- package/Server/Services/WorkspaceNotificationRuleService.ts +232 -2
- package/Server/Utils/Database/PostgresErrorTranslator.ts +131 -0
- package/Server/Utils/Monitor/MonitorResource.ts +88 -35
- package/Server/Utils/Monitor/MonitorStatusTimeline.ts +21 -1
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +158 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +706 -6
- package/Tests/Models/DatabaseModels/ProbeColumnAccessControl.test.ts +103 -0
- package/Tests/Server/API/BaseAPIUpdateNoOp.test.ts +135 -0
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +317 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +228 -0
- package/Tests/Server/API/ProbeAPI.test.ts +6 -0
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +167 -0
- package/Tests/Server/Services/AddHotQueryIndexesMigration.test.ts +255 -0
- package/Tests/Server/Services/AddHotQueryIndexesSecondPassMigration.test.ts +258 -0
- package/Tests/Server/Services/DatabaseServiceSanitizeUpdateData.test.ts +1 -1
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +121 -0
- package/Tests/Server/Services/HeartbeatWriteFastPathSafety.test.ts +200 -0
- package/Tests/Server/Services/HookFreeWriteSafetySecondPass.test.ts +181 -0
- package/Tests/Server/Services/MonitorGroupServiceBatchedStatuses.test.ts +513 -0
- package/Tests/Server/Services/MonitorResourceProbeAgreementReuse.test.ts +492 -0
- package/Tests/Server/Services/MonitorServiceProbeSelection.test.ts +401 -0
- package/Tests/Server/Services/MonitorStatusTimelineFastPath.test.ts +453 -0
- package/Tests/Server/Services/ProbeAuthKeyCacheAndHeartbeat.test.ts +679 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +3 -3
- package/Tests/Server/Services/StatusPageDomainResolutionCache.test.ts +245 -0
- package/Tests/Server/Services/StatusPageOverviewTimelineWindow.test.ts +283 -0
- package/Tests/Server/Services/StatusPageServiceMcp.test.ts +17 -1
- package/Tests/Server/Services/StatusPageServiceMonitorGroupBatching.test.ts +331 -0
- package/Tests/Server/Services/UserOnCallLogClaimNotificationRule.test.ts +12 -12
- package/Tests/Server/Services/WorkspaceNotificationRuleChats.test.ts +1390 -0
- package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +4 -4
- package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +2 -2
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +1 -3
- package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +1 -3
- package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +1 -1
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +5 -5
- package/Tests/Server/Utils/Alert/AlertPrivacyFilter.test.ts +187 -0
- package/Tests/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.test.ts +170 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +125 -0
- package/Tests/Server/Utils/Incident/IncidentPrivacyFilter.test.ts +264 -0
- package/Tests/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.test.ts +175 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +181 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +2 -2
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +341 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +2175 -0
- package/Tests/Server/Utils/Workspace/SlackChannelsList.test.ts +585 -0
- package/Tests/Types/Billing/MeteredPlan.test.ts +46 -0
- package/Tests/Types/DateUserTimezone.test.ts +205 -0
- package/Tests/Types/DateUserTimezoneOverridesBrowser.test.ts +73 -0
- package/Tests/Types/Workspace/NotificationRules/NotificationRuleCondition.test.ts +219 -1
- package/Tests/UI/Components/BulkUpdateForm.test.tsx +174 -0
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +315 -0
- package/Tests/UI/Components/ModelDetailSelect.test.tsx +229 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1258 -0
- package/Tests/UI/Components/ModelTableExportFromColumns.test.ts +153 -0
- package/Tests/UI/Components/MonacoLoader.test.ts +67 -0
- package/Tests/UI/Components/MonacoRuntime.test.ts +121 -0
- package/Tests/UI/Components/TableBulkCsvExport.test.tsx +212 -3
- package/Tests/UI/Components/TimePicker/TimePicker.test.tsx +11 -0
- package/Tests/UI/Utils/Project.test.ts +809 -0
- package/Tests/UI/Utils/TableColumnsToCsv.test.ts +360 -0
- package/Tests/Utils/Alerts/AlertMetricType.test.ts +143 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +219 -0
- package/Tests/Utils/Incident/IncidentMetricType.test.ts +174 -0
- package/Tests/Utils/Monitor/MonitorProbeSelectionUtil.test.ts +145 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +263 -0
- package/Types/Date.ts +119 -50
- package/Types/Workspace/NotificationRules/BaseNotificationRule.ts +4 -0
- package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +25 -10
- package/Types/Workspace/WorkspaceMessagePayload.ts +1 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +63 -8
- package/UI/Components/CodeEditor/CodeEditor.tsx +3 -0
- package/UI/Components/CodeEditor/MonacoLoader.ts +36 -0
- package/UI/Components/Forms/Fields/FormField.tsx +13 -3
- package/UI/Components/Forms/ModelForm.tsx +41 -18
- package/UI/Components/Input/Input.tsx +6 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +23 -1
- package/UI/Components/ModelDetail/ModelDetail.tsx +46 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +300 -30
- package/UI/Components/ModelTable/Column.ts +12 -0
- package/UI/Components/ModelTable/ExportFromColumns.ts +57 -0
- package/UI/Components/Navbar/NavBar.tsx +66 -1
- package/UI/Components/Table/Table.tsx +52 -13
- package/UI/Components/Table/Types/Column.ts +18 -0
- package/UI/Components/TimePicker/TimePicker.tsx +8 -4
- package/UI/Utils/Project.ts +214 -18
- package/UI/Utils/TableColumnsToCsv.ts +86 -6
- package/UI/Utils/User.ts +19 -0
- package/UI/esbuild-config.js +34 -0
- package/Utils/Monitor/MonitorProbeSelectionUtil.ts +72 -0
- package/build/dist/Models/DatabaseModels/DashboardDomain.js +1 -0
- package/build/dist/Models/DatabaseModels/DashboardDomain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +2 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +1 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +2 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Probe.js +13 -13
- package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageDomain.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageDomain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceNotificationSummary.js +1 -0
- package/build/dist/Models/DatabaseModels/WorkspaceNotificationSummary.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +12 -1
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +21 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +72 -2
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProbeAPI.js +2 -0
- package/build/dist/Server/API/ProbeAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +44 -0
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +98 -152
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785140242697-AddHotQueryIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785148065137-AddHotQueryIndexesSecondPass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.js +254 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785240000000-RepairCrossProjectMonitorStatusReferences.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +10 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/MonitorGroupService.js +118 -0
- package/build/dist/Server/Services/MonitorGroupService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +198 -24
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +238 -9
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +46 -39
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +178 -3
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +80 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +67 -29
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +31 -14
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +117 -0
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +549 -7
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/Date.js +106 -35
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +17 -7
- package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +37 -11
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +2 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +34 -0
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +37 -17
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +6 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +22 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +31 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +234 -21
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ExportFromColumns.js +30 -0
- package/build/dist/UI/Components/ModelTable/ExportFromColumns.js.map +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js +39 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +31 -11
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/TimePicker/TimePicker.js +4 -4
- package/build/dist/UI/Components/TimePicker/TimePicker.js.map +1 -1
- package/build/dist/UI/Utils/Project.js +161 -15
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/UI/Utils/TableColumnsToCsv.js +67 -6
- package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -1
- package/build/dist/UI/Utils/User.js +19 -0
- package/build/dist/UI/Utils/User.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorProbeSelectionUtil.js +52 -0
- package/build/dist/Utils/Monitor/MonitorProbeSelectionUtil.js.map +1 -0
- package/package.json +4 -3
- package/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.ts +0 -79
- package/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.ts +0 -41
- package/Server/Infrastructure/Postgres/SchemaMigrations/1776886248361-MigrationName.ts +0 -17
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.js +0 -34
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773414578773-MigrationName.js.map +0 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.js +0 -22
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1773500000000-MigrationName.js.map +0 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776886248361-MigrationName.js +0 -12
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1776886248361-MigrationName.js.map +0 -1
|
@@ -30,7 +30,7 @@ import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
|
30
30
|
import { PlanType } from "../../Types/Billing/SubscriptionPlan";
|
|
31
31
|
import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
32
32
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
33
|
-
import { JSONObject } from "../../Types/JSON";
|
|
33
|
+
import { JSONObject, JSONValue } from "../../Types/JSON";
|
|
34
34
|
import MonitorType, {
|
|
35
35
|
MonitorTypeHelper,
|
|
36
36
|
} from "../../Types/Monitor/MonitorType";
|
|
@@ -60,6 +60,7 @@ import UserNotificationSettingService from "./UserNotificationSettingService";
|
|
|
60
60
|
import NotificationSettingEventType from "../../Types/NotificationSetting/NotificationSettingEventType";
|
|
61
61
|
import Query from "../Types/Database/Query";
|
|
62
62
|
import DeleteBy from "../Types/Database/DeleteBy";
|
|
63
|
+
import UpdateBy from "../Types/Database/UpdateBy";
|
|
63
64
|
import StatusPageResourceService from "./StatusPageResourceService";
|
|
64
65
|
import Label from "../../Models/DatabaseModels/Label";
|
|
65
66
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
@@ -68,6 +69,7 @@ import NotificationRuleWorkspaceChannel from "../../Types/Workspace/Notification
|
|
|
68
69
|
import WorkspaceNotificationRuleService, {
|
|
69
70
|
MessageBlocksByWorkspaceType,
|
|
70
71
|
} from "./WorkspaceNotificationRuleService";
|
|
72
|
+
import MonitorStepsProjectValidator from "../Utils/Monitor/MonitorStepsProjectValidator";
|
|
71
73
|
import MonitorWorkspaceMessages from "../Utils/Workspace/WorkspaceMessages/Monitor";
|
|
72
74
|
import MonitorFeedService from "./MonitorFeedService";
|
|
73
75
|
import { MonitorFeedEventType } from "../../Models/DatabaseModels/MonitorFeed";
|
|
@@ -382,6 +384,57 @@ export class Service extends DatabaseService<Model> {
|
|
|
382
384
|
return onDelete;
|
|
383
385
|
}
|
|
384
386
|
|
|
387
|
+
@CaptureSpan()
|
|
388
|
+
protected override async onBeforeUpdate(
|
|
389
|
+
updateBy: UpdateBy<Model>,
|
|
390
|
+
): Promise<OnUpdate<Model>> {
|
|
391
|
+
if (updateBy.data.monitorSteps) {
|
|
392
|
+
/*
|
|
393
|
+
* Root/API updates do not always carry a tenantId, so fall back to the
|
|
394
|
+
* project of each monitor the query actually matches.
|
|
395
|
+
*/
|
|
396
|
+
const projectIds: Array<ObjectID> = updateBy.props.tenantId
|
|
397
|
+
? [updateBy.props.tenantId]
|
|
398
|
+
: await this.getProjectIdsForUpdateQuery(updateBy);
|
|
399
|
+
|
|
400
|
+
for (const projectId of projectIds) {
|
|
401
|
+
await MonitorStepsProjectValidator.validateMonitorStepsBelongToProject({
|
|
402
|
+
monitorSteps: updateBy.data.monitorSteps as MonitorSteps | JSONObject,
|
|
403
|
+
projectId: projectId,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return { updateBy, carryForward: null };
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
private async getProjectIdsForUpdateQuery(
|
|
412
|
+
updateBy: UpdateBy<Model>,
|
|
413
|
+
): Promise<Array<ObjectID>> {
|
|
414
|
+
const monitors: Array<Model> = await this.findBy({
|
|
415
|
+
query: updateBy.query,
|
|
416
|
+
select: {
|
|
417
|
+
projectId: true,
|
|
418
|
+
},
|
|
419
|
+
limit: LIMIT_MAX,
|
|
420
|
+
skip: 0,
|
|
421
|
+
props: {
|
|
422
|
+
isRoot: true,
|
|
423
|
+
ignoreHooks: true,
|
|
424
|
+
},
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
const projectIds: Dictionary<ObjectID> = {};
|
|
428
|
+
|
|
429
|
+
for (const monitor of monitors) {
|
|
430
|
+
if (monitor.projectId) {
|
|
431
|
+
projectIds[monitor.projectId.toString()] = monitor.projectId;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
return Object.values(projectIds);
|
|
436
|
+
}
|
|
437
|
+
|
|
385
438
|
@CaptureSpan()
|
|
386
439
|
protected override async onUpdateSuccess(
|
|
387
440
|
onUpdate: OnUpdate<Model>,
|
|
@@ -602,6 +655,11 @@ export class Service extends DatabaseService<Model> {
|
|
|
602
655
|
throw new BadDataException("ProjectId required to create monitor.");
|
|
603
656
|
}
|
|
604
657
|
|
|
658
|
+
await MonitorStepsProjectValidator.validateMonitorStepsBelongToProject({
|
|
659
|
+
monitorSteps: createBy.data.monitorSteps,
|
|
660
|
+
projectId: createBy.props.tenantId,
|
|
661
|
+
});
|
|
662
|
+
|
|
605
663
|
const monitorStatus: MonitorStatus | null =
|
|
606
664
|
await MonitorStatusService.findOneBy({
|
|
607
665
|
query: {
|
|
@@ -705,6 +763,34 @@ ${createdItem.description?.trim() || "No description provided."}
|
|
|
705
763
|
feedInfoInMarkdown += `\n\n`;
|
|
706
764
|
}
|
|
707
765
|
|
|
766
|
+
/*
|
|
767
|
+
* Probes are attached inline rather than on the detached chain below: the
|
|
768
|
+
* create form redirects straight to the monitor, and a monitor that shows
|
|
769
|
+
* no probes for a second or two reads as "the probe was never assigned".
|
|
770
|
+
* Failures are logged, never thrown - a probe problem must not fail the
|
|
771
|
+
* monitor create.
|
|
772
|
+
*/
|
|
773
|
+
if (
|
|
774
|
+
createdItem.monitorType &&
|
|
775
|
+
MonitorTypeHelper.isProbableMonitor(createdItem.monitorType)
|
|
776
|
+
) {
|
|
777
|
+
try {
|
|
778
|
+
await this.addProbesToMonitor({
|
|
779
|
+
projectId: createdItem.projectId,
|
|
780
|
+
monitorId: createdItem.id,
|
|
781
|
+
selectedProbeIds: this.getSelectedProbeIdsFromMiscDataProps(
|
|
782
|
+
onCreate.createBy.miscDataProps,
|
|
783
|
+
),
|
|
784
|
+
});
|
|
785
|
+
} catch (error) {
|
|
786
|
+
logger.error("Add probes failed in MonitorService.onCreateSuccess", {
|
|
787
|
+
projectId: createdItem.projectId?.toString(),
|
|
788
|
+
monitorId: createdItem.id?.toString(),
|
|
789
|
+
} as LogAttributes);
|
|
790
|
+
logger.error(error as Error);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
|
|
708
794
|
// Execute operations sequentially with error handling (workspace first)
|
|
709
795
|
Promise.resolve()
|
|
710
796
|
.then(async () => {
|
|
@@ -751,30 +837,6 @@ ${createdItem.description?.trim() || "No description provided."}
|
|
|
751
837
|
return Promise.resolve();
|
|
752
838
|
}
|
|
753
839
|
})
|
|
754
|
-
.then(async () => {
|
|
755
|
-
try {
|
|
756
|
-
if (
|
|
757
|
-
createdItem.monitorType &&
|
|
758
|
-
MonitorTypeHelper.isProbableMonitor(createdItem.monitorType)
|
|
759
|
-
) {
|
|
760
|
-
return await this.addDefaultProbesToMonitor(
|
|
761
|
-
createdItem.projectId!,
|
|
762
|
-
createdItem.id!,
|
|
763
|
-
);
|
|
764
|
-
}
|
|
765
|
-
return Promise.resolve();
|
|
766
|
-
} catch (error) {
|
|
767
|
-
logger.error(
|
|
768
|
-
"Add default probes failed in MonitorService.onCreateSuccess",
|
|
769
|
-
{
|
|
770
|
-
projectId: createdItem.projectId?.toString(),
|
|
771
|
-
monitorId: createdItem.id?.toString(),
|
|
772
|
-
} as LogAttributes,
|
|
773
|
-
);
|
|
774
|
-
logger.error(error as Error);
|
|
775
|
-
return Promise.resolve();
|
|
776
|
-
}
|
|
777
|
-
})
|
|
778
840
|
.then(async () => {
|
|
779
841
|
try {
|
|
780
842
|
if (IsBillingEnabled) {
|
|
@@ -1069,6 +1131,134 @@ ${createdItem.description?.trim() || "No description provided."}
|
|
|
1069
1131
|
}
|
|
1070
1132
|
}
|
|
1071
1133
|
|
|
1134
|
+
/*
|
|
1135
|
+
* The monitor create form sends the probes the user picked through
|
|
1136
|
+
* miscDataProps (the same side channel the owner fields use). They arrive as
|
|
1137
|
+
* plain strings because miscDataProps is not run through the model
|
|
1138
|
+
* serializer, so normalise before anything else touches them.
|
|
1139
|
+
*/
|
|
1140
|
+
public getSelectedProbeIdsFromMiscDataProps(
|
|
1141
|
+
miscDataProps: JSONObject | undefined,
|
|
1142
|
+
): Array<ObjectID> | undefined {
|
|
1143
|
+
const rawProbeIds: JSONValue | undefined = miscDataProps?.["probes"];
|
|
1144
|
+
|
|
1145
|
+
if (!Array.isArray(rawProbeIds)) {
|
|
1146
|
+
// Nothing was sent (API clients, templates) - fall back to the defaults.
|
|
1147
|
+
return undefined;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
const probeIds: Array<ObjectID> = [];
|
|
1151
|
+
const seen: Set<string> = new Set<string>();
|
|
1152
|
+
|
|
1153
|
+
for (const rawProbeId of rawProbeIds) {
|
|
1154
|
+
if (!rawProbeId) {
|
|
1155
|
+
continue;
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
const probeId: string =
|
|
1159
|
+
rawProbeId instanceof ObjectID
|
|
1160
|
+
? rawProbeId.toString()
|
|
1161
|
+
: String(rawProbeId);
|
|
1162
|
+
|
|
1163
|
+
if (!probeId || seen.has(probeId)) {
|
|
1164
|
+
continue;
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
seen.add(probeId);
|
|
1168
|
+
probeIds.push(new ObjectID(probeId));
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
return probeIds;
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
/*
|
|
1175
|
+
* Attaches the probes the user explicitly selected at create time, or the
|
|
1176
|
+
* project's auto-enable defaults when no selection was made. An explicit but
|
|
1177
|
+
* empty selection means "no probes" and is honoured as such.
|
|
1178
|
+
*/
|
|
1179
|
+
@CaptureSpan()
|
|
1180
|
+
public async addProbesToMonitor(data: {
|
|
1181
|
+
projectId: ObjectID | undefined;
|
|
1182
|
+
monitorId: ObjectID | undefined | null;
|
|
1183
|
+
selectedProbeIds: Array<ObjectID> | undefined;
|
|
1184
|
+
}): Promise<void> {
|
|
1185
|
+
if (!data.projectId) {
|
|
1186
|
+
throw new BadDataException("projectId is required");
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
if (!data.monitorId) {
|
|
1190
|
+
throw new BadDataException("monitorId is required");
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
if (data.selectedProbeIds === undefined) {
|
|
1194
|
+
return await this.addDefaultProbesToMonitor(
|
|
1195
|
+
data.projectId,
|
|
1196
|
+
data.monitorId,
|
|
1197
|
+
);
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
return await this.addSelectedProbesToMonitor(
|
|
1201
|
+
data.projectId,
|
|
1202
|
+
data.monitorId,
|
|
1203
|
+
data.selectedProbeIds,
|
|
1204
|
+
);
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
/*
|
|
1208
|
+
* Only global probes and probes belonging to this project may be attached -
|
|
1209
|
+
* the id list comes from the browser, so it cannot be trusted to stay inside
|
|
1210
|
+
* the tenant.
|
|
1211
|
+
*/
|
|
1212
|
+
@CaptureSpan()
|
|
1213
|
+
public async addSelectedProbesToMonitor(
|
|
1214
|
+
projectId: ObjectID,
|
|
1215
|
+
monitorId: ObjectID,
|
|
1216
|
+
probeIds: Array<ObjectID>,
|
|
1217
|
+
): Promise<void> {
|
|
1218
|
+
if (probeIds.length === 0) {
|
|
1219
|
+
return;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
const [globalProbes, projectProbes]: [Array<Probe>, Array<Probe>] =
|
|
1223
|
+
await Promise.all([
|
|
1224
|
+
ProbeService.findBy({
|
|
1225
|
+
query: {
|
|
1226
|
+
_id: QueryHelper.any(probeIds),
|
|
1227
|
+
isGlobalProbe: true,
|
|
1228
|
+
},
|
|
1229
|
+
select: {
|
|
1230
|
+
_id: true,
|
|
1231
|
+
},
|
|
1232
|
+
skip: 0,
|
|
1233
|
+
limit: LIMIT_PER_PROJECT,
|
|
1234
|
+
props: {
|
|
1235
|
+
isRoot: true,
|
|
1236
|
+
},
|
|
1237
|
+
}),
|
|
1238
|
+
ProbeService.findBy({
|
|
1239
|
+
query: {
|
|
1240
|
+
_id: QueryHelper.any(probeIds),
|
|
1241
|
+
isGlobalProbe: false,
|
|
1242
|
+
projectId: projectId,
|
|
1243
|
+
},
|
|
1244
|
+
select: {
|
|
1245
|
+
_id: true,
|
|
1246
|
+
},
|
|
1247
|
+
skip: 0,
|
|
1248
|
+
limit: LIMIT_PER_PROJECT,
|
|
1249
|
+
props: {
|
|
1250
|
+
isRoot: true,
|
|
1251
|
+
},
|
|
1252
|
+
}),
|
|
1253
|
+
]);
|
|
1254
|
+
|
|
1255
|
+
await this.createMonitorProbes({
|
|
1256
|
+
projectId: projectId,
|
|
1257
|
+
monitorId: monitorId,
|
|
1258
|
+
probes: [...globalProbes, ...projectProbes],
|
|
1259
|
+
});
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1072
1262
|
@CaptureSpan()
|
|
1073
1263
|
public async addDefaultProbesToMonitor(
|
|
1074
1264
|
projectId: ObjectID,
|
|
@@ -1124,20 +1314,31 @@ ${createdItem.description?.trim() || "No description provided."}
|
|
|
1124
1314
|
},
|
|
1125
1315
|
});
|
|
1126
1316
|
|
|
1127
|
-
|
|
1317
|
+
await this.createMonitorProbes({
|
|
1318
|
+
projectId: projectId,
|
|
1319
|
+
monitorId: monitorId,
|
|
1320
|
+
probes: [...globalProbes, ...projectProbes],
|
|
1321
|
+
});
|
|
1322
|
+
}
|
|
1128
1323
|
|
|
1129
|
-
|
|
1324
|
+
@CaptureSpan()
|
|
1325
|
+
public async createMonitorProbes(data: {
|
|
1326
|
+
projectId: ObjectID;
|
|
1327
|
+
monitorId: ObjectID;
|
|
1328
|
+
probes: Array<Probe>;
|
|
1329
|
+
}): Promise<void> {
|
|
1330
|
+
if (data.probes.length === 0) {
|
|
1130
1331
|
return;
|
|
1131
1332
|
}
|
|
1132
1333
|
|
|
1133
1334
|
// Create all monitor probes in parallel for better performance
|
|
1134
1335
|
const createPromises: Array<Promise<MonitorProbe>> = [];
|
|
1135
1336
|
|
|
1136
|
-
for (const probe of
|
|
1337
|
+
for (const probe of data.probes) {
|
|
1137
1338
|
const monitorProbe: MonitorProbe = new MonitorProbe();
|
|
1138
|
-
monitorProbe.monitorId = monitorId;
|
|
1339
|
+
monitorProbe.monitorId = data.monitorId;
|
|
1139
1340
|
monitorProbe.probeId = probe.id!;
|
|
1140
|
-
monitorProbe.projectId = projectId;
|
|
1341
|
+
monitorProbe.projectId = data.projectId;
|
|
1141
1342
|
monitorProbe.isEnabled = true;
|
|
1142
1343
|
|
|
1143
1344
|
createPromises.push(
|