Строим блог на основе Node.js MVC фреймворка Areto

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

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

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

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

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

modules/admin/models/User.js

'use strict';
const Base = require('../../../models/User');
module.exports = class User extends Base {
  static getConstants () {
    return {
      RULES: [
        [['name', 'email', 'role', 'status'], 'required'],
        ['password', 'required', {on: ['create']}],
        ['status', 'range', {range: ['pending', 'active', 'banned']}],
        ['role', 'range', {range: ['reader', 'author', 'editor', 'moderator', '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 }]
      ]
    };
  }
  // place methods here
};
module.exports.init(module);
const Article = require('./Article');

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

modules/admin/models/User.js

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

Методы возвращают списки допустимых значений и названий для атрибутов status и role.

modules/admin/models/User.js

...
getStatusSelect () {
  return [
    { value: 'active', label: 'Active' },
    { value: 'banned', label: 'Banned' }
  ];
}

getRoleSelect () {
  return [
    { value: 'reader', label: 'Reader' },
    { value: 'author', label: 'Author' },
    { value: 'editor', label: 'Editor' },
    { value: 'moderator', label: 'Moderator' },
    { value: 'admin', label: 'Administrator' }
  ];
}
...

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

modules/admin/models/User.js

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