Giter Club home page Giter Club logo

cassette's Issues

Функциональные тесты на модели данных BrokerTypeEntity и BrokerEntity

Необходимо реализовать тесты в отдельном профиле (functests) - application-functests.yml (ЭТУ ЗАДАЧУ РЕАЛИЗОВАТЬ ПОСЛЕ РЕАЛИЗАЦИИ ПРОФИЛЕЙ)

Методология работы тестов должна быть следующей при КАЖДОМ тесте:

  1. Создается новая БД перед тестом
  2. В БД создается структура БД (таблицы, индексы, констрэйнты)
  3. Создаются начальные данные в виде sql-скрипта и вставки этих данных в виде insert инструкций. Это ДОЛЖЕН быть ЕДИНЫЙ скрипт для всех тестов (должен располагаться в src\main\resources\data\db_test_data.sql)
  4. Выполняет тестирование работы с моделью (чтение, сохранение, удаление) при этом особое внимание следует уделить заданию значений по умолчанию, установки связей (Null | не Null) и тестирования каскадности (удаление, обновление). Тестирование моделей осуществляется через их репозитории IBrokerTypeRepository и IBrokerRepository
  5. Удаление (дроп) БД

Подготовить набор entity в соответствии с предложенной схемой модели

Подготовить набор:

  • классов моделей entity (пакет cassette.application.model.entities). Каждый класс модели должен иметь суффикс Entity
  • репозиториев (пакет cassette.application.model.repositories) Каждый интерфейс репозитория должен иметь суффикс Repository

Кроме того необходимо создать агрегирующий интерфейс, в котором нужно создать контракт для получения интерфейсов всех репозиториев (IDbContext) и его имплементацию RockNRollDbContext (ну типа живи быстро, умри молодым, дело в том, что Scope этой имплементации - Request)

Подготовка виртуальной машины

Рекомендуется подготовить VirtualBox виртуальную машина с Linux ОС (например, Mint)
Необходимо ее оснастить:

  • Java (13)
  • Mysql
  • Maven & Gradle
  • Brokers (Kafka & Rabbit & Active Mq)

API контроллер для управления брокерами

После завершения реализации DTO необходимо подготовить:

  1. классы фабрик BrokerTypeFactory и BrokerFactory в пакете factory для конструирования DTO из Entity
  2. классы api контроллеров BrokerTypeController (/api/brokertype) и BrokerController (/api/broker) для выполнения CRUD-операций с типами брокеров и брокерами

Требования к методам:

  • GET /api/{resource} для получения коллекции брокеров
  • GET /api/{resource}/id для получения ресурса по id
  • POST /api/{resource} для создания экземпляра ресурса
  • PUT /api/{resource}/id для редактирования экземпляра ресурса
  • DELETE /api/resource/{id} для удаления экземпляра ресурса

При создании, обновлении и удалении ресурса все операции необходимо вынести в классы -менеджеры (создать пакет managers) для управления ресурсами - BrokerTypeManager и BrokerManager

Разработать схему БД приложения

Необходимо разработать схему БД с учетом того, что приложение должно выполнять следующие функции:

  1. Подключение к брокерам сообщений: RabbitMq, Apache Kafka , Active Mq
  2. Получение списка топиков, создание/удаление топиков
  3. Очистка сообщений из очередей
  4. Формирование сообщения и возможность отправки его как броадкастом, так и определенному адресату

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

Подготовить Spring Boot 2.2.x приложение

