/iu9-www

Primary LanguageJavaScript

Ролевая модель

Коллекции

users Данные пользователей. Структура:

Поле Тип Описание
_id bsonId Идентификатор MongoDb
login string Логин пользователя
passwordHash string sha512(password + salt)
passwordSalt string Случайная строка
roles array[string] Список ролей пользователя
unread array[Object] Непрочитанные диалоги

Струкрута элементов массива inbox

Поле Тип Описание
dialogId bsonId Идентификатор диалога
messageIds array[string] Массив идентификаторов непрочитанных сообщений

roles Возможные роли пользователей. Структура:

Поле Тип Описание
_id bsonId Идентификатор MongoDb
name string Отображаемое название роли
permissions Object Словарь разрешений данной роли

Структура элемента permissions

Поле Тип Описание
uri (ключ) string Идентификатор действия в коллекции actions
allowed boolean Доступность действия пользователю
restrictions Object Словарь ограничений на параметры действия (JSON-schema)

Структура элементов массива restrictions

Поле Тип Описание
additionalProperties boolean Допустимы ли дополнительные поля
properties Object Ограничения на поля проверяемого объекта
required array[string] Список обязательных полей

Создание роли

От клиента приходит:

  • Название роли
  • Словарь разрешений (средство для конструирования реализовано на клиенте)

При добавлении дополнительных действий (например, при расширении функционала) действие считается запрещенным для всех. По этой причине начальная настройка ролей проводится вручную, чтобы дать пользователю доступ к интерфейсу создания ролей.

Редактирование роли

Состоит из двух запросов:

  1. Получение старых значений роли
  2. Обновление значений

Ответ на первый запрос возвращает весь документ из коллекции вместе со всеми разыменованными полями.

Второй запрос отличается от добавления роли лишь наличием идентификатора.

Проверка роли

Для каждого запроса к серверу проверяется существование действия с таким запросом (поиск по uri). Если действие не найдено - запрос считается некорректным, и возвращается ошибка.

В случае, если действие найдено, проверяется значение allowed соответствующей пары ключ:значение словаря permissions. Если значение равняется false - действие запрещается, возвращается код 403.

Если действие разрешено, то проверяется элемент restrictions - ограничения на проверямое поле (тип, значение).

Удаление роли

Допустимо только в том случае, если не существует пользователей с такой ролью.

Сообщения

Коллекции

dialogs Созданные диалоги между группами пользователей. Структура:

Поле Тип Описание
_id bsonId Идентификатор MongoDb
title string Отображаемое название
createdAt date Дата создания
parties array[Object] Массив сторон переписки
messages array[Object] Архив сообщений диалога

Структура элементов массива parties:

Поле Тип Описание
title string Отображаемое наименование стороны
users array[bsonId] Массив идентификатор участников стороны

Структура элементов массива messages:

Поле Тип Описание
id string Уникальный идентификатор сообщения
timestamp date Время отправки сообщения
content string Содержание сообщения

Создание диалога

От клиента приходит:

  • Название
  • Массив идентификаторов пользователей
  • Мабор правил и названий для групп, эти правилами задаваемых

Все правила преобразуются в списки идентификаторов удовлетворяющих им пользователей. Если для правила не найдено ни одного участника, то возвращается ошибка.

Получившиеся списки (и каждый пользователь, заданный отдельно) образуют стороны созданного диалога. Ко всем пользователям диалога в поле unread добавляется объект с идентификатором диалога и пустым массивом идентификаторов сообщений.

Удаление диалога

У всех участников диалога удаляется из поля unread объект, соответствующий идентификатору диалога, удаляется документ, соответствующий диалогу.

Отправка сообщения

От клиента приходит:

  • Текст сообщения
  • Идентификатор диалога

Сообщению присваивается уникальный идентификатор, и оно добавляется в массив messages соответствующего диалога.

Доставка сообщения

Поисходит попытка отправить уведомления всем пользователям в диалоге через Websocket (идентификатор подключения хранится в инормации сессии в Redis). В случае, если отправка проходит неудачно (пользователь не в сети), идентификатор диалога и сообщения дописывается в поле массив unread соответствующего пользователя.

Новости

Добавление новости

От клиента приходит:

  • Текст новости в Markdown
  • Список ролей или поле public

Если заполнено и поле public, и список ролей, необходимых для просмотра - возвращается ошибка. Поле HTML заполняется при помощи marked, новость сохраняется в коллекции.

Редактирование новости

От клиента приходит:

  1. Запрос на получение исходника старой новости в Markdown и старых ролевых правил
  2. Запрос на редактирование с новыми правилами и новым кодом в Markdown

В ответ на первый запрос приходят три поля: _id, markdown и public/canSee.

При обработке второго запроса ожидается тот же набор полей. Если поле _id отсутствует - возвращается ошибка. Если отсутствует какое-либо из полей оставшихся полей - считается, что эти поля не требуют изменений. Если приходит поле public или canSee, то перед записью их в документ стираются оба старых поля public/canSee. Если в запросе приходит оба поля public/canSee - возвращается ошибка.

Удаление новости

От клиента приходит:

  • Идентификатор новости

Если идентификатор не найден в базе - возвращается ошибка.

Коллекции

news Элементы новостной ленты.

Поле Тип Описание
_id bsonId Идентификатор MongoDb
markdown string Исходный текст новости в Markdown
html string Итоговый код новости в HTML
public boolean Общедоступность новости
canSee array[string] Список ролей, которым видно новость

В случае, если в новости поле public имеет значение true, поле canSee игнорируется.

События

Коллекции

events События кафедры.

Поле Тип Описание
_id bsonId Идентификатор MongoDb
title string Отображаемое наименование события
beginDate date Дата начала события
endDate date Дата окончания события
groups array[Object] Группы участников события
attachments array[Object] Массив путей к материалам события
dialogId string Идентификатор диалога события

Структура элементов массива groups:

Поле Тип Описание
title string Отображаемое название группы
restrictions array[Object] Массив правил, задающих группу

Структура элементов массива attachments:

Поле Тип Описание
title string Отображаемое наименование приложения
path string Путь к файлу относительно корня [файловой директории]

Добавление нового вида события

todo

Создание существующего вида события

todo

Редактирование события

todo

Удаление события

todo