Валидатор JSON с использованием правила


Я пишу приложение, которое предназначено для проверки данных. Данные приходят в виде JSON и я с помощью JSON-схемы для проверки структуры и некоторые логики наряду с функциями проверки нескольких ключевых бизнес-логики.

Мне нужно быть в состоянии отслеживать то, что не прошло проверку и перекладывать в другое приложение, чтобы быть рассмотрены. До сих пор я о 50-ти проверок, 25 основной бизнес-логики тестов и еще 25 или так, что просто проверяют и отчетности ошибок при проверке схемы JSON.

Я использую Node.js 9.4 и ЕС6.

Я думаю, что я создал что-то ужасное до сих пор, и могли бы сделать некоторые советы на лучший способ реализации этого:

Rule.js

class Rule {
  constructor(release) {
    this.release = release;
    this.errors = [];
    this.validator = false;
  }

  static registerRule(rule) {
    Object.assign(this.prototype, rule);
  }

  static registerValidator(validator) {
    if (!this.validator) {
      this.validator = true;
      Object.assign(this.prototype, validator);
    } else {
      throw {
        toString: function() {
          return 'validator already assigned';
        }
      };
    }
  }

  _recordError(error, options) {
    this.errors.push({
      release_id: this.release.id,
      rule: error,
      options: options,
    });
  }
}

module.exports = Rule;

Тогда я буду правила валидации, которые могут быть либо проверить, чтобы узнать об ошибке от моего валидатора схемы JSON, или бизнес-логики и стиля правила:

NoExclusive.js

module.exports = {
  exclusive: function(errors) {
    errors.some( (error) => {
      if (error.parentSchema.regexp === '/^((?!exclusive).)*$/i') {
        this._recordError('NOEXCLUSIVE');
      }
    });
  }
};

Я создать валидатор

Validate.js

module.exports = {
  validate: function(errors) {
    this.exclusive(errors);
    // ... Other rules too

    return this.errors;
  }
};

Тогда у меня есть индексная страница, где я добавить правила проверки на объекте правила, а также оценщик.

index.js

const Rule = require('../../Rule');

Rule.registerRule(require('./NoExclusive'));
// ... Other rules
Rule.registerValidator(require('./Validate'));

module.exports = Rule;

Я потом инстанцировать его позже в приложение, где я передать его данные (release в конструкторе).

Я не чувствую, что это лучший способ делать это. Я хотел бы быть в состоянии иметь 2 разных объектов правило, для бизнес-логики и других за ошибки схемы JSON, но я боксировал сам по этому методу. Есть ли лучший способ, или шаблон проектирования я могу использовать для этого?



Комментарии