https://www.figma.com/file/Ez2oIKQMBwWOvELrlWFXSq/DLS_One_Desktop?type=design&node-id=8294%3A69598&mode=design&t=dFwAMz5YZFzGcerZ-1
## Описание
Уведомления передаются по 3 каналам: запись в базу данных, передача через firebase, передача через сокет.
Firebase используется для пуш уведомлений, которые всплывают если юзер не в приложении. Если юзер в приложении, то уведомление всплывает в самом приложении и формируется из данных, которые передаются по сокету. Отправка всех уведомлений ставится в очередь Redis и затем уже обрабатывается их отправка.
Нюансы: на текущий момент мобильные устройства не имеют отображения уведомлений внутри приложения по данным сокета. Думаю что если все таки будет запрошено сделать все по дизайну, то делать всплывающие уведомления на мобильных устройствах необходимо также через сокет.
Нюансы Firebase: нельзя передавать больше 4 кб данных, включая технические данные самого firebase.
## Нюансы реализации на стороне сервера
Изначально клиентская сторона запросила данные со структурой несколько отличающиеся от структуры БД. Что приводит к тому, что структура данных, которые мы передаем для уведомлений отличаются от того, что мы отдаем в API. Поэтому принято решение временно или постоянно, как пойдет, сделать адаптер, который будет конвертировать данные из принятых структур в структуры запрошенные от фронт части. А внутри приложения на сервере и в БД оперировать принятыми структурами, включая сохранение в БД среза данных уведомления. Для чего будет проведен рефакторинг кода в рамках создания эндпойнтов для вывода уведомлений на отдельной странице. Обсудить этот момент, есть ли в этом смысл. Пока не сделано.
## Типы, описание, структуры данных
Нюансы оформления: в скобках указывается соответствия данным в принятой на сервере структуре данных.
Нюансы, возможно поправить в будущем: разные стили написания "dls_notification_payload", "platform_type", "matrix_name" не соответствуют другим.
### Общие значения и схемы
"platform_type" - возможные значения - socket, linux, windows, macOS, android, ios
*Схемы - общие*
```json
"file":
{
"id": (int)1,
"alt": (?string)"alt изображения",
"url": (?string)"https://local.shvetsov.tech/storage/2023/07/04/36825bd0df70d5245b44caf88c90af1fbc4f7298.jpg",
"disk": (string)"public",
"hash": (?string)"163b5c52e28599efed9d5a3631c8e0e902680366",
"mime": (string)"image/jpeg",
"name": (string)"36825bd0df70d5245b44caf88c90af1fbc4f7298",
"path": (string)"2023/07/04/",
"size": (int)481306,
"sort": (int)0,
"group": (?string)null,
"user_id": (?int)2,
"extension": (?string)"jpg",
"created_at": (datetime)"2023-07-04T09:22:08.000000Z",
"deleted_at": (?datetime)null,
"updated_at": (?datetime)"2023-07-04T09:22:08.000000Z",
"description": (?string)null,
"relativeUrl": (?string)"/storage/2023/07/04/36825bd0df70d5245b44caf88c90af1fbc4f7298.jpg",
"original_name": (string)"avatar.jpg"
}
```
```json
"sprint":
{
"uuid": (int)1, //id спринта
"name": (string)"Название спринта", //(name - title)
"status": (int)1, //статус спринта, возможные значения - 1, 2, 3
"interval": (array)[(?datetime)"2023-05-14T09:20:20+00:00", (?datetime)"2023-06-14T09:20:20+00:00"] //start_at - expired_at
"timestamp": (datetime)"2023-06-14T09:20:20+00:00" //время создания уведомления UTC
}
```
```json
"event":
{
"uuid": (int)1, //id мероприятия
"name": (string)"Название мероприятия", //(name - title)
"date": (?datetime)"2023-05-14T09:20:20+00:00" //start_at
"format": (int)1, //формат, возможные значения - 1(Онлайн), 2(Оффлайн)
"interval": (array)[(?datetime)"2023-05-14T09:20:20+00:00", (?datetime)"2023-06-14T09:20:20+00:00"]
"timestamp": (datetime)"2023-06-14T09:20:20+00:00" //время создания уведомления UTC
}
```
```json
"task":
{
"uuid": (int)1, //id задачи
"name": (string)"Название задачи", //(name - title)
"priority": (int)1, //(priority - priority) (0, 1, 2, 3, 4)
"status": (int)1, //(status - status_id) значения хранятся на клиенте
"deadline": (?datetime)"2023-06-14T09:20:20+00:00", //(deadline - expired_at)
"timestamp": (datetime)"2023-06-14T09:20:20+00:00"
}
```
### Firebase
Одинаковая структура для всех типов. В Firebase отправляется Заголовок, текст сообщения и 1 параметр platform_type. Планируется отправка названия файлов для звуковых сигналов и ссылок.
*Схема - notification*
```json
"notification":
{
"title": (string)"Текст заголовка",
"body": (string)"Тело сообщения",
"image": (string)"можно передать аватарку например" //пока не реализованно
}
```
*Все данные*
```json
{
"data":
{
"data": {
"platform_type": (string)"linux"
}
},
"notification": "scheme notification"
}
```
### Сокет и API - приходят одинаковые данные. Но сокет имеет дополнительную обертку
*Обертка данных сокета*
```json
{
"dls_notification_payload":
{
данные уведомления
... - возможны другие технические данные для успешной передачи через сокет
},
"state": "notification"
}
```
*Во всех структурах присутствуют следующие данные*
```json
{
"id": (int)1, //id уведомления в БД
"read_at": (?datetime)"2023-01-29T14:17:21.000000Z", //дата прочтения
}
```
### Тип уведомлений: Chat
#### Схемы
```json
"nObject":
{
"uuid": (string)"!HwtvablQvEJyoPmbTA:matrix.shvetsov.tech", //(uuid - room_id)
"name": (string)"Иванов Иван Иванович|Название комнаты", //(name - name) Название комнаты, это Фамилия + имя собеседника или название для группового чата
"timestamp": (datetime)"2023-06-14T09:20:20+00:00" //время создания уведомления UTC
}
```
```json
"user":
{
"uuid": (int)1, //(uuid - id)
"avatar": (?string)"https://demo-one.dls-one.com/storage/user/2bf17b855bbcc21513ab9b0c63964374/fileName", //(avatar - avatar)
"username": (string)"Иванов Иван", //(username - name_surname) Фамилия + имя пользователя
"matrix_name": (string)"@u1000:matrix.shvetsov.tech" //name в matrix
}
```
```json
"chatMessage":
{
(object)"data": {
(object)"content": [{"insert": "какой-то текст"}, {"insert": "выделенный текст", "attributes": {"bold": true}}, ...]
},
"message_type": (string)"text" //какие еще могут быть типы неизвестно
}
```
#### Уведомления
<details>
<summary>chatPrivateMessage - вам пришло сообщение в личный чат</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}", //Отправитель
"body": "{Текст сообщения}"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"message": "scheme chatMessage",
"messageId": (string)"$XvxheVAiHKQzA17Kt5XvKQbLdBMDmrdEGCl_RtpeRUM", //(messageId - event_id)
"runtimeType": (string)"chatPrivateMessage", //тип уведомления
"platform_type": (string)"socket",
}
```
Внешний вид
[Уведомление внутри приложения](https://downloader.disk.yandex.ru/preview/2f40fa3b9f39f7f96822d77bd9ab02f2b4cf61387a8565b028c0d60e80b7c18c/64a56319/NNRlUoLlHt71NXrRpNeft6BKuU7R9HLKE5t-xOb3Dqq6dWLjuE00gLprvHR5Td8J0w3O_m7G6RYN2PRTR-3kVA%3D%3D?uid=0&filename=Pasted%20Graphic%205.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&owner_uid=0&tknv=v2&size=2048x2048)
[Пуш-оповещени](https://downloader.disk.yandex.ru/preview/2f40fa3b9f39f7f96822d77bd9ab02f2b4cf61387a8565b028c0d60e80b7c18c/64a56319/NNRlUoLlHt71NXrRpNeft6BKuU7R9HLKE5t-xOb3Dqq6dWLjuE00gLprvHR5Td8J0w3O_m7G6RYN2PRTR-3kVA%3D%3D?uid=0&filename=Pasted%20Graphic%205.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&owner_uid=0&tknv=v2&size=2048x2048)
</details>
<details>
<summary>chatThreadMessagePrivate - вам пришло сообщение в личном чате в тред, который создали не вы</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}", //Отправитель
"body": "{Текст сообщения}"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"message": "scheme chatMessage",
"replyMessage": "scheme chatMessage", //текст сообщения, которое стало тредом
"parentMessageId": (string)"$nklva7Z2Xf87iqT0lGJeCZapSjDkBpqRhwEwCPwky6c", //(parentMessageId - event_id) - id события, которое превратилось в тред
"messageId": (string)"$XvxheVAiHKQzA17Kt5XvKQbLdBMDmrdEGCl_RtpeRUM", //(messageId - event_id)
"runtimeType": (string)"chatThreadMessagePrivate", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatReplyYourMessagePrivate - вам пришло сообщение в личном чате в треде, который создали вы</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}", //Отправитель
"body": "На ваше сообщение ответили: {Текст сообщения}"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"message": "scheme chatMessage",
"replyMessage": "scheme chatMessage", //текст сообщения, которое стало тредом
"parentMessageId": (string)"$nklva7Z2Xf87iqT0lGJeCZapSjDkBpqRhwEwCPwky6c", //(parentMessageId - event_id) - id события, которое превратилось в тред
"messageId": (string)"$XvxheVAiHKQzA17Kt5XvKQbLdBMDmrdEGCl_RtpeRUM", //(messageId - event_id)
"runtimeType": (string)"chatReplyYourMessagePrivate", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatGroupMessage - вам пришло сообщение в групповом чате</summary>
***Текст уведомления Firebase***
```
"title": "{Название комнаты}",
"body": "{Фамилия Имя}: {Текст сообщения}"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"message": "scheme chatMessage",
"messageId": (string)"$XvxheVAiHKQzA17Kt5XvKQbLdBMDmrdEGCl_RtpeRUM", //(messageId - event_id)
"runtimeType": (string)"chatGroupMessage", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatThreadMessage - вам пришло сообщение в групповом чате в тред, который создали не вы</summary>
***Текст уведомления Firebase***
```
"title": "{Название комнаты}",
"body": "{Фамилия Имя}: Текст сообщения"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"message": "scheme chatMessage",
"replyMessage": "scheme chatMessage", //текст сообщения, которое стало тредом
"parentMessageId": (string)"$nklva7Z2Xf87iqT0lGJeCZapSjDkBpqRhwEwCPwky6c", //(parentMessageId - event_id) - id события, которое превратилось в тред
"messageId": (string)"$XvxheVAiHKQzA17Kt5XvKQbLdBMDmrdEGCl_RtpeRUM", //(messageId - event_id)
"runtimeType": (string)"chatThreadMessage", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatReplyYourMessage - вам пришло сообщение в групповом чате в тред, который создали вы</summary>
***Текст уведомления Firebase***
```
"title": "{Название комнаты}",
"body": "На ваше сообщение ответил - {Фамилия Имя}: {текст сообщения}"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"message": "scheme chatMessage",
"replyMessage": "scheme chatMessage", //текст сообщения, которое стало тредом
"parentMessageId": (string)"$nklva7Z2Xf87iqT0lGJeCZapSjDkBpqRhwEwCPwky6c", //(parentMessageId - event_id) - id события, которое превратилось в тред
"messageId": (string)"$XvxheVAiHKQzA17Kt5XvKQbLdBMDmrdEGCl_RtpeRUM", //(messageId - event_id)
"runtimeType": (string)"chatReplyYourMessage", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatAddYouToGroup - вас добавили в чат</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил вас в группу {Название Группы}"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"groupName": (string)"Название группы",
"runtimeType": (string)"chatAddYouToGroup", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatRemoveGroupUsers - из группы были удалены такие то юзеры</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил вас в группу {Название Группы}"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"users": ["scheme user", "scheme user", ...], //удаленные юзеры
"groupName": (string)"Название группы",
"runtimeType": (string)"chatRemoveGroupUsers", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatChangeGroupName - изменилось имя группы в которой вы состоите</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "изменил название группы {Предыдущее название} на {Текущее название}"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"user": "scheme user",
"namePrev": (string)"Старое название группы",
"nameCur": (string)"Текущее название группы",
"runtimeType": (string)"chatChangeGroupName", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatCallStart - начался звонок в групповом чате</summary>
***Текст уведомления Firebase***
```
"title": "Начался групповой звонок",
"body": "в чате '{Название чата}'"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"runtimeType": (string)"chatCallStart", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
<details>
<summary>chatCallEnd - закончился звонок в групповом чате</summary>
***Текст уведомления Firebase***
```
"title": "Завершился групповой звонок",
"body": "в чате '{Название чата}'"
```
***Данные уведомления:***
```json
{
"type": (string)"chat",
"nObject": "scheme nObject",
"duration": (int)30, //длительность звонка в секундах
"runtimeType": (string)"chatCallEnd", //тип уведомления
"platform_type": (string)"socket", //для сокета всегда такой тип
}
```
</details>
### Тип уведомлений: Task
#### Схемы
*Схемы*
```json
"user":
{
"uuid": (int)1,
"avatar": (?string)"https://demo-one.dls-one.com/storage/user/2bf17b855bbcc21513ab9b0c63964374/fileName",
"username": (string)"Иванов Иван",
}
```
#### Типы
<details>
<summary>taskChangeStatus - изменили статус задачи</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "изменил статус задачи '{Название задачи}' на '{Текущий статус}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"statusPrev": (int)1, //Предыдущий id статуса
"statusCur": (int)2, //Текущий id статуса
"runtimeType": (string)"taskChangeStatus",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskChangeDeadline - изменили дедлайн задачи</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "изменил дедлайн задачи '{Название задачи}' на '{Текущий дедлайн}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"deadlinePrev": (?datetime)"2023-06-14T09:20:20+00:00", //Предыдущий дедлайн задачи
"deadlineCur": (?datetime)"2023-06-14T09:20:20+00:00", //Текущий дедлайн задачи
"runtimeType": (string)"taskChangeDeadline",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskChangePriority - изменили приоритет задачи</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "изменил приоритет задачи '{Название задачи}' на '{Текущий приоритет}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"priorityPrev": (int)1, //Предыдущий приоритет задачи (0, 1, 2, 3, 4)
"priorityCur": (int)2, //Текущий приоритет задачи (0, 1, 2, 3, 4)
"runtimeType": (string)"taskChangePriority",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddYouAssigner - вас добавили исполнителем в задачу</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "назначил вас исполнителем задачи '{Название задачи}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"runtimeType": (string)"taskAddYouAssigner",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddAssigners - в задачу добавили новых исполнителей</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил {количество} исполнителей в задачу '{Название задачи}': {Список добавленных юзеров}",
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"users": ["scheme user", "scheme user", ...], //добавленные юзеры
"runtimeType": (string)"taskAddAssigners",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddYouWatcher - вас добавили наблюдателем в задачу</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "назначил вас наблюдателем в задачу '{Название задачи}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"runtimeType": (string)"taskAddYouWatcher",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddWatchers - в задачу добавили новых наблюдателей</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил {количество} наблюдателей в задачу '{Название задачи}': {Список добавленных юзеров}",
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"users": ["scheme user", "scheme user", ...], //добавленные юзеры
"runtimeType": (string)"taskAddWatchers",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddYouResponsible - вас добавили ответственным в задачу</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "назначил вас ответственным за задачу '{Название задачи}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"runtimeType": (string)"taskAddYouResponsible",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddResponsible - в задачу добавили новых ответственных</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил {количество} ответственных в задачу '{Название задачи}': {Список добавленных юзеров}",
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"users": ["scheme user", "scheme user", ...], //добавленные юзеры
"runtimeType": (string)"taskAddResponsible",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddFile - в задачу добавили 1 новый файл</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил файл к задаче '{Название задачи}'",
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"file": "scheme file", //данные добавленного файла
"runtimeType": (string)"taskAddFile",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskChangeAnyString - какие либо изменения в задаче</summary>
***Какие события затрагивает:***
1. Изменили заголовок задачи
2. Изменили описание задачи
3. Добавили несколько файлов в задачу
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "изменил название задачи '{Предыдущее название задачи}' на '{Текущее название задачи}'";
```
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "иизменил описание задачи '{Название задачи}'";
```
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил '{Количество файлов}' файла к задаче '{Название задачи}'";
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"text1": "текст без выделения",
"text2": "текст с выделением",
"runtimeType": (string)"taskChangeAnyString",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddSprints - в задачу добавили спринтов</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил спринт '{Название сринта}' в задачу '{Название задачи}'";
```
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил {Количество спринтов} спринтов в задачу '{Название задачи}'";
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"sprints": ["scheme sprint", "scheme sprint", ...], //данные добавленных спринтов
"runtimeType": (string)"taskAddSprints",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddEvents - в задачу добавили мероприятий</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил мероприятие '{Название мероприятия}' в задачу '{Название задачи}'";
```
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил {Количество мероприятий} мероприятия в задачу '{Название задачи}'";
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"events": ["scheme event", "scheme event", ...], //данные добавленных мероприятий
"runtimeType": (string)"taskAddEvents",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddChildTasks - в задачу добавили подзадачи</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил подзадачу '{Название подзадачи}' в задачу '{Название задачи}'";
```
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил {Количество подзадач} подзадач в задачу '{Название задачи}'";
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"subTasks": ["scheme task", "scheme task", ...], //данные добавленных подзадач
"runtimeType": (string)"taskAddChildTasks",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddDependencies - в задачу добавили зависимости</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил зависимость '{Название зависимости}' в задачу '{Название задачи}'";
```
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил {Количество зависимостей} зависимости в задачу '{Название задачи}'";
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"depends": ["scheme task", "scheme task", ...], //данные добавленных задач
"runtimeType": (string)"taskAddDependencies",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskLock - в задачу добавили блокирующие задачи</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил блокирующею задачу '{Название блокирующей задачи}' в задачу '{Название задачи}'";
```
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил {Количество блокирующих задач} блокирующих задач в задачу '{Название задачи}'";
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"blocks": ["scheme task", "scheme task", ...], //данные добавленных задач
"runtimeType": (string)"taskLock",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskUnlock - из задачи удалили блокирующие задачи</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "убрал блокирующею задачу '{Название блокирующей задачи}' из задачи '{Название задачи}'";
```
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "убрал {Количество блокирующих задач} блокирующих задачи из задачи '{Название задачи}'";
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"blocks": ["scheme task", "scheme task", ...], //данные удаленных задач
"runtimeType": (string)"taskUnlock",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskAddTodos - в задаче в чек-лист добавили новые пункты</summary>
***Текст уведомления Firebase***
```
"title": "{Фамилия Имя}",
"body": "добавил пункт '{Названия пункта в чеклисте}' в чек лист задачи '{Названия задачи}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"checkListCount": (int)2, //количество добавленных пунктов
"runtimeType": (string)"taskAddTodos",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskReminder - дедлайн задачи - Сегодня или Завтра</summary>
***Текст уведомления Firebase***
```
"title": "{Сегодня|Завтра} дедлайн задачи",
"body": "'{Название задачи}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"diffInDays": (int)1, //количество дней до дедлайна - варианты 0 или 1
"runtimeType": (string)"taskReminder",
"platform_type": (string)"socket",
}
```
</details>
<details>
<summary>taskOverdue - задача просрочена</summary>
***Текст уведомления Firebase***
```
"title": "Просрочена задача",
"body": "'{Название задачи}'"
```
***Данные уведомления:***
```json
{
"type": (string)"task",
"nObject": "scheme task",
"user": "scheme user",
"runtimeType": (string)"taskOverdue",
"platform_type": (string)"socket",
}
```
</details>