diff --git a/client/pages/config/backups.vue b/client/pages/config/backups.vue index 11c41fc3..bd713141 100644 --- a/client/pages/config/backups.vue +++ b/client/pages/config/backups.vue @@ -14,6 +14,12 @@ + +
@@ -41,6 +47,7 @@ export default { dailyBackups: true, backupsToKeep: 2, maxBackupSize: 1, + // cronExpression: '', newServerSettings: {} } }, @@ -64,6 +71,18 @@ export default { } }, methods: { + // changedCronExpression() { + // this.$axios + // .$post('/api/validate-cron', { expression: this.cronExpression }) + // .then(() => { + // console.log('Cron is valid') + // }) + // .catch((error) => { + // console.error('Cron validation failed', error) + // const msg = (error.response ? error.response.data : null) || 'Unknown cron validation error' + // this.$toast.error(msg) + // }) + // }, updateBackupsSettings() { if (isNaN(this.maxBackupSize) || this.maxBackupSize <= 0) { this.$toast.error('Invalid maximum backup size') @@ -99,6 +118,7 @@ export default { this.backupsToKeep = this.newServerSettings.backupsToKeep || 2 this.dailyBackups = !!this.newServerSettings.backupSchedule this.maxBackupSize = this.newServerSettings.maxBackupSize || 1 + // this.cronExpression = '30 1 * * *' } }, mounted() { diff --git a/server/controllers/MiscController.js b/server/controllers/MiscController.js index c760b7da..e179e14a 100644 --- a/server/controllers/MiscController.js +++ b/server/controllers/MiscController.js @@ -2,7 +2,7 @@ const Path = require('path') const fs = require('../libs/fsExtra') const Logger = require('../Logger') const filePerms = require('../utils/filePerms') - +const patternValidation = require('../libs/nodeCron/pattern-validation') const { isObject } = require('../utils/index') // @@ -263,5 +263,20 @@ class MiscController { }) res.json(tags) } + + validateCronExpression(req, res) { + const expression = req.body.expression + if (!expression) { + return res.sendStatus(400) + } + + try { + patternValidation(expression) + res.sendStatus(200) + } catch (error) { + Logger.warn(`[MiscController] Invalid cron expression ${expression}`, error.message) + res.status(400).send(error.message) + } + } } module.exports = new MiscController() \ No newline at end of file diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js index 69abeb62..c4bc0385 100644 --- a/server/routers/ApiRouter.js +++ b/server/routers/ApiRouter.js @@ -211,6 +211,7 @@ class ApiRouter { this.router.get('/search/authors', MiscController.findAuthor.bind(this)) this.router.get('/search/chapters', MiscController.findChapters.bind(this)) this.router.get('/tags', MiscController.getAllTags.bind(this)) + this.router.post('/validate-cron', MiscController.validateCronExpression.bind(this)) } async getDirectories(dir, relpath, excludedDirs, level = 0) {