mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-08-08 08:28:48 +08:00
[WIP] Handle timezone offset for timeRange
This commit is contained in:
@@ -4,17 +4,19 @@ let timezone = require("dayjs/plugin/timezone");
|
||||
dayjs.extend(utc);
|
||||
dayjs.extend(timezone);
|
||||
const { BeanModel } = require("redbean-node/dist/bean-model");
|
||||
const { parseVueDatePickerTimeFormat, parseTimeFormatFromVueDatePicker } = require("../../src/util");
|
||||
const { parseTimeObject, parseTimeFromTimeObject } = require("../../src/util");
|
||||
const { isArray } = require("chart.js/helpers");
|
||||
const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
|
||||
|
||||
class Maintenance extends BeanModel {
|
||||
|
||||
/**
|
||||
* Return an object that ready to parse to JSON for public
|
||||
* Only show necessary data to public
|
||||
* @param {string} timezone If not specified, the timeRange will be in UTC
|
||||
* @returns {Object}
|
||||
*/
|
||||
async toPublicJSON() {
|
||||
async toPublicJSON(timezone = null) {
|
||||
|
||||
let dateTimeRange = [];
|
||||
if (this.start_datetime) {
|
||||
@@ -33,11 +35,21 @@ class Maintenance extends BeanModel {
|
||||
}
|
||||
|
||||
let timeRange = [];
|
||||
let startTime = parseVueDatePickerTimeFormat(this.start_time);
|
||||
let startTime = parseTimeObject(this.start_time);
|
||||
timeRange.push(startTime);
|
||||
let endTime = parseVueDatePickerTimeFormat(this.end_time);
|
||||
let endTime = parseTimeObject(this.end_time);
|
||||
timeRange.push(endTime);
|
||||
|
||||
// Apply timezone offset
|
||||
if (timezone) {
|
||||
if (this.start_time) {
|
||||
timeObjectToLocal(startTime, timezone);
|
||||
}
|
||||
if (this.end_time) {
|
||||
timeObjectToLocal(endTime, timezone);
|
||||
}
|
||||
}
|
||||
|
||||
let obj = {
|
||||
id: this.id,
|
||||
title: this.title,
|
||||
@@ -65,17 +77,28 @@ class Maintenance extends BeanModel {
|
||||
|
||||
/**
|
||||
* Return an object that ready to parse to JSON
|
||||
* @param {string} timezone If not specified, the timeRange will be in UTC
|
||||
* @returns {Object}
|
||||
*/
|
||||
async toJSON() {
|
||||
return this.toPublicJSON();
|
||||
async toJSON(timezone = null) {
|
||||
return this.toPublicJSON(timezone);
|
||||
}
|
||||
|
||||
static jsonToBean(bean, obj) {
|
||||
static jsonToBean(bean, obj, timezone) {
|
||||
if (obj.id) {
|
||||
bean.id = obj.id;
|
||||
}
|
||||
|
||||
// Apply timezone offset to timeRange, as it cannot apply automatically.
|
||||
if (timezone) {
|
||||
if (obj.timeRange[0]) {
|
||||
timeObjectToUTC(obj.timeRange[0], timezone);
|
||||
if (obj.timeRange[1]) {
|
||||
timeObjectToUTC(obj.timeRange[1], timezone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bean.title = obj.title;
|
||||
bean.description = obj.description;
|
||||
bean.strategy = obj.strategy;
|
||||
@@ -98,8 +121,8 @@ class Maintenance extends BeanModel {
|
||||
}
|
||||
}
|
||||
|
||||
bean.start_time = parseTimeFormatFromVueDatePicker(obj.timeRange[0]);
|
||||
bean.end_time = parseTimeFormatFromVueDatePicker(obj.timeRange[1]);
|
||||
bean.start_time = parseTimeFromTimeObject(obj.timeRange[0]);
|
||||
bean.end_time = parseTimeFromTimeObject(obj.timeRange[1]);
|
||||
|
||||
bean.weekdays = JSON.stringify(obj.weekdays);
|
||||
bean.days_of_month = JSON.stringify(obj.daysOfMonth);
|
||||
|
@@ -5,6 +5,11 @@ const apicache = require("../modules/apicache");
|
||||
const { UptimeKumaServer } = require("../uptime-kuma-server");
|
||||
const Maintenance = require("../model/maintenance");
|
||||
const server = UptimeKumaServer.getInstance();
|
||||
const dayjs = require("dayjs");
|
||||
const utc = require("dayjs/plugin/utc");
|
||||
let timezone = require("dayjs/plugin/timezone");
|
||||
dayjs.extend(utc);
|
||||
dayjs.extend(timezone);
|
||||
|
||||
/**
|
||||
* Handlers for Maintenance
|
||||
@@ -12,13 +17,13 @@ const server = UptimeKumaServer.getInstance();
|
||||
*/
|
||||
module.exports.maintenanceSocketHandler = (socket) => {
|
||||
// Add a new maintenance
|
||||
socket.on("addMaintenance", async (maintenance, callback) => {
|
||||
socket.on("addMaintenance", async (maintenance, timezone, callback) => {
|
||||
try {
|
||||
checkLogin(socket);
|
||||
|
||||
log.debug("maintenance", maintenance);
|
||||
|
||||
let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance);
|
||||
let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance, timezone);
|
||||
bean.user_id = socket.userID;
|
||||
let maintenanceID = await R.store(bean);
|
||||
|
||||
@@ -39,7 +44,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
|
||||
});
|
||||
|
||||
// Edit a maintenance
|
||||
socket.on("editMaintenance", async (maintenance, callback) => {
|
||||
socket.on("editMaintenance", async (maintenance, timezone, callback) => {
|
||||
try {
|
||||
checkLogin(socket);
|
||||
|
||||
@@ -49,7 +54,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
|
||||
throw new Error("Permission denied.");
|
||||
}
|
||||
|
||||
Maintenance.jsonToBean(bean, maintenance);
|
||||
Maintenance.jsonToBean(bean, maintenance, timezone);
|
||||
|
||||
await R.store(bean);
|
||||
|
||||
@@ -138,7 +143,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
|
||||
}
|
||||
});
|
||||
|
||||
socket.on("getMaintenance", async (maintenanceID, callback) => {
|
||||
socket.on("getMaintenance", async (maintenanceID, timezone, callback) => {
|
||||
try {
|
||||
checkLogin(socket);
|
||||
|
||||
@@ -151,7 +156,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
|
||||
|
||||
callback({
|
||||
ok: true,
|
||||
maintenance: await bean.toJSON(),
|
||||
maintenance: await bean.toJSON(timezone),
|
||||
});
|
||||
|
||||
} catch (e) {
|
||||
|
@@ -21,6 +21,11 @@ const {
|
||||
rfc2865: { file, attributes },
|
||||
},
|
||||
} = require("node-radius-utils");
|
||||
const dayjs = require("dayjs");
|
||||
const utc = require("dayjs/plugin/utc");
|
||||
let timezone = require("dayjs/plugin/timezone");
|
||||
dayjs.extend(utc);
|
||||
dayjs.extend(timezone);
|
||||
|
||||
// From ping-lite
|
||||
exports.WIN = /^win/.test(process.platform);
|
||||
@@ -645,3 +650,44 @@ module.exports.send403 = (res, msg = "") => {
|
||||
"msg": msg,
|
||||
});
|
||||
};
|
||||
|
||||
function timeObjectConvertTimezone(obj, timezone, timeObjectToUTC = true) {
|
||||
// e.g. +08:00
|
||||
let offsetString = dayjs().tz(timezone).format("Z");
|
||||
let hours = parseInt(offsetString.substring(1, 3));
|
||||
let minutes = parseInt(offsetString.substring(4, 6));
|
||||
|
||||
if (
|
||||
(timeObjectToUTC && offsetString.startsWith("+")) ||
|
||||
(!timeObjectToUTC && offsetString.startsWith("-"))
|
||||
) {
|
||||
hours *= -1;
|
||||
minutes *= -1;
|
||||
}
|
||||
|
||||
obj.hours += hours;
|
||||
obj.minutes += minutes;
|
||||
|
||||
// Handle out of bound
|
||||
if (obj.hours < 0) {
|
||||
obj.hours += 24;
|
||||
} else if (obj.hours > 24) {
|
||||
obj.hours -= 24;
|
||||
}
|
||||
|
||||
if (obj.minutes < 0) {
|
||||
obj.minutes += 24;
|
||||
} else if (obj.minutes > 24) {
|
||||
obj.minutes -= 24;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
module.exports.timeObjectToUTC = (obj, timezone) => {
|
||||
return timeObjectConvertTimezone(obj, timezone, true);
|
||||
};
|
||||
|
||||
module.exports.timeObjectToLocal = (obj, timezone) => {
|
||||
return timeObjectConvertTimezone(obj, timezone, false);
|
||||
};
|
||||
|
Reference in New Issue
Block a user