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) {