Merge pull request #2414 from bluewave-labs/feat/fe/uptime-notification-channels

feat: fe/uptime notification channels, resolves #2344
This commit is contained in:
Alexander Holliday authored and GitHub committed 2025-06-10 09:24:56 +08:00
commit f41709bd12
25 files changed
+1509 -1018

No files matched your search

+1 -39
View File
@@ -219,19 +219,8 @@ class MonitorController {
}
try {
const notifications = req.body.notifications;
const monitor = await this.db.createMonitor(req, res);
if (notifications && notifications.length > 0) {
monitor.notifications = await Promise.all(
notifications.map(async (notification) => {
notification.monitorId = monitor._id;
return await this.db.createNotification(notification);
})
);
}
await monitor.save();
// Add monitor to job queue
this.jobQueue.addJob(monitor._id, monitor);
return res.success({
@@ -325,18 +314,6 @@ class MonitorController {
await Promise.all(
monitors.map(async (monitor, index) => {
const notifications = enrichedData[index].notifications;
if (notifications?.length) {
monitor.notifications = await Promise.all(
notifications.map(async (notification) => {
notification.monitorId = monitor._id;
return await this.db.createNotification(notification);
})
);
await monitor.save();
}
this.jobQueue.addJob(monitor._id, monitor);
})
);
@@ -422,10 +399,7 @@ class MonitorController {
name: "deletePageSpeedChecks",
fn: () => this.db.deletePageSpeedChecksByMonitorId(monitor._id),
},
{
name: "deleteNotifications",
fn: () => this.db.deleteNotificationsByMonitorId(monitor._id),
},
{
name: "deleteHardwareChecks",
fn: () => this.db.deleteHardwareChecksByMonitorId(monitor._id),
@@ -530,21 +504,9 @@ class MonitorController {
try {
const { monitorId } = req.params;
const monitorBeforeEdit = await this.db.getMonitorById(monitorId);
// Get notifications from the request body
const notifications = req.body.notifications ?? [];
const editedMonitor = await this.db.editMonitor(monitorId, req.body);
await this.db.deleteNotificationsByMonitorId(editedMonitor._id);
await Promise.all(
notifications.map(async (notification) => {
notification.monitorId = editedMonitor._id;
await this.db.createNotification(notification);
})
);
await this.jobQueue.updateJob(editedMonitor);
return res.success({
+1 -1
View File
@@ -42,7 +42,7 @@ const MonitorSchema = mongoose.Schema(
},
matchMethod: {
type: String,
enum: ["equal", "include", "regex"],
enum: ["equal", "include", "regex", ""],
},
url: {
type: String,
+1 -1
View File
@@ -7,7 +7,7 @@ const configSchema = mongoose.Schema(
chatId: { type: String },
platform: {
type: String,
enum: ["slack", "pager_duty"],
enum: ["slack", "pager_duty", "webhook"],
},
routingKey: { type: String },
},
+2 -14
View File
@@ -500,14 +500,6 @@ const getMonitorById = async (monitorId) => {
error.status = 404;
throw error;
}
// Get notifications
const notifications = await Notification.find({
monitorId: monitorId,
});
// Update monitor with notifications and save
monitor.notifications = notifications;
await monitor.save();
return monitor;
} catch (error) {
@@ -664,10 +656,8 @@ const getMonitorsWithChecksByTeamId = async (req) => {
const createMonitor = async (req, res) => {
try {
const monitor = new Monitor({ ...req.body });
// Remove notifications fom monitor as they aren't needed here
monitor.notifications = undefined;
await monitor.save();
return monitor;
const saved = await monitor.save();
return saved;
} catch (error) {
error.service = SERVICE_NAME;
error.method = "createMonitor";
@@ -764,8 +754,6 @@ const deleteMonitorsByUserId = async (userId) => {
* @throws {Error}
*/
const editMonitor = async (candidateId, candidateMonitor) => {
candidateMonitor.notifications = undefined;
try {
const editedMonitor = await Monitor.findByIdAndUpdate(candidateId, candidateMonitor, {
new: true,
@@ -148,6 +148,7 @@ const buildUptimeDetailsPipeline = (monitorId, dates, dateString) => {
type: 1,
url: 1,
isActive: 1,
notifications: 1,
},
},
],
+2 -2
View File
@@ -1,5 +1,5 @@
const SERVICE_NAME = "BufferService";
const BUFFER_TIMEOUT = 1000 * 60 * 1; // 1 minute
const BUFFER_TIMEOUT = process.env.NODE_ENV === "development" ? 5000 : 1000 * 60 * 1; // 1 minute
const TYPE_MAP = {
http: "checks",
ping: "checks",
@@ -89,7 +89,7 @@ class BufferService {
}
this.buffers[bufferName] = [];
}
this.logger.info({
this.logger.debug({
message: `Flushed ${items} items`,
service: this.SERVICE_NAME,
method: "flushBuffers",
+3 -3
View File
@@ -183,7 +183,7 @@ const createMonitorBodyValidation = joi.object({
usage_disk: joi.number(),
usage_temperature: joi.number(),
}),
notifications: joi.array().items(joi.object()),
notifications: joi.array().items(joi.string()),
secret: joi.string(),
jsonPath: joi.string().allow(""),
expectedValue: joi.string().allow(""),
@@ -196,12 +196,12 @@ const editMonitorBodyValidation = joi.object({
name: joi.string(),
description: joi.string(),
interval: joi.number(),
notifications: joi.array().items(joi.object()),
notifications: joi.array().items(joi.string()),
secret: joi.string(),
ignoreTlsErrors: joi.boolean(),
jsonPath: joi.string().allow(""),
expectedValue: joi.string().allow(""),
matchMethod: joi.string(),
matchMethod: joi.string().allow(null, ""),
port: joi.number().min(1).max(65535),
thresholds: joi.object().keys({
usage_cpu: joi.number(),