52 lines
6.6 KiB
Markdown
52 lines
6.6 KiB
Markdown
# Общая структура
|
||
|
||

|
||
|
||
Основной код приложения написан на TypeScript и фреймворке NestJS (это такой Angular для backend-а)
|
||
|
||
Монолитное приложение включает в своём составе:
|
||
|
||
- основная функциональность
|
||
- кеш и промежуточный коллектор для данных на couchdb
|
||
- http api для внешних интеграций
|
||
- webhook-и и websocket-ы
|
||
- telegram-бот - есть возможность для реализации новых интеграций с другими чат-ботами
|
||
- cron-task-и для выполнения повторяющихся задач
|
||
- frontend server-side на простой шаблонизации
|
||
- frontend на react
|
||
- специальный плагин для lowcode платформы n8n
|
||
|
||
# Основной процесс
|
||
|
||

|
||
|
||
Двигателем приложения служит 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 и сделать человеко-читаемое представление с помощью шаблона.
|