pinkmine/docs/Архитектура.md

6.6 KiB
Raw Permalink Blame History

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

Основной код приложения написан на 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. (подробнее)
  2. Redmine Issue Event Emitter - это очередь для синхронизации данных из redmine. На выход кладётся номер задачи, на выходе данные полученные с помощью redmine api. Очередь обеспечивает бережное отношение к боевому redmine, так как позволяет выполнять выгрузки не выходя за выставленный лимит обращений. (подробнее про работу очереди и подробнее про загрузку задач из redmine)
  3. Преобразование задачи - это набор вспомогательных обработчиков. Позволяет при получении данных произвести попутно полезные изменения, например, привести текстовые теги к массиву, определить текущего ответственного за задачу, обнаружить в описании или в комментариях ссылки на gitlab на MR-ы, в т.ч. можно реализовать специализированный обработчик. (подбронее)
  4. Сохранение задачи в кеш в CouchDB (подробнее)
  5. Анализ изменений в задаче - это сравнение предыдущего состояния задачи с новым. Позволяет организовать процессы связанные с жизненным циклом самой задачи и, например, разослать уведомления с учётом происходящих изменений (подробнее)
  6. Сохранение событий изменения в журнал - вспомогательная коллекция данных (подробнее)

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

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