From fb8347679593e0f53eaf9897eaa31818723e4811 Mon Sep 17 00:00:00 2001 From: Simon Larsen Date: Tue, 14 May 2024 16:43:42 +0100 Subject: [PATCH] chore: Add new data migration to include missing end dates in MonitorStatusTimeline --- ...itorStatusTimelineWhereEndDateIsMissing.ts | 113 ++++++++++++++++++ .../Workers/DataMigrations/Index.ts | 2 + 2 files changed, 115 insertions(+) create mode 100644 App/FeatureSet/Workers/DataMigrations/AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing.ts diff --git a/App/FeatureSet/Workers/DataMigrations/AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing.ts b/App/FeatureSet/Workers/DataMigrations/AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing.ts new file mode 100644 index 0000000000..c044e1bbd2 --- /dev/null +++ b/App/FeatureSet/Workers/DataMigrations/AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing.ts @@ -0,0 +1,113 @@ +import DataMigrationBase from './DataMigrationBase'; +import LIMIT_MAX from 'Common/Types/Database/LimitMax'; +import Project from 'Model/Models/Project'; +import ProjectService from 'CommonServer/Services/ProjectService'; +import Monitor from 'Model/Models/Monitor'; +import MonitorService from 'CommonServer/Services/MonitorService'; +import MonitorStatusTimeline from 'Model/Models/MonitorStatusTimeline'; +import MonitorStatusTimelineService from 'CommonServer/Services/MonitorStatusTimelineService'; +import SortOrder from 'Common/Types/BaseDatabase/SortOrder'; + +export default class AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing extends DataMigrationBase { + public constructor() { + super('AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing'); + } + + public override async migrate(): Promise { + // get all the users with email isVerified true. + + const projects: Array = await ProjectService.findBy({ + query: {}, + select: { + _id: true, + }, + skip: 0, + limit: LIMIT_MAX, + props: { + isRoot: true, + }, + }); + + for (const project of projects) { + // add ended scheduled maintenance state for each of these projects. + // first fetch resolved state. Ended state order is -1 of resolved state. + + const monitors: Array = await MonitorService.findBy({ + query: { + projectId: project.id!, + }, + select: { + _id: true, + }, + skip: 0, + limit: LIMIT_MAX, + props: { + isRoot: true, + }, + }); + + for (const monitor of monitors) { + const statusTimelines: Array = + await MonitorStatusTimelineService.findBy({ + query: { + monitorId: monitor.id!, + }, + select: { + _id: true, + createdAt: true, + }, + skip: 0, + limit: LIMIT_MAX, + props: { + isRoot: true, + }, + sort: { + createdAt: SortOrder.Descending, + }, + }); + + // reverse the status timelines + statusTimelines.reverse(); + + for (let i: number = 0; i < statusTimelines.length; i++) { + const statusTimeline: MonitorStatusTimeline | undefined = + statusTimelines[i]; + + if (!statusTimeline) { + continue; + } + + if (statusTimeline.endsAt) { + continue; + } + + let endDate: Date | null = statusTimeline.endsAt || null; + + if ( + !endDate && + statusTimelines[i + 1] && + statusTimelines[i + 1]?.createdAt + ) { + endDate = statusTimelines[i + 1]!.createdAt!; + } + + if (endDate) { + await MonitorStatusTimelineService.updateOneById({ + id: statusTimeline!.id!, + data: { + endsAt: endDate, + }, + props: { + isRoot: true, + }, + }); + } + } + } + } + } + + public override async rollback(): Promise { + return; + } +} diff --git a/App/FeatureSet/Workers/DataMigrations/Index.ts b/App/FeatureSet/Workers/DataMigrations/Index.ts index 10ecf70b7e..17872a7b48 100644 --- a/App/FeatureSet/Workers/DataMigrations/Index.ts +++ b/App/FeatureSet/Workers/DataMigrations/Index.ts @@ -24,6 +24,7 @@ import UpdateGlobalConfigFromEnv from './UpdateGlobalCongfigFromEnv'; import AddTelemetryServiceColor from './AddTelemetryServiceColor'; import MoveGreenlockCertsToAcmeCerts from './MoveGreenlockCertsToAcmeCerts'; import GenerateNewCertsForStatusPage from './GenerateNewCertsForStatusPage'; +import AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing from './AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing'; // This is the order in which the migrations will be run. Add new migrations to the end of the array. @@ -53,6 +54,7 @@ const DataMigrations: Array = [ new AddTelemetryServiceColor(), new MoveGreenlockCertsToAcmeCerts(), new GenerateNewCertsForStatusPage(), + new AddEndDateToMonitorStatusTimelineWhereEndDateIsMissing(), ]; export default DataMigrations;