---
# System prepended metadata

title: Untitled

---

Основа системы прав - уровень видимости инстанса модели/класса пользователю.
По умолчанию есть 3 уровня доступа к любой модели - none (нет доступа), user(только чтение), admin(чтение и изменение).
Уровни доступа описываются как хэш { уровень => инстанс правила (необязательно сохраненного) }.

Правило - должно иметь метод/операцию для вычисления истинности. 
  Методы:
    #compute(user) -> Boolean
    #scope(ActiveRecord::Base class) -> ActiveRecord::Query
  Имеет колонку type для подтипов - с возможно более сложной логикой работы
  Можно завести колонку meta для хранения простых параметров отдельных типов, валидировать с помощью формы для типа правила (Например флаги для правила, числа)

Настройки прав в моделях (conditions_models) - Хранение значений по умолчанию и переопределений
  Параметры: Id правила, Id модели, Класс модели, Уровень доступа
  Id модели может быть null, это означает значение по умолчанию для всей модели
  Порядок поиска права для правила:
    - Найти в conditions_models нужную модель
    - Найти в conditions_models нужный класс модели
    - Взять значение по умолчанию (любой пользователь имеет доступ на чтение, с ролью admin на запись)

Кеширование:
  Можно сделать для вычисления правил (хранить <Id условия>_<Id пользователя> => результат)
  Можно сделать для вычисления уровня (Хранить <Класс модели>_<Id модели>_<Id пользователя> => уровень доступа)
  PubSub через https://guides.rubyonrails.org/active_support_instrumentation.html или https://github.com/kevinrutherford/event_bus
  Создаем в нужных моделях вызовы событий, правилами на них подписываемся. Если пришло обновление - сбрасываем все кеши связанные с правилом

Метод acts_as_permittable (для использования в app/concepts/\*/policy.rb):
  Создает метод .visible_by для поиска моделей, которые видимы пользователю с нужным уровнем доступа (по умолчанию user)
  Создает метод .access_level(user) для определения уровня доступа
  Создает метод .access_levels для получения всех доступных уровней
