Fix uptime & ping badge duration (#4850)

This commit is contained in:
Frank Elsinga 2024-07-05 00:12:37 +02:00 committed by GitHub
commit 1a5a1a6e5d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 36 additions and 18 deletions

View file

@ -232,8 +232,8 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
let requestedDuration = request.params.duration !== undefined ? request.params.duration : "24h"; let requestedDuration = request.params.duration !== undefined ? request.params.duration : "24h";
const overrideValue = value && parseFloat(value); const overrideValue = value && parseFloat(value);
if (requestedDuration === "24") { if (/^[0-9]+$/.test(requestedDuration)) {
requestedDuration = "24h"; requestedDuration = `${requestedDuration}h`;
} }
let publicMonitor = await R.getRow(` let publicMonitor = await R.getRow(`
@ -265,7 +265,7 @@ router.get("/api/badge/:id/uptime/:duration?", cache("5 minutes"), async (reques
// build a label string. If a custom label is given, override the default one (requestedDuration) // build a label string. If a custom label is given, override the default one (requestedDuration)
badgeValues.label = filterAndJoin([ badgeValues.label = filterAndJoin([
labelPrefix, labelPrefix,
label ?? `Uptime (${requestedDuration}${labelSuffix})`, label ?? `Uptime (${requestedDuration.slice(0, -1)}${labelSuffix})`,
]); ]);
badgeValues.message = filterAndJoin([ prefix, cleanUptime, suffix ]); badgeValues.message = filterAndJoin([ prefix, cleanUptime, suffix ]);
} }
@ -302,8 +302,8 @@ router.get("/api/badge/:id/ping/:duration?", cache("5 minutes"), async (request,
let requestedDuration = request.params.duration !== undefined ? request.params.duration : "24h"; let requestedDuration = request.params.duration !== undefined ? request.params.duration : "24h";
const overrideValue = value && parseFloat(value); const overrideValue = value && parseFloat(value);
if (requestedDuration === "24") { if (/^[0-9]+$/.test(requestedDuration)) {
requestedDuration = "24h"; requestedDuration = `${requestedDuration}h`;
} }
// Check if monitor is public // Check if monitor is public
@ -325,7 +325,7 @@ router.get("/api/badge/:id/ping/:duration?", cache("5 minutes"), async (request,
// use a given, custom labelColor or use the default badge label color (defined by badge-maker) // use a given, custom labelColor or use the default badge label color (defined by badge-maker)
badgeValues.labelColor = labelColor ?? ""; badgeValues.labelColor = labelColor ?? "";
// build a lable string. If a custom label is given, override the default one (requestedDuration) // build a lable string. If a custom label is given, override the default one (requestedDuration)
badgeValues.label = filterAndJoin([ labelPrefix, label ?? `Avg. Ping (${requestedDuration}${labelSuffix})` ]); badgeValues.label = filterAndJoin([ labelPrefix, label ?? `Avg. Ping (${requestedDuration.slice(0, -1)}${labelSuffix})` ]);
badgeValues.message = filterAndJoin([ prefix, avgPing, suffix ]); badgeValues.message = filterAndJoin([ prefix, avgPing, suffix ]);
} }

View file

@ -543,7 +543,9 @@ class UptimeCalculator {
if (type === "minute" && num > 24 * 60) { if (type === "minute" && num > 24 * 60) {
throw new Error("The maximum number of minutes is 1440"); throw new Error("The maximum number of minutes is 1440");
} }
if (type === "day" && num > 365) {
throw new Error("The maximum number of days is 365");
}
// Get the current time period key based on the type // Get the current time period key based on the type
let key = this.getKey(this.getCurrentDate(), type); let key = this.getKey(this.getCurrentDate(), type);
@ -741,20 +743,36 @@ class UptimeCalculator {
} }
/** /**
* Get the uptime data by duration * Get the uptime data for given duration.
* @param {'24h'|'30d'|'1y'} duration Only accept 24h, 30d, 1y * @param {string} duration A string with a number and a unit (m,h,d,w,M,y), such as 24h, 30d, 1y.
* @returns {UptimeDataResult} UptimeDataResult * @returns {UptimeDataResult} UptimeDataResult
* @throws {Error} Invalid duration * @throws {Error} Invalid duration / Unsupported unit
*/ */
getDataByDuration(duration) { getDataByDuration(duration) {
if (duration === "24h") { const durationNumStr = duration.slice(0, -1);
return this.get24Hour();
} else if (duration === "30d") { if (!/^[0-9]+$/.test(durationNumStr)) {
return this.get30Day(); throw new Error(`Invalid duration: ${duration}`);
} else if (duration === "1y") { }
return this.get1Year(); const num = Number(durationNumStr);
} else { const unit = duration.slice(-1);
throw new Error("Invalid duration");
switch (unit) {
case "m":
return this.getData(num, "minute");
case "h":
return this.getData(num, "hour");
case "d":
return this.getData(num, "day");
case "w":
return this.getData(7 * num, "day");
case "M":
return this.getData(30 * num, "day");
case "y":
return this.getData(365 * num, "day");
default:
throw new Error(`Unsupported unit (${unit}) for badge duration ${duration}`
);
} }
} }