From adb2a383cfd6705473bc40b12de9eeeeb87f6190 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 20 Jan 2026 00:02:27 +0000 Subject: [PATCH] refactor --- .../incidents/IIncidentsRepository.ts | 3 +- .../incidents/MongoIncidentRepository.ts | 25 ++++++++- .../src/service/business/incidentService.ts | 51 +++++++++++++++---- 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/server/src/repositories/incidents/IIncidentsRepository.ts b/server/src/repositories/incidents/IIncidentsRepository.ts index 00235de0d..dbdf2b05f 100644 --- a/server/src/repositories/incidents/IIncidentsRepository.ts +++ b/server/src/repositories/incidents/IIncidentsRepository.ts @@ -7,7 +7,8 @@ export interface IIncidentsRepository { findActiveByMonitorId(monitorId: string, teamId: string): Promise; findByTeamId( teamId: string, - dateRange: string, + startDate: Date, + endDate: Date, page: number, rowsPerPage: number, sortOrder?: string, diff --git a/server/src/repositories/incidents/MongoIncidentRepository.ts b/server/src/repositories/incidents/MongoIncidentRepository.ts index db0048fc7..ead783e11 100644 --- a/server/src/repositories/incidents/MongoIncidentRepository.ts +++ b/server/src/repositories/incidents/MongoIncidentRepository.ts @@ -77,8 +77,29 @@ class MongoIncidentRepository implements IIncidentsRepository { return this.toEntity(incident); }; - findByTeamId = async (teamId: string): Promise => { - throw new Error("Method not implemented."); + findByTeamId = async ( + teamId: string, + startDate: Date, + endDate: Date, + page: number, + rowsPerPage: number, + sortOrder?: string, + status?: string, + monitorId?: string, + resolutionType?: string + ): Promise => { + const matchStage: Record = { + teamId: new mongoose.Types.ObjectId(teamId), + ...(status !== undefined && { status: status }), + ...(monitorId && { monitorId: new mongoose.Types.ObjectId(monitorId) }), + ...(resolutionType && { resolutionType }), + createdAt: { $gte: startDate, $lte: endDate }, + }; + const incidents = await IncidentModel.find(matchStage) + .sort({ createdAt: sortOrder === "asc" ? 1 : -1 }) + .skip(page * rowsPerPage) + .limit(rowsPerPage); + return this.mapDocuments(incidents); }; updateById = async (incidentId: string, teamId: string, patch: Partial) => { diff --git a/server/src/service/business/incidentService.ts b/server/src/service/business/incidentService.ts index a96c7923d..b2ad444d3 100644 --- a/server/src/service/business/incidentService.ts +++ b/server/src/service/business/incidentService.ts @@ -4,6 +4,15 @@ import { AppError } from "@/utils/AppError.js"; import type { IIncidentsRepository } from "@/repositories/index.js"; import type { Incident } from "@/types/index.js"; +const dateRangeLookup: Record = { + recent: new Date(new Date().setDate(new Date().getDate() - 2)), + hour: new Date(new Date().setHours(new Date().getHours() - 1)), + day: new Date(new Date().setDate(new Date().getDate() - 1)), + week: new Date(new Date().setDate(new Date().getDate() - 7)), + month: new Date(new Date().setMonth(new Date().getMonth() - 1)), + all: undefined, +}; + class IncidentService { static SERVICE_NAME = SERVICE_NAME; @@ -125,18 +134,38 @@ class IncidentService { const { sortOrder, dateRange, page, rowsPerPage, status, monitorId, resolutionType } = query || {}; - const result = await this.db.incidentModule.getIncidentsByTeam({ - teamId, - sortOrder, - dateRange, - page, - rowsPerPage, - status, - monitorId, - resolutionType, - }); + const startDate = dateRangeLookup[dateRange]; - return result; + const endDate = new Date(); + + const parsedPage = Number.isFinite(parseInt(page)) ? parseInt(page) : 0; + const parsedRowsPerPage = Number.isFinite(parseInt(rowsPerPage)) ? parseInt(rowsPerPage) : 20; + const parsedStatus = status === "true" ? "true" : status === "false" ? "false" : undefined; + + const res = await this.incidentsRepository.findByTeamId( + teamId, + startDate, + endDate, + parsedPage, + parsedRowsPerPage, + sortOrder, + parsedStatus, + monitorId, + resolutionType + ); + + // const result = await this.db.incidentModule.getIncidentsByTeam({ + // teamId, + // sortOrder, + // dateRange, + // page, + // rowsPerPage, + // status, + // monitorId, + // resolutionType, + // }); + + return res; } catch (error: any) { this.logger.error({ service: SERVICE_NAME,