mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-06-19 18:56:48 +02:00
modularized with a heartbeat range util
This commit is contained in:
parent
ebd47f1a45
commit
2c6d410c60
3 changed files with 52 additions and 31 deletions
|
@ -3,6 +3,7 @@ const apicache = require("../modules/apicache");
|
||||||
const { UptimeKumaServer } = require("../uptime-kuma-server");
|
const { UptimeKumaServer } = require("../uptime-kuma-server");
|
||||||
const StatusPage = require("../model/status_page");
|
const StatusPage = require("../model/status_page");
|
||||||
const { allowDevAllOrigin, sendHttpError } = require("../util-server");
|
const { allowDevAllOrigin, sendHttpError } = require("../util-server");
|
||||||
|
const { rangeToDatabaseDate } = require("../util/heartbeat-range");
|
||||||
const { R } = require("redbean-node");
|
const { R } = require("redbean-node");
|
||||||
const { badgeConstants } = require("../../src/util");
|
const { badgeConstants } = require("../../src/util");
|
||||||
const { makeBadge } = require("badge-maker");
|
const { makeBadge } = require("badge-maker");
|
||||||
|
@ -89,28 +90,7 @@ router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (reques
|
||||||
let heartbeatRange = statusPage ? statusPage.heartbeat_bar_range : "auto";
|
let heartbeatRange = statusPage ? statusPage.heartbeat_bar_range : "auto";
|
||||||
|
|
||||||
// Calculate the date range for heartbeats based on range setting
|
// Calculate the date range for heartbeats based on range setting
|
||||||
let dateFrom = null;
|
let dateFrom = rangeToDatabaseDate(heartbeatRange);
|
||||||
if (heartbeatRange === "auto") {
|
|
||||||
// Auto mode: limit to last 100 beats (original behavior)
|
|
||||||
dateFrom = null;
|
|
||||||
} else if (heartbeatRange.endsWith("h")) {
|
|
||||||
// Hours
|
|
||||||
let hours = parseInt(heartbeatRange);
|
|
||||||
let date = new Date();
|
|
||||||
date.setHours(date.getHours() - hours);
|
|
||||||
dateFrom = date.toISOString().slice(0, 19).replace('T', ' ');
|
|
||||||
} else if (heartbeatRange.endsWith("d")) {
|
|
||||||
// Days
|
|
||||||
let days = parseInt(heartbeatRange);
|
|
||||||
let date = new Date();
|
|
||||||
date.setDate(date.getDate() - days);
|
|
||||||
dateFrom = date.toISOString().slice(0, 19).replace('T', ' ');
|
|
||||||
} else {
|
|
||||||
// Fallback to 90 days
|
|
||||||
let date = new Date();
|
|
||||||
date.setDate(date.getDate() - 90);
|
|
||||||
dateFrom = date.toISOString().slice(0, 19).replace('T', ' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let monitorID of monitorIDList) {
|
for (let monitorID of monitorIDList) {
|
||||||
let list;
|
let list;
|
||||||
|
|
44
server/util/heartbeat-range.js
Normal file
44
server/util/heartbeat-range.js
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/**
|
||||||
|
* Utility functions for heartbeat range handling
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse heartbeat range string and return hours
|
||||||
|
* @param {string} range - Range string like "6h", "7d", "auto"
|
||||||
|
* @returns {number|null} Hours or null for auto
|
||||||
|
*/
|
||||||
|
function parseRangeHours(range) {
|
||||||
|
if (!range || range === "auto") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (range.endsWith("h")) {
|
||||||
|
return parseInt(range);
|
||||||
|
} else if (range.endsWith("d")) {
|
||||||
|
return parseInt(range) * 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback
|
||||||
|
return 90 * 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert range to database-compatible date string
|
||||||
|
* @param {string} range - Range string like "6h", "7d", "auto"
|
||||||
|
* @returns {string|null} Date string or null for auto
|
||||||
|
*/
|
||||||
|
function rangeToDatabaseDate(range) {
|
||||||
|
const hours = parseRangeHours(range);
|
||||||
|
if (hours === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const date = new Date();
|
||||||
|
date.setHours(date.getHours() - hours);
|
||||||
|
return date.toISOString().slice(0, 19).replace('T', ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
parseRangeHours,
|
||||||
|
rangeToDatabaseDate
|
||||||
|
};
|
|
@ -137,22 +137,19 @@ export default {
|
||||||
const buckets = [];
|
const buckets = [];
|
||||||
|
|
||||||
// Parse the range to get total time and determine bucket size
|
// Parse the range to get total time and determine bucket size
|
||||||
|
// Parse range to get total hours
|
||||||
let totalHours;
|
let totalHours;
|
||||||
let bucketSize; // in hours
|
|
||||||
let totalBuckets = this.maxBeat || 50; // Use maxBeat to determine bucket count
|
|
||||||
|
|
||||||
if (this.heartbeatBarRange.endsWith("h")) {
|
if (this.heartbeatBarRange.endsWith("h")) {
|
||||||
totalHours = parseInt(this.heartbeatBarRange);
|
totalHours = parseInt(this.heartbeatBarRange);
|
||||||
} else if (this.heartbeatBarRange.endsWith("d")) {
|
} else if (this.heartbeatBarRange.endsWith("d")) {
|
||||||
const days = parseInt(this.heartbeatBarRange);
|
totalHours = parseInt(this.heartbeatBarRange) * 24;
|
||||||
totalHours = days * 24;
|
|
||||||
} else {
|
} else {
|
||||||
// Fallback
|
totalHours = 90 * 24; // Fallback
|
||||||
totalHours = 90 * 24;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate bucket size to fit the desired number of buckets
|
// Calculate bucket size and count
|
||||||
bucketSize = totalHours / totalBuckets;
|
const totalBuckets = this.maxBeat || 50;
|
||||||
|
const bucketSize = totalHours / totalBuckets;
|
||||||
|
|
||||||
// Create time buckets from oldest to newest
|
// Create time buckets from oldest to newest
|
||||||
const startTime = now.subtract(totalHours, "hours");
|
const startTime = now.subtract(totalHours, "hours");
|
||||||
|
|
Loading…
Add table
Reference in a new issue