users
Данные пользователей. Структура:
| Поле | Тип | Описание |
|---|---|---|
| _id | bsonId | Идентификатор MongoDb |
| login | string | Логин пользователя |
| passwordHash | string | sha512(password + salt) |
| passwordSalt | string | Случайная строка |
| role | array[int] | Список ролей пользователя |
| unread | array[Object] | Непрочитанные диалоги |
Струкрута элементов массива inbox
| Поле | Тип | Описание |
|---|---|---|
| dialogId | bsonId | Идентификатор диалога |
| messageIds | array[string] | Массив идентификаторов непрочитанных сообщений |
actions
Допустимые в рамках ролевой модели действия. Структура:
| Поле | Тип | Описание |
|---|---|---|
| _id | bsonId | Идентификатор MongoDb |
| uri | string | Uri запроса, требующего проверки |
roles
Возможные роли пользователей. Структура:
| Поле | Тип | Описание |
|---|---|---|
| _id | bsonId | Идентификатор MongoDb |
| name | string | Отображаемое название роли |
| permissions | Object | Словарь разрешений данной роли |
Структура элемента permissions
| Поле | Тип | Описание |
|---|---|---|
| actionId (ключ) | bsonId | Идентификатор действия в коллекции actions |
| allowed | boolean | Доступность действия пользователю |
| restrictions | Object | Словарь ограничений на параметры действия (JSON-schema) |
Структура элементов массива restrictions
| Поле | Тип | Описание |
|---|---|---|
| id | string | Уникальный идентификатор схемы |
| type | string | Тип схемы, имеет значение object |
| additionalProperties | boolean | Допустимы ли дополнительные поля |
| properties | Object | Ограничения на поля проверяемого объекта |
| required | array[string] | Список обязательных полей |
От клиента приходит:
- Название роли
- Словарь разрешений (средство для конструирования реализовано на клиенте)
При добавлении дополнительных действий (например, при расширении функционала) действие считается запрещенным для всех. По этой причине начальная настройка ролей проводится вручную, чтобы дать пользователю доступ к интерфейсу создания ролей.
Состоит из двух запросов:
- Получение старых значений роли
- Обновление значений
Ответ на первый запрос возвращает весь документ из коллекции вместе со всеми разыменованными полями.
Второй запрос отличается от добавления роли лишь наличием идентификатора.
Для каждого запроса к серверу проверяется существование действия с таким запросом (поиск по uri). Если действие не найдено - запрос считается некорректным, и возвращается ошибка.
В случае, если действие найдено, проверяется значение allowed соответствующей пары ключ:значение словаря permissions. Если значение равняется false - действие запрещается, возвращается код 403.
Если действие разрешено, то проверяется элемент restrictions - ограничения на проверямое поле (тип, значение). Если значение равняется $template, то на его место во время валидации будет подставлено фактическое значение, определяемое логикой конкретного действия. В случае, если значение не будет заполнено - будет возвращена ошибка валидации!
Допустимо только в том случае, если не существует пользователей с такой ролью.
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, новость сохраняется в коллекции.
От клиента приходит:
- Запрос на получение исходника старой новости в Markdown и старых ролевых правил
- Запрос на редактирование с новыми правилами и новым кодом в 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[bsonId] | Список ролей, которым видно новость |
В случае, если в новости поле 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