Строим блог на Areto фреймворк

Модель пользователя

В модуле администрирования можно как редактировать пользователей, созданных через форму регистрации, так и создавать новых. Класс пользователя наследуется от класса User из публичной части блога.

Модуль администрирования блога

Пароль для пользователя необходим при создании модели и необязателен при редактировании. Это достигается с помощью сценариев валидации, назначенных на правило ({on: ['create']}). Таким образом атрибут password будет проверен на обязательность только при условии ['create'].includes(model.scenario). Если сценарий для правила не указан, то оно будет применяться во всех случаях.

Валидатор range, используемый для атрибутов status, role, проверяет значение на попадание в указанное множество.

module/admin/model/User.js

const Base = require('../../../model/User');
module.exports = class User extends Base {
  static getConstants () {
    return {
      RULES: [
        [['name', 'email', 'role', 'status'], 'required'],
        ['password', 'required', {on: ['create']}],
        ['status', 'range', {range: [
          this.STATUS_PENDING,
          this.STATUS_ACTIVE,
          this.STATUS_BANNED
        ]}],
        ['role', 'range', {range: [
          this.ROLE_READER,
          this.ROLE_AUTHOR,
          this.ROLE_EDITOR,
          this.ROLE_MODERATOR,
          this.ROLE_ADMIN
        ]}],
        ['name', 'string', {min: 3, max: 24}],
        ['name', 'regexp', {pattern: /^[a-z\s-]+$/i}],
        ['email', 'email'],
        ['password', 'string', {min: 6, max: 32}],
        [['email', 'name'], 'unique', {ignoreCase: true}]
      ],
      ATTR_VALUE_LABELS: {
        'status': {
          [this.STATUS_ACTIVE]: 'Active',
          [this.STATUS_BANNED]: 'Banned'
        },
        'role': {
          [this.ROLE_READER]: 'Reader',
          [this.ROLE_AUTHOR]: 'Author',
          [this.ROLE_EDITOR]: 'Editor',
          [this.ROLE_MODERATOR]: 'Moderator',
          [this.ROLE_ADMIN]: 'Administrator'
        }
      }
    };
  }
  // place methods here
};
module.exports.init(module);
const Article = require('./Article');

Метод findBySearch ищет пользователей, у которых имя или email содержат указанный текст.

module/admin/model/User.js

static findBySearch (text) {
  if (!text) {
    return this.find();
  }
  return this.find(['OR',
    ['LIKE','name',`%${text}%`],
    ['LIKE','email',`%${text}%`]
  ]);
}

Отношение relArticles находит все статьи пользователя.

module/admin/model/User.js

relArticles () {
  return this.hasMany(Article, 'authorId', this.PK);
}