Само приложение должно называться как и этот репо - cassete. Для SpringBoot есть инициализатор при работе инициализатора нужно сконфигурировать приложение т.о., чтобы оно использовало Gradle скрипт для сборки, СУБД Postgres, Liquibase (для миграции использовать консольную утилиту: https://github.com/Wissance/SpringUu/blob/master/tools/generateMigration.ps1).

При конфигурировании вариант для сборки через Gradle, но также нужно добавить сборку через maven и проверить, что приложение собирается в запускаемый jar (spring-boot-starter)

Компонент для взаимодействия с брокером ActiveMq

По аналогии с задачей #15 необходимо подготовить интерфейс и имплементацию (скоуп Request) для:

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

Параметры подключения к брокеру - передавать в конструкторе класса, имплементирующего интерфейс

В рамках данной задачи необходимо проверить гипотезу о работоспособности данных методов, а также рассмотреть/предложить другие варианты. Инструмент для отправки сообщений по расписанию будет описан в отдельной задаче

Разработка DTO для вывода данных моделей через Web API

Для каждого entity-класса за исключением базовой entity необходимо реализовать набор DTO для последующего использования в контроллерах Web API:

  • AccountEntity
  • BrokerTypeEntity
  • BrokerEntity
  • MessageStatusEntity
  • MessageEntity

Необходимо в пакете DTO добавить класс DtoTags для того, чтобы форматировать имена полей JSON в формате undderscore, например:

{
    "broker_type": {
        "id": 1,
        "name": "kafka"
    }
}

Необходимо реализовать компонент Scheduler

В данном компоненте должна выполняться работа с отдельными брокерами сообщений внутри Callable-воркеров, которым на вход передаются данные необходимые для:

  • создание экземпляра сервиса подключения к Kafka / ActiveMq
  • отправка сообщений в брокер

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

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

После завершения реализации DTO необходимо подготовить:

  1. класс фабрики AccountFactory в пакете factory для конструирования DTO из Entity
    класс api контроллера AccountController (/api/account) для выполнения CRUD-операций с учетными записями брокеров

Требования к методам:

GET /api/account для получения коллекции учетных записей (УЗ), хеши возвращать не нужно
GET /api/account/id для получения УЗ по id
POST /api/account для создания УЗ (здесь мы передаем пароль в открытом виде)
PUT /api/account/id для редактирования УЗ (здесь мы передаем пароль в открытом виде)
DELETE /api/account/{id} для удаления УЗ, при удалении брокер не должен удаляться

При создании, обновлении и удалении УЗ все операции необходимо вынести в класс -менеджер (создать пакет managers) AccountManager

Также нужно создать класс сервис, выполняющий генерацию хэша, хэш не хуже HmacSha256, но можем рассмотреть и др. варианты. Кроме того в приложении должна задаваться приправа в application_{profilename}.yml и дефолтная приправа в application.yml. работает это так: сохраняемый в БД хэш = приправа + хэш пароля

Функциональные тесты на модели данных AccountEntity

Необходимо реализовать тесты в отдельном профиле (functests) - application-functests.yml (ЭТУ ЗАДАЧУ РЕАЛИЗОВАТЬ ПОСЛЕ РЕАЛИЗАЦИИ ПРОФИЛЕЙ)

Методология работы тестов должна быть следующей при КАЖДОМ тесте:

  1. Создается новая БД перед тестом
  2. В БД создается структура БД (таблицы, индексы, констрэйнты)
  3. Создаются начальные данные в виде sql-скрипта и вставки этих данных в виде insert инструкций. Это ДОЛЖЕН быть ЕДИНЫЙ скрипт для всех тестов (должен располагаться в src\main\resources\data\db_test_data.sql)
  4. Выполняет тестирование работы с моделью (чтение, сохранение, удаление) при этом особое внимание следует уделить заданию значений по умолчанию, установки связей (Null | не Null) и тестирования каскадности (удаление, обновление). работа с моделью тестируется через ее репозиторий - IAccountRepository
  5. Удаление (дроп) БД

Компонент для взаимодействия с брокером kafka

Необходимо создать интерфейс и имплементацию со скоупом Request

ДАННЫЙ ИНТЕРФЕЙС является ПРЕДПОЛОЖИТЕЛЬНЫМ и, ВОЗМОЖНО, он что-то не учитывает. В любом случае необходимо проанализировать какие возможности у нас есть для управления самим брокером и отправки и получения сообщений

public interface IKafkaMessageBroker {
    // Управление топиками
    List<TopicInfo> getAllTopic();
    TopicInfo createTopic(String name);
    Boolean deleteTopic(String name);
    updateTopic(String oldName, String newName);
    Long countTopicMessages(String topicName);
    // Интерфейс чтения и отправки сообщений
   Boolean send(List<String> topics, String message);
   Boolean sendBroadcast(String message);
   MessageData receive(String topicName, Long number, Booleab deleteOnReceive);
}

где:

  • TopicInfo - класс, который в себе содержит информацию о имени топика и его партишионе
  • MessageData - класс, описывающий сообщение и его метаданные

Нам не подойдет использование Kafka из spring, т.к. в любой момент времени мы можем иметь сколько угодно подключений к разным брокерам Kafka (насколько я понял в Spring мы можем использовать только один).

Для управления брокером сообщений необходимо использовать Kafka Admin API (пример смотри здесь - https://www.logicbig.com/tutorials/misc/kafka/admin-api-getting-started.html)

Параметры подключения к брокеру - передавать в конструкторе класса, имплементирующего интерфейс

В рамках данной задачи необходимо проверить гипотезу о работоспособности данных методов, а также рассмотреть/предложить другие варианты. Инструмент для отправки сообщений по расписанию будет описан в отдельной задаче

Конфигурирование приложения и использование профилей

Необходимо добавить возможность конфигурирования приложения черз yml файлы, при этом наиболее общие настройки должны быть вынесены в src\main\resources\application.yml, а более специфичные в src\main\resources\application_{profilename}.yml

У нас будут следующие профили ({profilename}):

  • local
  • develop
  • production
  • functests
  • inegrtests

Необходимо проверить, что при старте приложения подхватывается нужный профиль, для этого предлагается создать дополнительный api контроллер InfoController (/api/info) и реализовать в нем метод GET /api/info

Этот метод должен возвращать на данном этапе следующую информацию:

  • профиль - имя профиля
  • используемую БД (класс драйвера, URL сервера БД и имя используемой БД)

Также в рамках этой задачи необходимо подготовить DTO - ApplicationInfoDto в пакете dto и фабрику ApplicationInfoFactory

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.