Skip to content

Commit

Permalink
Merge pull request #329 from VoltrexMaster/patch-2
Browse files Browse the repository at this point in the history
pattern-validation: refactor
  • Loading branch information
merencia committed Jan 27, 2022
2 parents e089cc0 + cd2dc5b commit ecb1e0d
Showing 1 changed file with 118 additions and 81 deletions.
199 changes: 118 additions & 81 deletions src/pattern-validation.js
Expand Up @@ -2,86 +2,123 @@

const convertExpression = require('./convert-expression');


module.exports = ( () => {
function isValidExpression(expression, min, max){
const options = expression.split(',');
const regexValidation = /^\d+$|^\*$|^\*\/\d+$/;
for(let i = 0; i < options.length; i++){
const option = options[i];
const optionAsInt = parseInt(options[i], 10);
if(optionAsInt < min || optionAsInt > max || !regexValidation.test(option)) {
return false;
}
}
return true;
}

function isInvalidSecond(expression){
return !isValidExpression(expression, 0, 59);
}

function isInvalidMinute(expression){
return !isValidExpression(expression, 0, 59);
}

function isInvalidHour(expression){
return !isValidExpression(expression, 0, 23);
}

function isInvalidDayOfMonth(expression){
return !isValidExpression(expression, 1, 31);
}

function isInvalidMonth(expression){
return !isValidExpression(expression, 1, 12);
}

function isInvalidWeekDay(expression){
return !isValidExpression(expression, 0, 7);
}

function validateFields(patterns, executablePatterns){
if (isInvalidSecond(executablePatterns[0])) {
throw patterns[0] + ' is a invalid expression for second';
}

if (isInvalidMinute(executablePatterns[1])) {
throw patterns[1] + ' is a invalid expression for minute';
}

if (isInvalidHour(executablePatterns[2])) {
throw patterns[2] + ' is a invalid expression for hour';
}

if (isInvalidDayOfMonth(executablePatterns[3])) {
throw patterns[3] + ' is a invalid expression for day of month';
}

if (isInvalidMonth(executablePatterns[4])) {
throw patterns[4] + ' is a invalid expression for month';
}

if (isInvalidWeekDay(executablePatterns[5])) {
throw patterns[5] + ' is a invalid expression for week day';
}
}

function validate(pattern){
if (typeof pattern !== 'string'){
throw 'pattern must be a string!';
}

let patterns = pattern.split(' ');
const executablePattern = convertExpression(pattern);
const executablePatterns = executablePattern.split(' ');

if(patterns.length === 5){
patterns = ['0'].concat(patterns);
}

validateFields(patterns, executablePatterns);
const validationRegex = /^(?:\d+|\*|\*\/\d+)$/;

/**
* @param {string} expression The Cron-Job expression.
* @param {number} min The minimum value.
* @param {number} max The maximum value.
* @returns {boolean}
*/
function isValidExpression(expression, min, max) {
const options = expression.split(',');

for (const option of options) {
const optionAsInt = parseInt(option, 10);

if (
(!Number.isNaN(optionAsInt) &&
(optionAsInt < min || optionAsInt > max)) ||
!validationRegex.test(option)
)
return false;
}

return validate;
})();
return true;
}

/**
* @param {string} expression The Cron-Job expression.
* @returns {boolean}
*/
function isInvalidSecond(expression) {
return !isValidExpression(expression, 0, 59);
}

/**
* @param {string} expression The Cron-Job expression.
* @returns {boolean}
*/
function isInvalidMinute(expression) {
return !isValidExpression(expression, 0, 59);
}

/**
* @param {string} expression The Cron-Job expression.
* @returns {boolean}
*/
function isInvalidHour(expression) {
return !isValidExpression(expression, 0, 23);
}

/**
* @param {string} expression The Cron-Job expression.
* @returns {boolean}
*/
function isInvalidDayOfMonth(expression) {
return !isValidExpression(expression, 1, 31);
}

/**
* @param {string} expression The Cron-Job expression.
* @returns {boolean}
*/
function isInvalidMonth(expression) {
return !isValidExpression(expression, 1, 12);
}

/**
* @param {string} expression The Cron-Job expression.
* @returns {boolean}
*/
function isInvalidWeekDay(expression) {
return !isValidExpression(expression, 0, 7);
}

/**
* @param {string[]} patterns The Cron-Job expression patterns.
* @param {string[]} executablePatterns The executable Cron-Job expression
* patterns.
* @returns {void}
*/
function validateFields(patterns, executablePatterns) {
if (isInvalidSecond(executablePatterns[0]))
throw new Error(`${patterns[0]} is a invalid expression for second`);

if (isInvalidMinute(executablePatterns[1]))
throw new Error(`${patterns[1]} is a invalid expression for minute`);

if (isInvalidHour(executablePatterns[2]))
throw new Error(`${patterns[2]} is a invalid expression for hour`);

if (isInvalidDayOfMonth(executablePatterns[3]))
throw new Error(
`${patterns[3]} is a invalid expression for day of month`
);

if (isInvalidMonth(executablePatterns[4]))
throw new Error(`${patterns[4]} is a invalid expression for month`);

if (isInvalidWeekDay(executablePatterns[5]))
throw new Error(`${patterns[5]} is a invalid expression for week day`);
}

/**
* Validates a Cron-Job expression pattern.
*
* @param {string} pattern The Cron-Job expression pattern.
* @returns {void}
*/
function validate(pattern) {
if (typeof pattern !== 'string')
throw new TypeError('pattern must be a string!');

const patterns = pattern.split(' ');
const executablePatterns = convertExpression(pattern).split(' ');

if (patterns.length === 5) patterns.unshift('0');

validateFields(patterns, executablePatterns);
}

module.exports = validate;

0 comments on commit ecb1e0d

Please sign in to comment.