Skip to content
 
 

Repository files navigation

Проект "Bank Ticket System"

Система управления заявками на банковские продукты

Система разрабатывалась в рамках дисциплины “Высокопроизводительные системы” и в качестве pet-проекта для стажировки в Т-Банке в качестве Java-разработчика. Таже используется мной как демо-проект, например во время работы над моей ВКР.

Общая концепция:

Система включает в себя несколько основных сущностей: пользователи, продукты, заявки, теги и связи между пользователями и продуктами. Пользователи делятся на обычных пользователей (клиентов), менеджеров и админов. Клиенты могут:

  • регистрироваться и авторизовываться (используется spring-security + JWT токен в хедере Authorization);
  • создавать и просматривать продукты, к которым могут относиться как различные банковские услуги, например ипотечные и потребительские кредиты, так и какие-то небольшие товары при необходимости;
  • добавлять новые заявки, в которых указан заявитель и продукт, который ему требуется (например, подача заявки определённым пользователем на определённый тип ипотечного кредита)
  • добавлять и просматривать теги, которые нужны для классификации заявок («альфа-банк», «ипотека», «срочно» и т.д.)
  • связываться с продуктами определённым образом (устанавлить роль относительно продукта) через сущность связи (самый наглядный пример -- определённый пользователь является владельцем определённого продукта (роль PRODUCT_OWNER), поэтому обладает большими правами на взаимодействие с ним).

Менеджеры могут изменять статус заявки (например, когда заявка начинает обрабатываться ставят ON_REVIEW, а когда заявка одобрена ставят APPROVED), админы же могут свободно изменять, удалять, обновлять все сущности, а также изменять роли других пользователей (например, повышать пользователя до роли менеджера или понижать обратно).

У сущности заявки также есть дополнительные внутренние сущности:

  • документы, прикреплённые к конкретным заявкам (например, PDF-файл с заполненным заявлением на получение ипотечного кредита), для которых указывается их название, формат и место хранения;
  • история заявки, в которой подробно указано, как, когда и кем менялся статус заявки

Система реализована в нескольких вариантах, отличающихся в первую очередь архитектурой (монолит Spring Boot; микросервисная архитектура; микросервисная архитектура, с микросервисами выполненными в соответствии с принципами чистой архитектуры), а также дополнительными функциональностями (например, в финальной версии внедрены такие технологии как Kafka и MinIO).

Ссылки на более ранние версии:

Роль в проекте:

Один из двух ведущих разработчиков проекта, отвечавший также за проектирование архитектуры при создании изначальной версии проекта и её доработку в дальнейшем (включая разработку и проведение модульных и интеграционных тестов). Кроме того я отвечал за развёртывание системы и ее системное тестирование.

Техническое описание реализации:

Система написана на современном JVM стеке (Java 21 + Spring Boot) с использованием системы сборки Maven. Код более чем на 70% покрыт модульным и интеграционными тестами с использованием технологий testcontainers и junit-jupiter-api. Для взаимодействия с реляционной БД используется Spring Data JPA, а для хранения документов используется высокопроизводительное объектное хранилище MinIO, полностью совместимое с API Amazon S3. Развёртывание системы полностью автоматизировано через Docker. В качестве пользовательского интерфейса используется развёрнутая с помощью OpenApi 3 и Swagger интерактивная документация. Все микросервисы зарегистрированы в Eureka, их конфигурация автоматически определяется с помощью Config-Server. Доступ к микросервисам осуществляется через Spring Gateway, а для взаимодействия между ними используется Feign Client. Всего реализованы 3 системных микросервиса: config-server, service-discovery (Eureka), gateway и 6 микросервисов с бизнес-логикой:

  • application-service для управления заявками, поступающими в банк;
  • assignment-service, позволяющий задать определённую связь между услугами, предоставляемыми банком, и физическими или юридическими лицами (например, связь “исполнитель услуги”);
  • file-service, контролирующих хранение и редактирование документов, связанных с конкретными заявками, услугами или физ. и юр. лицами;
  • product-service для управления услугами, которые предоставляются банком;
  • tag-service, позволяющий классифицировать заявки по различным группам в зависимости от выданного тега;
  • user-service для регистрации и авторизации клиентов (физических и юридических лиц), а также сотрудников банка и админов системы.

Микросервисы были реализованы с помощью технологий, относящихся к реактивной Java (Reactor и R2DBC), безопасность данных гарантируется с помощью технологий Spring Security, а также использования JWT и алгоритмов хэширования. Уведомления пользователей реализованы с помощью Kafka, также эта технология используется для межсервисного асинхронного взаимодействия. Каждый из микросервисов реализован в соответствии с принципами чистой архитектуры.

Полезные команды терминала и ссылки для тестирования и анализа системы:

docker-compose down -v  # очистка всех томов docker-контейнера, т.е. удаление всех записей из БД
mvn -DskipTests package  # сборка jar-файла
docker-compose up --build  # запуск приложения
mvn -Dtest=*ServiceTest test  # запуск всех unit-тестов
mvn -Dtest=*IntegrationTest test  # запуск всех интеграционных тестов
mvn clean test jacoco:report  # запуск всех тестов для формирования отчёта о покрытии кода

Ссылки для тестирования:

Для ручной проверки запросов использовался Postman (в разделе Headers добавлен заголовок: Content-Type = application/json. Также можно создавать переменные в разделе Variables, например adminId, userId и т. д.)

About

Проект – Bank Ticket System. Финальная версия. Ниже представлена ссылка на описание требований к проекту на разных этапах разработки (ЛР 1-4):

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages