diff --git a/client/package-lock.json b/client/package-lock.json
index 84fc4c3a6..038814543 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -2472,11 +2472,13 @@
}
},
"node_modules/axios": {
- "version": "1.13.4",
+ "version": "1.13.5",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
+ "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
"license": "MIT",
"dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.4",
+ "follow-redirects": "^1.15.11",
+ "form-data": "^4.0.5",
"proxy-from-env": "^1.1.0"
}
},
diff --git a/client/src/Components/v2/design-elements/StatusBox.tsx b/client/src/Components/v2/design-elements/StatusBox.tsx
index a83ebcf5d..1be76988b 100644
--- a/client/src/Components/v2/design-elements/StatusBox.tsx
+++ b/client/src/Components/v2/design-elements/StatusBox.tsx
@@ -2,7 +2,6 @@ import Stack from "@mui/material/Stack";
import Typography from "@mui/material/Typography";
import Box from "@mui/material/Box";
import { BaseBox } from "@/Components/v2/design-elements";
-import Background from "@/assets/Images/background-grid.svg?react";
import { useTranslation } from "react-i18next";
import type { SxProps } from "@mui/material";
@@ -18,6 +17,7 @@ export const BGBox = ({ children, sx }: StatusBoxProps) => {
return (
{
>
-
-
+ top={0}
+ left={0}
+ right={0}
+ bottom={0}
+ sx={{
+ pointerEvents: "none",
+ backgroundImage: `
+ linear-gradient(${theme.palette.divider} 1px, transparent 1px),
+ linear-gradient(90deg, ${theme.palette.divider} 1px, transparent 1px)
+ `,
+ backgroundSize: "24px 24px",
+ maskImage:
+ "linear-gradient(135deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 30%, rgba(0,0,0,0.4) 100%)",
+ WebkitMaskImage:
+ "linear-gradient(135deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 30%, rgba(0,0,0,0.4) 100%)",
+ }}
+ />
{children}
);
diff --git a/client/src/assets/Images/Google.png b/client/src/assets/Images/Google.png
deleted file mode 100644
index 490f4a201..000000000
Binary files a/client/src/assets/Images/Google.png and /dev/null differ
diff --git a/client/src/assets/Images/avatar_placeholder.png b/client/src/assets/Images/avatar_placeholder.png
deleted file mode 100644
index 38e896811..000000000
Binary files a/client/src/assets/Images/avatar_placeholder.png and /dev/null differ
diff --git a/client/src/assets/Images/background-grid.svg b/client/src/assets/Images/background-grid.svg
deleted file mode 100644
index 988f1da77..000000000
--- a/client/src/assets/Images/background-grid.svg
+++ /dev/null
@@ -1,67 +0,0 @@
-
diff --git a/client/src/assets/Images/create-placeholder-dark.svg b/client/src/assets/Images/create-placeholder-dark.svg
deleted file mode 100644
index 2dd68750b..000000000
--- a/client/src/assets/Images/create-placeholder-dark.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-
diff --git a/client/src/assets/Images/create-placeholder.svg b/client/src/assets/Images/create-placeholder.svg
deleted file mode 100644
index bdd9ef945..000000000
--- a/client/src/assets/Images/create-placeholder.svg
+++ /dev/null
@@ -1,29 +0,0 @@
-
diff --git a/client/src/assets/Images/data_placeholder.svg b/client/src/assets/Images/data_placeholder.svg
deleted file mode 100644
index bf840b95f..000000000
--- a/client/src/assets/Images/data_placeholder.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
diff --git a/client/src/assets/Images/data_placeholder_dark.svg b/client/src/assets/Images/data_placeholder_dark.svg
deleted file mode 100644
index 7e2a811d5..000000000
--- a/client/src/assets/Images/data_placeholder_dark.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
diff --git a/client/src/assets/Images/jupiter_logo_banner_dark.svg b/client/src/assets/Images/jupiter_logo_banner_dark.svg
deleted file mode 100644
index 3d3e23b14..000000000
--- a/client/src/assets/Images/jupiter_logo_banner_dark.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-
diff --git a/client/src/assets/Images/jupiter_logo_banner_light.svg b/client/src/assets/Images/jupiter_logo_banner_light.svg
deleted file mode 100644
index 4744e0bcb..000000000
--- a/client/src/assets/Images/jupiter_logo_banner_light.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-
diff --git a/client/src/assets/Images/logo_placeholder.svg b/client/src/assets/Images/logo_placeholder.svg
deleted file mode 100644
index 82f307b2d..000000000
--- a/client/src/assets/Images/logo_placeholder.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
\ No newline at end of file
diff --git a/client/src/assets/Images/solana_logo_banner_dark.svg b/client/src/assets/Images/solana_logo_banner_dark.svg
deleted file mode 100644
index 08ec87cb1..000000000
--- a/client/src/assets/Images/solana_logo_banner_dark.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-
diff --git a/client/src/assets/Images/solana_logo_banner_light.svg b/client/src/assets/Images/solana_logo_banner_light.svg
deleted file mode 100644
index 774018a6a..000000000
--- a/client/src/assets/Images/solana_logo_banner_light.svg
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
\ No newline at end of file
diff --git a/client/src/assets/icons/discord-icon.svg b/client/src/assets/icons/discord-icon.svg
deleted file mode 100644
index c03e8e127..000000000
--- a/client/src/assets/icons/discord-icon.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/client/src/assets/icons/slack-icon.svg b/client/src/assets/icons/slack-icon.svg
deleted file mode 100644
index ff256fd4d..000000000
--- a/client/src/assets/icons/slack-icon.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/client/src/assets/icons/upt_logo.png b/client/src/assets/icons/upt_logo.png
deleted file mode 100644
index d443d0897..000000000
Binary files a/client/src/assets/icons/upt_logo.png and /dev/null differ
diff --git a/client/src/assets/icons/zapier-icon.svg b/client/src/assets/icons/zapier-icon.svg
deleted file mode 100644
index 6ee0b5eca..000000000
--- a/client/src/assets/icons/zapier-icon.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/server/src/config/controllers.ts b/server/src/config/controllers.ts
index 7a20ed93c..8a83a0f63 100644
--- a/server/src/config/controllers.ts
+++ b/server/src/config/controllers.ts
@@ -30,7 +30,7 @@ export const initializeControllers = (services: InitializedServices): Initialize
return {
authController: new AuthController(services.userService),
monitorController: new MonitorController(services.monitorService),
- settingsController: new SettingsController(services.settingsService, services.emailService, services.db),
+ settingsController: new SettingsController(services.settingsService, services.emailService),
checkController: new CheckController(services.checkService),
inviteController: new InviteController(services.inviteService),
maintenanceWindowController: new MaintenanceWindowController(services.maintenanceWindowService),
diff --git a/server/src/config/services.ts b/server/src/config/services.ts
index 9bf18ff1d..f88bc2584 100644
--- a/server/src/config/services.ts
+++ b/server/src/config/services.ts
@@ -41,18 +41,6 @@ import crypto from "crypto";
import { games, GameDig } from "gamedig";
import jmespath from "jmespath";
-// DB Modules
-import { GenerateAvatarImage } from "../utils/imageProcessing.js";
-import { ParseBoolean } from "../utils/utils.js";
-
-// Models
-import InviteToken from "../db/models/Invite.js";
-import Team from "../db/models/Team.js";
-import MaintenanceWindow from "../db/models/MaintenanceWindow.js";
-import MonitorStats from "../db/models/MonitorStats.js";
-import NotificationModel from "../db/models/Notification.js";
-import RecoveryToken from "../db/models/RecoveryToken.js";
-
// repositories
import {
MongoMonitorsRepository,
@@ -176,7 +164,7 @@ export const initializeServices = async ({
const bufferService = new BufferService({ logger, checkService, settingsService });
- const statusService = new StatusService({ logger, buffer: bufferService, monitorsRepository });
+ const statusService = new StatusService(logger, bufferService, monitorsRepository, monitorStatsRepository, checksRepository);
const webhookProvider = new WebhookProvider(logger);
const slackProvider = new SlackProvider(logger);
diff --git a/server/src/controllers/settingsController.ts b/server/src/controllers/settingsController.ts
index 0a01daa0c..3cbfd3f6d 100644
--- a/server/src/controllers/settingsController.ts
+++ b/server/src/controllers/settingsController.ts
@@ -8,11 +8,9 @@ class SettingsController {
static SERVICE_NAME = SERVICE_NAME;
private settingsService: any;
private emailService: any;
- private db: any;
- constructor(settingsService: any, emailService: any, db: any) {
+ constructor(settingsService: any, emailService: any) {
this.settingsService = settingsService;
this.emailService = emailService;
- this.db = db;
}
get serviceName() {
diff --git a/server/src/repositories/checks/IChecksRepository.ts b/server/src/repositories/checks/IChecksRepository.ts
index 74def03c2..b75b18f13 100644
--- a/server/src/repositories/checks/IChecksRepository.ts
+++ b/server/src/repositories/checks/IChecksRepository.ts
@@ -11,6 +11,7 @@ import type { LatestChecksMap } from "@/repositories/checks/MongoChecksRepistory
export interface IChecksRepository {
// create
+ create(check: Check): Promise;
createChecks(checks: Check[]): Promise;
// single fetch
diff --git a/server/src/repositories/checks/MongoChecksRepistory.ts b/server/src/repositories/checks/MongoChecksRepistory.ts
index a36788e2c..c9cdbffd6 100644
--- a/server/src/repositories/checks/MongoChecksRepistory.ts
+++ b/server/src/repositories/checks/MongoChecksRepistory.ts
@@ -227,6 +227,11 @@ class MongoChecksRepository implements IChecksRepository {
} as unknown as CheckDocument;
};
+ create = async (check: Check) => {
+ const savedCheck = await CheckModel.create(check);
+ return this.toEntity(savedCheck);
+ };
+
createChecks = async (checks: Check[]) => {
const docs = checks.map((check) => this.toDocument(check));
const inserted = await CheckModel.insertMany(docs);
diff --git a/server/src/repositories/monitor-stats/IMonitorStatsRepository.ts b/server/src/repositories/monitor-stats/IMonitorStatsRepository.ts
index 08309b4ee..c718e7eb3 100644
--- a/server/src/repositories/monitor-stats/IMonitorStatsRepository.ts
+++ b/server/src/repositories/monitor-stats/IMonitorStatsRepository.ts
@@ -1,6 +1,7 @@
import type { MonitorStats } from "@/types/index.js";
export interface IMonitorStatsRepository {
// create
+ create(data: Omit): Promise;
// single fetch
findByMonitorId(monitorId: string): Promise;
// update
diff --git a/server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts b/server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts
index 52dbe8aa5..7211c7d89 100644
--- a/server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts
+++ b/server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts
@@ -32,6 +32,11 @@ class MongoMonitorStatsRepository implements IMonitorStatsRepository {
};
};
+ create = async (data: Omit): Promise => {
+ const created = await MonitorStatsModel.create(data);
+ return this.toEntity(created);
+ };
+
findByMonitorId = async (monitorId: string): Promise => {
const monitorStats = await MonitorStatsModel.findOne({ monitorId: new mongoose.Types.ObjectId(monitorId) });
if (!monitorStats) {
diff --git a/server/src/service/infrastructure/bufferService.ts b/server/src/service/infrastructure/bufferService.ts
index 461001800..415c22281 100755
--- a/server/src/service/infrastructure/bufferService.ts
+++ b/server/src/service/infrastructure/bufferService.ts
@@ -2,7 +2,14 @@ import type { Check } from "@/types/index.js";
const SERVICE_NAME = "BufferService";
-class BufferService {
+export interface IBufferService {
+ addToBuffer(check: Check): void;
+ removeCheckFromBuffer(check: Check): boolean;
+ scheduleNextFlush(): void;
+ flushBuffer(): Promise;
+}
+
+class BufferService implements IBufferService {
static SERVICE_NAME = SERVICE_NAME;
private BUFFER_TIMEOUT: number;
private logger: any;
@@ -13,7 +20,6 @@ class BufferService {
constructor({ logger, checkService, settingsService }: { logger: any; checkService: any; settingsService: any }) {
this.BUFFER_TIMEOUT = settingsService.getSettings().nodeEnv === "development" ? 10 : 1000 * 60 * 1; // 1 minute
- console.log(this.BUFFER_TIMEOUT);
this.logger = logger;
this.checksService = checkService;
this.SERVICE_NAME = SERVICE_NAME;
@@ -30,7 +36,7 @@ class BufferService {
return BufferService.SERVICE_NAME;
}
- addToBuffer({ check }: { check: Check }) {
+ addToBuffer(check: Check) {
try {
this.buffer.push(check);
} catch (error: any) {
diff --git a/server/src/service/infrastructure/statusService.ts b/server/src/service/infrastructure/statusService.ts
index 284fd3ff7..de8fb9963 100755
--- a/server/src/service/infrastructure/statusService.ts
+++ b/server/src/service/infrastructure/statusService.ts
@@ -1,6 +1,4 @@
-import { IMonitorsRepository } from "@/repositories/index.js";
-import MonitorStats from "../../db/models/MonitorStats.js";
-import { CheckModel } from "@/db/models/index.js";
+import { IChecksRepository, IMonitorsRepository, IMonitorStatsRepository } from "@/repositories/index.js";
import type {
Monitor,
MonitorStatus,
@@ -10,7 +8,9 @@ import type {
HardwareStatusPayload,
PageSpeedStatusPayload,
CheckSnapshot,
+ MonitorStats,
} from "@/types/index.js";
+import { ILogger } from "@/utils/logger.js";
const SERVICE_NAME = "StatusService";
export interface IStatusService {
@@ -27,11 +27,21 @@ export class StatusService implements IStatusService {
private logger: any;
private buffer: any;
private monitorsRepository: IMonitorsRepository;
+ private monitorStatsRepository: IMonitorStatsRepository;
+ private checksRepository: IChecksRepository;
- constructor({ logger, buffer, monitorsRepository }: { logger: any; buffer: any; monitorsRepository: IMonitorsRepository }) {
+ constructor(
+ logger: ILogger,
+ buffer: any,
+ monitorsRepository: IMonitorsRepository,
+ monitorStatsRepository: IMonitorStatsRepository,
+ checksRepository: IChecksRepository
+ ) {
this.logger = logger;
this.buffer = buffer;
this.monitorsRepository = monitorsRepository;
+ this.monitorStatsRepository = monitorStatsRepository;
+ this.checksRepository = checksRepository;
}
get serviceName() {
@@ -42,18 +52,18 @@ export class StatusService implements IStatusService {
try {
const monitorId = monitor.id;
const { responseTime, status } = networkResponse;
- // Get stats
- let stats = await MonitorStats.findOne({ monitorId });
+ let stats: Omit = await this.monitorStatsRepository.findByMonitorId(monitorId);
if (!stats) {
- stats = new MonitorStats({
+ stats = {
monitorId,
avgResponseTime: 0,
totalChecks: 0,
totalUpChecks: 0,
totalDownChecks: 0,
uptimePercentage: 0,
- lastCheck: null,
- });
+ lastResponseTime: 0,
+ lastCheckTimestamp: 0,
+ };
}
// Update stats
@@ -96,8 +106,7 @@ export class StatusService implements IStatusService {
// latest check
stats.lastCheckTimestamp = new Date().getTime();
-
- await stats.save();
+ await this.monitorStatsRepository.create(stats);
return true;
} catch (error: any) {
this.logger.error({
@@ -112,11 +121,10 @@ export class StatusService implements IStatusService {
handleIncidentForCheck = async (check: Check, monitor: Monitor, action: any, errorContext = "incident handling") => {
try {
- let savedCheck;
+ let savedCheck: Check | null = null;
if (!check.id) {
try {
- const checkModel = new CheckModel(check);
- savedCheck = await checkModel.save();
+ savedCheck = await this.checksRepository.create(check);
this.buffer.removeCheckFromBuffer(check);
} catch (checkError: any) {