# Общая структура

![](_resources/Архитектура%20-%20общая%20схема.png)

Основной код приложения написан на TypeScript и фреймворке NestJS (это такой Angular для backend-а)

Монолитное приложение включает в своём составе:

- основная функциональность
- кеш и промежуточный коллектор для данных на couchdb
- http api для внешних интеграций
- webhook-и и websocket-ы
- telegram-бот - есть возможность для реализации новых интеграций с другими чат-ботами
- cron-task-и для выполнения повторяющихся задач
- frontend server-side на простой шаблонизации
- frontend на react
- специальный плагин для lowcode платформы n8n

# Основной процесс

![](_resources/Архитектура%20-%20основной%20процесс.png)

Двигателем приложения служит redmine-issue-event-emitter - это основной процесс поступления данных в Pinkmine.

1. Подписка на источники событий - по email, через cron-таски, через rss. Позволяет обнаруживать факты изменений в задачах в redmine. ([подробнее](Как%20это%20работает/Как%20работают%20стратегии%20синхронизации%20redmine%20и%20pinkmine.md))
2. Redmine Issue Event Emitter - это очередь для синхронизации данных из redmine. На выход кладётся номер задачи, на выходе данные полученные с помощью redmine api. Очередь обеспечивает бережное отношение к боевому redmine, так как позволяет выполнять выгрузки не выходя за выставленный лимит обращений. ([подробнее про работу очереди](Как%20это%20работает/Как%20работает%20очередь%20загрузки%20задач.md) и [подробнее про загрузку задач из redmine](Как%20это%20работает/Как%20происходит%20загрузка%20задачи%20из%20Redmine.md))
3. Преобразование задачи - это набор вспомогательных обработчиков. Позволяет при получении данных произвести попутно полезные изменения, например, привести текстовые теги к массиву, определить текущего ответственного за задачу, обнаружить в описании или в комментариях ссылки на gitlab на MR-ы, в т.ч. можно реализовать специализированный обработчик. ([подбронее](./Как%20это%20работает/Как%20происходит%20преобразование%20задачи.md))
4. Сохранение задачи в кеш в CouchDB ([подробнее](./Как%20это%20работает/Сохранение%20задачи%20в%20кеш%20CouchDB.md))
5. Анализ изменений в задаче - это сравнение предыдущего состояния задачи с новым. Позволяет организовать процессы связанные с жизненным циклом самой задачи и, например, разослать уведомления с учётом происходящих изменений ([подробнее](./Как%20это%20работает/Анализ%20изменений%20в%20задаче.md))
6. Сохранение событий изменения в журнал - вспомогательная коллекция данных ([подробнее](./Как%20это%20работает/Анализ%20изменений%20в%20задаче.md))

# Точки расширения

Платформа Pinkmine предполагает в т.ч. реализацию конкретных задач в рамках основного кода. Допускается реализация специализированных внутренних сервисов.

В рамках ядра redmine-issue-event-emitter:

- новые стратегии получения задач из Redmine
- специализированные обработчики задач для отдельных проектов
- интеграция событий в новые процессы - чат-боты или простая передача данных с помощью webhook-ов и websocket-ов

В рамках расширенной платформы pinkmine:

Благодаря CouchDB стало возможным предоставить api для поиска задач с более гибкими условиями для выборки чем во встроенном в redmine api. Можно использовать в выборках комбинированные выражения через "и"/"или". Богатый набор операторов - "есть значение", "нет значения", "больше", "меньше", "равно", "поиск по регулярному выражению". Для поиска можно пользоваться расширенными данными.

CouchDB позволяет выгружать для работы и анализа больший объём данных чем основной api redmine.

Webhook-и и websocket-ы могут сделать api ещё более гибким.

В рамках реализованного telegram chat бота можно дописывать логику работы под узкоспециализированные задачи.

С помощью фреймворка NestJS можно сделать сервисы для решения узких задач. Например, сделать cron-task-у с аналитической выгрузкой с сохранением промежуточных результатов во вспомогательную коллекцию в CouchDB и предостатить уже к ней доступ через http api и сделать человеко-читаемое представление с помощью шаблона.
