2022-01-23 14:22:00 +00:00
|
|
|
const dayjs = require("dayjs");
|
|
|
|
const utc = require("dayjs/plugin/utc");
|
|
|
|
let timezone = require("dayjs/plugin/timezone");
|
|
|
|
dayjs.extend(utc);
|
|
|
|
dayjs.extend(timezone);
|
|
|
|
const { BeanModel } = require("redbean-node/dist/bean-model");
|
2022-09-25 11:38:28 +00:00
|
|
|
const { parseTimeObject, parseTimeFromTimeObject } = require("../../src/util");
|
2022-09-24 11:18:24 +00:00
|
|
|
const { isArray } = require("chart.js/helpers");
|
2022-09-25 11:38:28 +00:00
|
|
|
const { timeObjectToUTC, timeObjectToLocal } = require("../util-server");
|
2022-01-23 14:22:00 +00:00
|
|
|
|
|
|
|
class Maintenance extends BeanModel {
|
|
|
|
|
|
|
|
/**
|
2022-04-30 13:50:05 +00:00
|
|
|
* Return an object that ready to parse to JSON for public
|
2022-01-23 14:22:00 +00:00
|
|
|
* Only show necessary data to public
|
2022-09-25 11:38:28 +00:00
|
|
|
* @param {string} timezone If not specified, the timeRange will be in UTC
|
2022-04-30 13:50:05 +00:00
|
|
|
* @returns {Object}
|
2022-01-23 14:22:00 +00:00
|
|
|
*/
|
2022-09-25 11:38:28 +00:00
|
|
|
async toPublicJSON(timezone = null) {
|
2022-09-24 11:18:24 +00:00
|
|
|
|
|
|
|
let dateTimeRange = [];
|
|
|
|
if (this.start_datetime) {
|
|
|
|
dateTimeRange.push( this.start_datetime);
|
|
|
|
if (this.end_datetime) {
|
|
|
|
dateTimeRange.push( this.end_datetime);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let dateRange = [];
|
|
|
|
if (this.start_date) {
|
|
|
|
dateRange.push( this.start_date);
|
|
|
|
if (this.end_date) {
|
|
|
|
dateRange.push( this.end_date);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let timeRange = [];
|
2022-09-25 11:38:28 +00:00
|
|
|
let startTime = parseTimeObject(this.start_time);
|
2022-09-24 11:18:24 +00:00
|
|
|
timeRange.push(startTime);
|
2022-09-25 11:38:28 +00:00
|
|
|
let endTime = parseTimeObject(this.end_time);
|
2022-09-24 11:18:24 +00:00
|
|
|
timeRange.push(endTime);
|
|
|
|
|
2022-09-25 11:38:28 +00:00
|
|
|
// Apply timezone offset
|
|
|
|
if (timezone) {
|
|
|
|
if (this.start_time) {
|
|
|
|
timeObjectToLocal(startTime, timezone);
|
|
|
|
}
|
|
|
|
if (this.end_time) {
|
|
|
|
timeObjectToLocal(endTime, timezone);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-24 11:18:24 +00:00
|
|
|
let obj = {
|
2022-01-23 14:22:00 +00:00
|
|
|
id: this.id,
|
|
|
|
title: this.title,
|
|
|
|
description: this.description,
|
2022-09-23 18:33:29 +00:00
|
|
|
strategy: this.strategy,
|
2022-09-24 11:18:24 +00:00
|
|
|
intervalDay: this.interval_day,
|
2022-09-23 18:33:29 +00:00
|
|
|
active: !!this.active,
|
2022-09-24 11:18:24 +00:00
|
|
|
dateTimeRange: dateTimeRange,
|
|
|
|
dateRange: dateRange,
|
|
|
|
timeRange: timeRange,
|
|
|
|
weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [],
|
|
|
|
daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [],
|
2022-01-23 14:22:00 +00:00
|
|
|
};
|
2022-09-24 11:18:24 +00:00
|
|
|
|
|
|
|
if (!isArray(obj.weekdays)) {
|
|
|
|
obj.weekdays = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!isArray(obj.daysOfMonth)) {
|
|
|
|
obj.daysOfMonth = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
return obj;
|
2022-01-23 14:22:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2022-04-30 13:50:05 +00:00
|
|
|
* Return an object that ready to parse to JSON
|
2022-09-25 11:38:28 +00:00
|
|
|
* @param {string} timezone If not specified, the timeRange will be in UTC
|
2022-04-30 13:50:05 +00:00
|
|
|
* @returns {Object}
|
2022-01-23 14:22:00 +00:00
|
|
|
*/
|
2022-09-25 11:38:28 +00:00
|
|
|
async toJSON(timezone = null) {
|
|
|
|
return this.toPublicJSON(timezone);
|
2022-01-23 14:22:00 +00:00
|
|
|
}
|
2022-09-24 11:18:24 +00:00
|
|
|
|
2022-09-25 11:38:28 +00:00
|
|
|
static jsonToBean(bean, obj, timezone) {
|
2022-09-24 11:18:24 +00:00
|
|
|
if (obj.id) {
|
|
|
|
bean.id = obj.id;
|
|
|
|
}
|
|
|
|
|
2022-09-25 11:38:28 +00:00
|
|
|
// 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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-24 11:18:24 +00:00
|
|
|
bean.title = obj.title;
|
|
|
|
bean.description = obj.description;
|
|
|
|
bean.strategy = obj.strategy;
|
|
|
|
bean.interval_day = obj.intervalDay;
|
|
|
|
bean.active = obj.active;
|
|
|
|
|
|
|
|
if (obj.dateRange[0]) {
|
|
|
|
bean.start_date = obj.dateRange[0];
|
|
|
|
|
|
|
|
if (obj.dateRange[1]) {
|
|
|
|
bean.end_date = obj.dateRange[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (obj.dateTimeRange[0]) {
|
|
|
|
bean.start_datetime = obj.dateTimeRange[0];
|
|
|
|
|
|
|
|
if (obj.dateTimeRange[1]) {
|
|
|
|
bean.end_datetime = obj.dateTimeRange[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-25 11:38:28 +00:00
|
|
|
bean.start_time = parseTimeFromTimeObject(obj.timeRange[0]);
|
|
|
|
bean.end_time = parseTimeFromTimeObject(obj.timeRange[1]);
|
2022-09-24 11:18:24 +00:00
|
|
|
|
|
|
|
bean.weekdays = JSON.stringify(obj.weekdays);
|
|
|
|
bean.days_of_month = JSON.stringify(obj.daysOfMonth);
|
|
|
|
|
|
|
|
return bean;
|
|
|
|
}
|
2022-01-23 14:22:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = Maintenance;
|