diff --git a/existing-spring-boot-app-modification/text-based-guide/existing-spring-boot-app-modification.md b/existing-spring-boot-app-modification/text-based-guide/existing-spring-boot-app-modification.md new file mode 100644 index 0000000..3291675 --- /dev/null +++ b/existing-spring-boot-app-modification/text-based-guide/existing-spring-boot-app-modification.md @@ -0,0 +1,889 @@ +# Amplicode для разработки Spring Boot (Security + Web + Data + Flyway + Kafka) приложения + +В этом гайде мы расскажем, как сделать существующее приложение (Spring PetClinic) готовым к продакшен, переехав с H2 и инициализировать базу данных посредством стандартного механизма Spring на PostgreSQL и Flyway; как реализовать учет заработных плат сотрудников, расширив существующую модель данных и изменив пользовательский интерфейс; как подготовить приложение к разработке мобильного клиента реализовав REST эндпоинты для получения списка ветеринаров, а также списка ветеринаров с возможностью фильтрации их по специальностям; +как реализовать автоматическое назначение ветеринаров новым визитам, а также как настроить оповещение сотрудников о новых визитах через интеграцию с внешним сервисом, используя Kafka. + +Для того чтобы следовать лучшим практикам, все сервисы, как и наше Spring Boot приложение, мы опишем в качестве контейнеров в файле Docker Compose. + +[![Смотреть на Youtube](images/youtube-thumbnail.png)](https://www.youtube.com/watch?v=g5kzePtZ9FQ) + +**Примерное время прочтения: 30 минут.** + +## Введение + +Amplicode - это набор инструментов для максимально эффективной и комфортной разработки сервисов и веб приложений на Spring Boot в IntelliJ IDEA и административного пользовательского интерфейса на React Admin в VSCode. + +Amplicode предоставляет мощную поддержку фреймворка Spring для пользователей IntelliJ IDEA, включая популярные модули, такие как Spring Boot, Spring Web, Spring Data, Spring Security и другие. Также Amplicode облегчает использование связанных с экосистемой Spring технологий, таких как Liquibase и Flyway, MapStruct и Model Mapper, Lombok, Kafka и многих других. + +Кроме того, Amplicode помогает в написании Docker и Docker Compose файлов, что может значительно облегчить процесс разработки и разворачивания приложения для тестирования или демонстрации. А для разработки frontend доступна поддержка React Admin на TypeScript в VSCode. + +К ключевым задачам Amplicode, с которыми он успешно справляется, относятся: +* Ускорение разработчика на всех этапах с целью повышения его эффективности +* Снижение порога входа в поддерживаемые технологии для новичков +* Углубление познаний разработчиков в области corner/edge кейсов +* Придание уверенности в том, что написанный код следует лучшим практикам +* Дополнение GitHub Copilot и IntelliJ IDEA AI + +Стоит отметить, что за разработкой Amplicode стоит команда с богатым опытом, насчитывающим десятилетия, и успешными продуктами с многомиллионной аудиторией. Также Amplicode гарантирует увеличение скорости создания приложений до 80%, а общей производительности команды разработчиков на 30%. + +А теперь давайте посмотрим на Amplicode в действии. + +## Установка Amplicode + +Для того чтобы установить Amplicode: +* Откройте IntelliJ IDEA +* Перейдите в секцию **Plugins** + ![plugins.png](images/plugins.png) +* Нажмите на иконку шестеренки и выберите пункт **Manage Plugin Repositories** + ![manage-plugin-repositories.png](images/manage-plugin-repositories.png) +* В открывшемся окне укажите ссылку на репозиторий Amplicode +```asciidoc +https://amplicode.ru/jetbrains-marketplace +``` +![insert-link.png](images/insert-link.png) +* Находясь на складке **Marketplace**, впишите в поле ввода `Amplicode` и нажмите кнопку **Install**. + ![install-amplicode.png](images/install-amplicode.png) +* Перезапустите IntelliJ IDEA + ![restart-ide.png](images/restart-ide.png) + +## Обзор существующего приложения (через Amplicode Explorer) + +Давайте посмотрим, как Amplicode может помочь в разработке уже существующего Spring Boot приложения. В качестве примера возьмем довольно популярный проект Spring PetClinic. Откройте его в IntelliJ IDEA. В момент первого открытия приложения Amplicode необходимо активировать. + +![activate-amplicode.png](images/activate-amplicode.png) + +После успешной активации все возможности Amplicode станут доступны. Amplicode предоставляет возможность проанализировать приложение в контексте используемых вреймворков и библиотек с помощью панели Amplicode Explorer. + +![amplicode-explorer.png](images/amplicode-explorer.png) + +С помощью этой панели можно узнать следующее: + +* Какие модули подключены к проекту +* Что из себя представляет слой данных + +![data-layer.png](images/data-layer.png) +* Какие эндпоинты доступны в проекте +* Какие файлы, необходимые для развертывания приложения, уже есть в проекте + +Исходя из знаний Amplicode о нашем проекте, можно сделать следующие выводы: + +1. Для удобной работы с персистентным слоем в приложении используется модуль Spring Data JPA. + ![spring-data-jpa.png](images/spring-data-jpa.png) +2. К проекту подключены стартеры Spring Web и Actuator + ![starters.png](images/starters.png) +3. В качестве хранилища данных используется встроенная база данных H2 + ![datasource.png](images/datasource.png) +4. Мы можем более детально ознакомиться с моделью данных нашего приложения, посмотреть, какие основные сущности объявлены в проекте, а также каким образом они связаны друг с другом + ![data-model.png](images/data-model.png) +5. Все доступные MVC и REST эндпоинты могут быть просмотрены в наиболее удобном для нас виде + ![endpoints.png](images/endpoints.png) + +Структура проекта стала более понятной. Приступаем к реализации поставленных задач. + +### H2 -> PostgreSQL + +Первым шагом станет замена встроенной базы данных H2 на PostgreSQL. Amplicode старается придерживаться подходов, с которыми многие разработчики уже давно знакомы, как, например, двойной клик, нажатие правой кнопкой мыши или комбинация клавиш для открытия файла. Amplicode с очень высокой вероятностью поймет любое из этих действий на большинстве визуальных элементов. + +Нас интересует источник данных. Чтобы обратиться к этому элементу в дереве, выполните двойной клик на dataSource. + +![database-type.png](images/database-type.png) + +В открывшемся окне необходимо выполнить следующие действия: +* Изменить тип базы данных +* Указать необходимые параметры, такие как хост, порт, название базы данных, имя пользователя и пароль. +* Нажать **ОК** + +![edit-data-source.png](images/edit-data-source.png) + +Важно отметить, что Amplicode не только обновил значения свойств в файле `application.properties`, но также добавил необходимую зависимость для взаимодействия с базой данных PostgreSQL из нашего приложения. + +![postgres-properties.png](images/postgres-properties.png) + + +![postgres-dependency.png](images/postgres-dependency.png) + +Благодаря панели Amplicode Designer, появляется возможность определить, какие еще свойства, помимо уже объявленных, могут быть использованы в приложении. Например, можно обратить внимание, что для группы Spring JPA доступно такое свойство как Auto DDL. + +![auto-ddl.png](images/auto-ddl.png) + +Благодаря использованию этого свойства со значением `validate`, можно убедиться в том, что JPA модель полностью соответствует схеме, заданной в базе данных. + +![auto-ddl-validate.png](images/auto-ddl-validate.png) + +Также мы можем обратить внимание, что нам доступно свойство Show SQL. Установите это свойство в `true` для удобства отслеживания того, какие именно запросы отправляются в базу данных. + +![shoq-sql.png](images/show-sql.png) + +Осталось только изменить тип базы данных в свойстве `database` на `postgres`. + +![database-postgres.png](images/database-postgres.png) + +Использовать локально поднятые сервисы в современных реалиях является дурным тоном. Из-за использования локальных сервисов возникают проблемы с переносимостью и настройкой окружения каждым из разработчиков на проекте. Намного лучше описать все необходимые сервисы в файле Docker Compose. Используя такой подход, нам достаточно иметь установленный локально Docker либо его аналог. За все остальное можно будет не переживать. + +Amplicode содержит узел Docker в панели Amplicode Explorer. +![docker-in-panel.png](images/docker-in-panel.png) + +С его помощью вы можете создать файл Docker Compose. Для этого нажмите правую кнопку мыши на узле Docker. + +![create-docker-compose.png](images/create-docker-compose.png) + +В открывшемся файле добавьте необходимый нам сервис из числа доступных, воспользовавшись панелью Amplicode Designer, Editor Toolbar или же действием Generate от IntelliJ IDEA. + +![use-generate-in-docker-compose.png](images/use-generate-in-docker-compose.png) + +Amplicode воспользовался уже существующим подключением к базе данных и подставил все необходимые значения в обязательные поля. + +![postgres-parameters-for-docker.png](images/postgres-parameters-for-docker.png) + +Любой из параметров можно менять в случае необходимости, но на текущем этапе вам этого делать не нужно. Достаточно просто нажать **ОК**. Сервис готов. + +![docker-service-ready.png](images/docker-service-ready.png) + +Запустите базу данных, а затем и приложение, чтобы убедиться, что все работает, как и прежде. + +Для запуска базы данных нажмите на значок двойной стрелочки в файле `docker-compose.yaml`. + +![run-database.png](images/run-database.png) + +Первый шаг - переезд на PostgreSQL - успешно осуществлен. + +## Подключение Flyway. Генерация скрипта инициализации БД + +Следующий шаг - добавление инструментов версионирования баз данных. Помимо исследования доступных свойств с помощью Amplicode Designer, мы можем настроить свойства, которые на данном этапе нам пока недоступны ввиду отсутствия необходимых зависимостей. Например, в секции **DB Migration** можно обнаружить необходимый для дальнейшей работы **Flyway**. + +![db-migration-flyway.png](images/db-migration-flyway.png) + +Стоит отметить, что, помимо Flyway, Amplicode может облегчить нам работу и с Liquibase. Все возможности, описанные в этом разделе, доступны также и для тех, кто предпочитает использовать Liquibase. + +Для подключения и настройки Flyway необходимо выполнить описанные ниже действия. + +* Оставьте значение префикса-сепаратора и расположение директории, которая будет содержать сгенерированные скрипты, по умолчанию. + +![db-migration-settings-by-default.png](images/db-migration-settings-by-default.png) + +* Поскольку мы больше не будем использовать встроенные возможности Spring для создания таблиц, нам потребуется скрипт инициализации базы данных. + +![script-init-db.png](images/script-init-db.png) + +* В качестве источника данных следует выбрать базу данных, так как она была успешно проинициализирована и заполнена необходимыми данными на предыдущем шаге. + +![choose-database.png](images/choose-database.png) + +* Для того чтобы Amplicode смог прочитать структуру базы данных и сгенерировать скрипт инициализации, необходимо создать новое подключение либо выбрать уже существующее. + +![existing-connection.png](images/existing-connection.png) + +* Нажмите **ОК**. + +* Amplicode сгенерирует скрипты инициализации базы данных. Прежде чем сохранить их, следует убедиться, что они соответствуют нашим ожиданиям. + +![verifying-initialization-scripts.png](images/verifying-initialization-scripts.png) + +Скрипт инициализации базы данных готов. Ранее существовавшие скрипты инициализации базы данных при наполнении ее данными больше не понадобятся, поэтому необходимо удалить те свойства, которые на них ссылаются. + +![properties-to-delete.png](images/properties-to-delete.png) + +На этом настройка Flyway успешно завершена. Модно переходить к следующему шагу. + +## Изменение модели: добавление базового атрибута + +Следующей задачей является реализация учета заработных плат сотрудников. Для этого прежде всего необходимо расширить существующую модель данных, а именно добавить поле, содержащее информацию о зарплате, в сущность `Vet`. + +Воспользуйтесь панелью Amplicode Designer (**Attributes** -> **Basic Type**) либо панелью **Generate** от IntelliJ IDEA, в которой необходимо выбрать пункт **Entity Attribute**. + +![add-attribute-to-vet-entity.png](images/add-attribute-to-vet-entity.png) + +В открывшемся окне можно полностью настроить атрибут. Прежде всего, необходимо правильно выбрать тип для нового аттрибута. Хорошей практикой при работе с денежными типами данных в Java является использование `BigDecimal`. + +![attribute-setup-window.png](images/attribute-setup-window.png) + + В зависимости от выбранного типа, Amplicode предоставляет дополнительные параметры настройки атрибута. В данном случае это **Precision** и **Scale**. + +![attribute-setup-window.png](images/precision-and-scale.png) + +Оставьте их значения как предложено по умолчанию и нажмите **OK**. Атрибут готов. + +Если обратить внимание на панель Amplicode Designer, то можем увидеть, что нам доступна секция **Validation**, так как в приложении используется одноименный стартер. + +![validation-for-attribute.png](images/validation-for-attribute.png) + +Amplicode знает об этом и позволяет нам выбрать нужные валидации из множества доступных для конкретного атрибута, не обращаясь к поиску в интернете или чтению документации. + +Логичной валидацией в данном случае будет `@PositiveOrZero`. Выберите ее, и Amplicode добавит соответствующую аннотацию. + +![positive-or-zero.png](images/positive-or-zero.png) + +Теперь необходимо внести соответствующие изменения в пользовательский интерфейс, добавив новое поле. + +![change-user-interface.png](images/change-user-interface.png) + +Половина из всех поставленных задач выполнена. Запустите приложение, чтобы убедиться, что все работает должным образом. Приложение не запустилось и выдало ошибку, но почему? + +![error-message-from-app.png](images/error-message-from-app.png) + +Причина заключается в том, что мы добавили новое поле на уровне JPA, но забыли написать соответствующий скрипт для добавления этой колонки в базу данных. Благодаря свойству Hibernate `ddl-auto` со значением `validate` мы обнаружили это несоответствие сразу при запуске приложения. + +Amplicode позволяет вызвать действие по синхронизации модели с базой данных прямо из stacktrace. Для этого нажмите на помеченную на рисунке ниже ссылку: + +![link-in-stacktrace.png](images/link-in-stacktrace.png) + +Появится следующее всплывающее окно: + +![popup-window-from-stacktrace.png](images/popup-window-from-stacktrace.png) + +Проверьте, что выбраны корректный persistence unit и подключение к базе данных и нажмите **ОК**. + +Среди всех скриптов, которые мы видим в окне предпросмотра, можно найти тот самый скрипт, который мы забыли написать для новой колонки. Однако, помимо этого скрипта есть еще более 10 скриптов, которые мы не ожидали увидеть. Давайте разберемся, в чем же дело. + +![script-preview-window.png](images/script-preview-window.png) + +Ранее мы использовали скрипты, в которых не указывали длину для колонок с текстом. Однако, в JPA, когда мы используем аннотацию `@Column`, по умолчанию будет выставлена длина 255. Amplicode об этом знает и предлагает модифицировать длину существующих колонок. Так как подобное изменение может привести к потере данных, то есть, те данные, которые выходят за границу 255 символов, будут удалены, Amplicode подсвечивает нам все эти скрипты красным цветом, так как к ним требуется особое внимание со стороны разработчика. + +![red-scripts.png](images/red-scripts.png) + +Если говорить о цветовой раскраске, то бывают еще скрипты, которые Amplicode отмечает желтым и зеленым цветами. По аналогии с красными скриптами, желтые могут быть потенциально опасны, а вот зеленые абсолютно безопасны и не смогут привести к потере данных. + +![yellow-and-green-scripts.png](images/yellow-and-green-scripts.png) + +Остальные изменения, которые мы видим, точно так же появились здесь ввиду различий между JPA моделью и базой данных, которые, видимо, накопились за долгое время существования проекта. + +Эти изменения выходят за рамки текущих задач, поэтому перенесите их в секцию Ignored. Для этого: + +* Пометьте все переносимые скрипты +* Нажмите правую клавишу мыши +* Во всплывающем меню выберите **Remove and Ignore** + +![remove-and-ignore.png](images/remove-and-ignore.png) + +Amplicode запомнит все эти изменения и не будет предлагать их при последующих генерациях скриптов. + +Наконец, можно заметить, что в этой секции уже были некоторые скрипты. Например, скрипт по удалению индекса из базы данных. Amplicode заранее разместил эти скрипты в секцию Ignored. + +![ignored-by-default.png](images/ignored-by-default.png) + +Такой подход выглядит довольно логичным, так как создание индекса может быть довольно дорогостоящей операцией, а его объявление на уровне модели JPA не является довольно распространенным. Поэтому удалять его мы вряд ли захотим. + +Теперь скрипт нас полностью устраивает. Назовите его `V1__add_salary` и перезапустите приложение. У ранее созданных ветеринаров отсутствует значение для поля зарплаты. Для проверки корректности реализованной функциональности необходимо проинициализировать поля рандомными значениями. Это можно сделать из вкладки local как показано на рисунке ниже: + +![initialize-salaries.png](images/initialize-salaries.png) + +Теперь все должно работать, корректно. + +![vets-with-salaries.png](images/vets-with-salaries.png) + +## Подключение и настройка Spring Security + +Давайте проанализируем, что мы уже сделали. Решив предыдущую задачу, мы столкнулись с небольшой проблемой безопасности. Теперь абсолютно все, даже неаутентифицированные пользователи, могут просматривать информацию о зарплатах сотрудников. Давайте сделаем так, чтобы эту информацию могли видеть только аутентифицированные пользователи. Для этого добавим Spring Security и настроим доступ к эндпоинту. + +Amplicode позволяет добавить и настроить Spring Security через панель Amplicode Explorer. Для этого неоьходимо выбрать **Add Configuration** -> **Spring Security Configuration**. + +![add-spring-security-configuration.png](images/add-spring-security-configuration.png) + +Интуитивно понятные диалоговые окна позволяют настроить один из множества наиболее популярных способов аутентификации и дополнительные параметры, специфичные для каждого из типов. + +![authentication-methods.png](images/authentication-methods.png) + +В данном случае подойдет базовый механизм Spring Security **HTTP session authentication**. Поэтому: + +* Отметьте соответствующий радио баттон и нажмите **Next** + +![authentication-method-step-1.png](images/authentication-method-step-1.png) + +* Оставьте все параметры по умолчанию (в дальнейшем их можно будет изменить, если потребуется); нажмите **Next** + +![authentication-method-step-2.png](images/authentication-method-step-2.png) + +* Убедитесь в правильности настроек и нажмите **Next** + +![authentication-method-step-3.png](images/authentication-method-step-3.png) + +* На последнем шаге можно увидеть, какие новые зависимости будут добавлены к проекту, затем необходимо нажать **Create** + +![authentication-method-step-4.png](images/authentication-method-step-4.png) + + +Конфигурационный класс для Spring Security готов. Перезапустите приложение, чтобы убедиться в том, что теперь информацию о ветеринарах смогут видеть только аутентифицированные пользователи. + +## Модификация существующего REST эндпоинта + +Помимо MVC эндпоинтов в нашем приложении также существует один REST эндпоинт, который могут использовать наши внешние клиенты для получения информации о ветеринарах (класс `Vets`, исходный код приведен ниже). + +```asciidoc +@XmlRootElement +public class Vets { + + private List vets; + + @XmlElement + public List getVetList() { + if (vets == null) { + vets = new ArrayList<>(); + } + return vets; + } + +} +``` + +В качестве возвращаемого значения здесь используется список сущностей. Как следствие, каждое изменение в модели, такое как добавление зарплаты или любого другого поля, будет отражаться и на клиентах. И этого мы, конечно же, не хотим. + +Наиболее распространенным решением этой проблемы является использование DTO в качестве возвращаемого типа. Давайте просто изменим возвращаемый тип на не существующий пока что `VetWithoutSalaryDto`. + +```asciidoc +@XmlRootElement +public class Vets { + + private List vets; + + @XmlElement + public List getVetList() { + if (vets == null) { + vets = new ArrayList<>(); + } + return vets; + } + +} +``` + +Amplicode понял, что мы хотим сделать, и позволяет нам вызвать диалог создания DTO прямо отсюда (нажмите **Alt+Enter** для Windows/Linux или **⌥+Enter** для macOS). + +![create-dto-popup-menu.png](images/create-dto-popup-menu.png) + +Далее: + +* Выберите сущность для DTO + +![select-entity-for-dto.png](images/select-entity-for-dto.png) + +* Создайте абстрактный интерфейс, нажав на ссылку **Add MapStruct DTO mapper dependency to project**: + +![add-mapstruct-link.png](images/add-mapstruct-link.png) + +* Сделайте DTO мутабельным и выберите все поля, кроме зарплаты + +![make-dto-mutable.png](images/make-dto-mutable.png) + +Для ассоциативного поля специальностей Amplicode также предлагает создать DTO. Поэтому: + +* Создайте DTO для специальностей прямо в текущем объекте, выбрав тип **New Nested Class**. + +![dto-for-association.png](images/dto-for-association.png) + +* Нажмите **OK** + +DTO и MapStruct интерфейс готовы к использованию. Исходный код MapStruct интерфейса приведен ниже: + +```asciidoc +@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = MappingConstants.ComponentModel.SPRING) +public interface VetMapper { + Vet toEntity(VetWithoutSalaryDto vetWithoutSalaryDto); + + VetWithoutSalaryDto toDto(Vet vet); + + @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) + Vet partialUpdate(VetWithoutSalaryDto vetWithoutSalaryDto, + @MappingTarget Vet vet); +} +``` + +Теперь нам осталось только преобразовать список возвращаемых сущностей в список DTO в классе `VetController`. Благодаря Java Stream API мы можем это сделать довольно элегантно, а благодаря IntelliJ IDEA мы можем сразу начать писать необходимый оператор вместо предварительного преобразования списка в поток. IDE выведет список подсказок для нашего удобства. + +![conversion.png](images/conversion.png) + +Помимо встроенных вариантов от IntelliJ IDEA, мы можем также сразу заметить новую опцию `mapToVetWithoutSalaryDto` от Amplicode, которая выглядит как именно то, что мы и хотим сделать. Выберите этот вариант. Помимо того генерации кода для преобразования сущности в DTO, мы также получим корректно заинжектированный Bean маппера в наш контроллер. + +![generation-and-bean.png](images/generation-and-bean.png) + +Последнее, что осталось сделать - предоставить доступ к нашему эндпоинту всем без исключения. Amplicode позволяет нам сделать это прямо из исходного кода контроллера. В IntelliJ IDEA практически все визуальные элементы являются кликабельными. Иконки, предоставляемые Amplicode, не являются исключением. + +![click-on-the-lock.png](images/click-on-the-lock.png) + +Кликните на иконку замочка, нажмите на **Add Authorize Rule** и добавьте правило авторизации. Нажмите **OK**. + +![add-authorization-rule.png](images/add-authorization-rule.png) + +Amplicode внесет изменения в существующие параметры доступа к эндпоинту. + +```asciidoc + http.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests + .requestMatchers(HttpMethod.GET, "/vets").permitAll() + .anyRequest().authenticated()); +``` + +Перезапустите приложение и убедимся в том, что все работает корректно. Теперь все приложение доступно только аутентифицированным пользователям, а наш единственный REST эндпоинт - всем без исключения. + +![rest-endpoint.png](images/rest-endpoint.png) + +## Создание REST-контроллера с нуля + +Как мы уже успели заметить ранее, в нашем приложении большинство эндпоинтов реализовано по принципу MVC, и только один из них - REST эндпоинт, объявленный прямо в контроллере MVC. + +![mvc-and-rest-endpoints.png](images/mvc-and-rest-endpoints.png) + +На самом деле, это не лучшая практика. Поэтому наша следующая задача - подготовить приложение к интеграции с мобильным клиентом, создав отдельный REST контроллер для REST эндпоинтов. + +Для этого: +* Прямо в дереве проекта вызовите действие **REST Controller** от Amplicode нажатием правой кнопки мыши + +![rest-controller-action.png](images/rest-controller-action.png) + +* В открывшемся окне укажите название контроллера, пакет, в котором он будет создан, и путь, по которому он будет доступен + +![rest-controller-parameters.png](images/rest-controller-parameters.png) + +* Нажмите **OK** + +По сути, эндпоинты, которые мы хотим реализовать, являются делегацией методов из репозитория. Amplicode предоставляет специальный диалог для делегирования любых методов из любых Bean'ов, существующих в проекте. + +![delegate-from.png](images/delegate-from.png) + +Amplicode автоматически выбрал интерфейс `VetRepository` в качестве источника для делегирования. Это как раз то, что нам нужно. + +![delegation-source.png](images/delegation-source.png) + +Начнем с настройки метода, отвечающего за делегирование метода `findAll`. Его название, путь и тип запроса выбраны автоматически именно такие, которые нам и нужны. + +![name-and-path.png](images/name-and-path.png) + +Единственное, что нам нужно изменить - это возвращаемый тип. Как мы уже говорили ранее, возвращать сущность - не лучшая идея. Можно создать новую DTO и маппер к ней прямо отсюда либо воспользоваться уже существующей DTO. Используйте вторую опцию, так как у нас уже есть класс `VetWithoutSalaryDto`. + +![return-type-dto.png](images/return-type-dto.png) + +Перед закрытием диалога можно предварительно посмотреть код, который будет сгенерирован, чтобы убедиться, что все сделано верно. Помимо самого метода, Amplicode также инжектирует необходимые Bean'ы в контроллер. + +![code-preview.png](images/code-preview.png) + +Нажмите **OK**. + +Второй метод, который необходимо реализовать - это метод для получения ветеринаров только определенной специальности. Для этого понадобится добавить новый метод в репозиторий. + +Перейдите к классу `VetRepository` и создайте метод поиска коллекции сущностей, используя панель Generate от intelliJ IDEA. + +![generate-repository-method.png](images/generate-repository-method.png) + +![method-find-collection.png](images/method-find-collection.png) + +В качестве параметра запроса укажите специальности, а в качестве оператора поиска - условие `in`. Нажмите **OK**. + +![create-collection-window.png](images/create-collection-window.png) + +Метод готов, и теперь следует делегировать его прямо в контроллер, воспользовавшись опцией **Delegate to** из панели Editor Toolbar. + +![delegete-to.png](images/delegate-to.png) + +В открывшемся окне выберите тот контроллер, в который мы хотим делегировать данный метод. + +![select-controller.png](images/select-controller.png) + +Следующее, что нужно сделать - настроить параметры метода контроллера. Мы реализовали метод по поиску ветеринаров, принадлежащих к определенной специальности. + +![method-implementation.png](images/method-implementation.png) + +Подобная реализация крайне понятна в использовании, а также более поддерживаема в дальнейшем ввиду наличия типизации. Но, реализуя REST эндпоинт, нам бы хотелось получать всех ветеринаров, принадлежащих к определенным специальностям, указывая только их идентификатор. Amplicode прекрасно понимает, что такое требование является довольно распространенным, и предоставляет удобный способ его реализации. + +В выпадающем списке для параметров метода `Specialties` выберите метод уже существующего репозитория `SpecialtyRepository`, который обернет полученный из запроса идентификатор в прокси-объект без дополнительных запросов в базу данных. + +![select-existing-method.png](images/select-existing-method.png) + +Аналогично ранее созданному эндпоинту, измените возвращаемый тип на DTO и нажмите **OK**. + +![change-type-to-dto.png](images/change-type-to-dto.png) + +Укажите путь к эндпоинту, воспользовавшись панелью Amplicode Designer. + +![specify-path.png](images/specify-path.png) + +Отлично! Все, что нам осталось сделать - настроить Spring Security, сделав все REST эндпоинты общедоступными. Для этого воспользуйтесь замочком над классом и выберите в качестве правил доступа значение `Permit all`. + +![permit-all.png](images/permit-all.png) + +### Тестирование эндпоинта + +Есть довольно много способов протестировать работоспособность нашего кода. Можно было бы обратиться к эндпоинтам через стороннего HTTP клиента вроде Postman, через браузер, как мы это делали ранее или через `curl` команды прямо из терминала. Но с Amplicode для нас открывается еще одна возможность реализовать проверку, пожалуй, еще более быстрым способом и еще более полезным в дальнейшем. А именно, используя `@WebMvcTest`. + +На самом деле, тема тестирования довольно обширная и выходит за рамки наших сегодняшних целей. Более подробно мы расскажем о том, как Amplicode может помочь вам в тестировании Spring Boot приложения, в одном из следующих видео. А сегодня давайте сгенерируем тесты, которые позволят нам убедиться в том, что наши REST эндпоинты возвращают нужный статус. + +* Откройте меню Generate от IntelliJ IDEA +* Создайте новый тестовый класс + +![create-new-test-class.png](images/create-new-test-class.png) + +* В качестве тестового контекста выберите Spring Boot Application. + +![select-context.png](images/select-context.png) + +* Пометьте оба метода как тестируемые +* Отключите CSRF + +![both-methods.png](images/both-methods.png) + +* Настройте входные параметры для метода поиска по специальности как показано на рисунке. + +![search-by-speciality-parameters.png](images/search-by-speciality-parameters.png) + +* Нажмите **OK**. + +Чтобы запустить тесты, воспользуйтесь специальной иконкой в исходном коде тестового класса: + +![run-the-tests.png](images/run-the-tests.png) + +Если тесты прогнались удачно, вы должны увидеть примерно следующую картину: + +![test-no-errors.png](images/test-no-errors.png) + +## Изменение модели: добавление ассоциативной связи + +Следующей задачей, которую предстоит решить, является реализация логики по автоматическому назначению ветеринара новому визиту. Для того чтобы реализовать подобную функциональность, сначала нужно вновь расширить существующую модель, добавив ассоциативную связь "Многие к одному" от визита к ветеринару. Воспользуйтесь уже знакомым нам действием по добавлению нового атрибута. В качестве типа атрибута укажем ветеринара. + +![add-attribute-vet.png](images/add-attribute-vet.png) + +Все параметры в данном случае нас полностью устраивают. Стоит отметить, что Amplicode позволяет создавать любой тип ассоциативной связи; более того, он всегда сможет подсказать вам, какая из реализаций будет дучше в плане производительности, благодаря умным подсказкам. + +**Пример:** +![smart-prompt.png](images/smart-prompt.png) + +Однако, в данном случае вам надлежит оставить все параметры без изменений и просто нажать **OK**. + +Атрибут готов. Не забудьте внести изменения на UI, а также сгенерировать скрипт миграции. + +## Написание бизнес логики + +Бизнес логику в Spring приложениях принято реализовывать в классах, помеченных аннотацией `@Service`. Давайте создадим такой класс. Помимо обычного класса, среди доступных опций можем обратить внимание на отдельно стоящий элемент **Spring Service** от Amplicode. Давайте им и воспользуемся. Нажмите на Spring Service в меню New, как показано на рисунке. + +![new-spring-service.png](images/new-spring-service.png) + +В появившемся окне введите имя класса и нажмите **OK**. + +![enter-class-name.png](images/enter-class-name.png) + +Amplicode создаст пустой класс под реализацию бизнес логики. + +Логика нахождения подходящего ветеринара будет довольно простой. В случае, если у питомца уже были визиты в клинику, то выберем последнего ветеринара, работавшего с питомцем. В случае же, если визитов ранее не было, будем назначать любого из ветеринаров с профессией хирурга. + +Давайте приступим к реализации. Сначала надо получить список визитов переданного питомца. Если список пуст, то нам нужно найти любого из ветеринаров с идентификатором специальности, равным идентификатору специальности "Хирург". Для этого обратимся к интерфейсу `VetRepository` и попробуем найти подходящий метод. Вместе с Amplicode нам не нужно думать о том, какие Bean'ы уже заинжектированы в текущий сервис, а какие нет. Мы можем начать писать имя нужного нам Bean, выбрать его из списка, а Amplicode сделает все необходимое для того, чтобы мы смогли им воспользоваться. + +![auto-assignment-code.png](images/auto-assignment-code.png) + +Среди существующих методов репозитория нам ни один не подходит. Однако есть возможность создать новый метод прямо отсюда благодаря действию `find` с многоточием. + +![find-with-three-dots.png](images/find-with-three-dots.png) + +В качестве типа репозитория выберите тип поиска коллекции сущности. + +![search-for-entity-collection.png](images/search-for-entity-collection.png) + +Amplicode откроет диалог создания нового метода в уже существующем репозитории. Для этого даже не требуется покидать текущий редактор кода. Нажмите на ссылку **Add query condition**. + +![create-new-method-dialog.png](images/create-new-method-dialog.png) + +Чтобы реализовать поиск ветеринара по `id` специальности: +* Нажмите на икону с тремя точками в колонке **Attribute** в таблице + +![click-three-dots.png](images/click-three-dots.png) + +* Выберите поле `id` из списка + +![choose-attribute-window.png](images/choose-attribute-window.png) + +* Выберите условие `in` из списка в колонке **Condition** + +![choose-condition.png](images/choose-condition.png) + +* Нажмите **OK** + +Метод в репозитории создан, и его вызов сгенерирован в нашем сервисе. Осталось только реализовать логику нахождения ветеринара, работавшего последним с нашим питомцем. Финальный код метода будет иметь следующий вид: + +```asciidoc +@Service +public class VetAutoAssignmentService { + + public static final int SURGERY_ID = 2; + private final VetRepository vetRepository; + + public VetAutoAssignmentService(VetRepository vetRepository) { + this.vetRepository = vetRepository; + } + + public Vet findAppropriateVet(Pet pet) { + List visits = pet.getVisits() + .stream() + .toList(); + if (visits.isEmpty() || visits.stream() + .noneMatch(v -> v.getVet() != null)) { + return vetRepository.findBySpecialties_IdIn(Collections.singleton(SURGERY_ID)) + .stream() + .findAny() + .orElseThrow(); + } + return visits.stream() + .filter(v -> v.getVet() != null) + .max(Comparator.comparing(Visit::getDate)) + .orElseThrow() + .getVet(); + } +} +``` + +Сервис готов к использованию. Давайте воспользуемся Amplicode Explorer, чтобы быстро найти эндпоинт для создания нового визита. Скорее всего, в пути к подобному эндпоинту должны содержаться слова visit и new. Действительно, подобный POST эндпоинт существует в проекте. + +![visit-new-endpoint.png](images/visit-new-endpoint.png) + +Первым делом обратимся к нашему сервису по имени vetAutoAssignmentService` + +```asciidoc +vetAutoAssignmentService.findAppropriateVet(pet); +``` + +В текущем эндпоинте у нас еще нет объекта `pet`, есть только его идентификатор. Давайте аналогичным образом заинжектируем репозиторий для сущности `Pet` и обратимся к методу `getReferenceById`, чтобы обернуть идентификатор в объект. + +Начните писать petRepository. +Оказывается, у нас в проекте еще не было репозитория для сущности `Pet`. Несмотря на это, Amplicode понял, что именно мы хотим сделать, и вывел всплывающее окно, позволяющее совместить сразу несколько действий в одно: создание нового репозитория, его инжекция и генерация обращений к нему. + +![popup-prompt.png](images/popup-prompt.png) + +Выберите `petRepository`. Появится следующее выплывающее окно: + +![create-pet-repository.png](images/create-pet-repository.png) + +Нажмите **OK**. Недостающий класс будет создан в проекте. + +Amplicode настолько хорошо понимает наш проект, что предлагает заинжектировать даже еще не существующие Bean'ы. + +Обратимся к методу `getReferenceById`, чтобы получить объект. Передадим его в метод сервиса и наконец установим объекту `visit` выбранного ветеринара. + +```asciidoc + Pet pet = petRepository.getReferenceById(petId); + Vet vet = vetAutoAssignmentService.findAppropriateVet(pet); + visit.setVet(vet); +``` + +Запустите приложение и попробуйте создать новый визит. + +![create-new-visit.png](images/create-new-visit.png) + +Если все сделано правильно, ветеринар будет успешно назначен автоматически. + +![vet-automatically-assigned.png](images/vet-automatically-assigned.png) + +Еще одна задача решена. Можно двигаться дальше. + +## Подключение и настройка Kafka + +Следующей задачей для нас будет настройка отправки сообщений в Kafka и их получение из нее. Для этого нам сначала нужно подключить саму Kafka к проекту. Давайте воспользуемся Amplicode Explorer, чтобы создать новую Kafka конфигурацию. +Для этого: + +* Нажмите правой клавишей мыши на пункте **Configurations** +* Выберите **Add Configuration** и затем **Kafka Configuration**. + +![kafka-configuration.png](images/kafka-configuration.png) + +Создадим новый конфигурационный класс для настроек, связанных с Kafka, воспользовавшись для этого появившимся всплывающим окном. Для этого нажмите на иконку плюса рядом с полем **Configuration class** и затем в новом маленьком окошке нажмите **OK**. + +![kafka-configuration-class.png](images/kafka-configuration-class.png) + +Далее, в качестве значения для идентификатора группы потребителей укажите `visit`, а все остальные параметры оставьте по умолчанию и нажмите **OK**. + +![specify-group-id.png](images/specify-group-id.png) + +Amplicode добавит необходимую зависимость, настроит значения в файле свойств и создаст все необходимые компоненты для новой конфигурации. Кроме того, Amplicode сразу же предложит нам добавить Kafka в качестве сервиса в Docker Compose. + +![docker-compose-suggestion.png](images/docker-compose-suggestion.png) + +Воспользуйтесь этим предложением, нажав на соответствующую ссылку. Оставьте все настройки по умолчанию и нажмите **OK**. + +Запустите Kafka, чтобы убедиться, что все работает корректно. Для этого в файле `docker-compose.yaml` нажмите соответствующую иконку стрелочки. + +![run-kafka.png](images/run-kafka.png) + +### Отправка сообщений в Kafka + +Теперь нам нужно настроить отправку сообщений в очередь после добавления, удаления и изменения визитов в базе данных. Для этого будет удобно воспользоваться Hibernate Event Listener, чтобы отслеживать изменения с помощью механизма, представленного Hibernate. + +Откройте меню создания новых элементов в дереве проекта и в разделе **Other** найдите **Hibernate Event Listener**. + +![hibernate-event-listener.png](images/hibernate-event-listener.png) + +Далее: + +* Переименуйте класс в `VisitHibernateEventListener` + +![rename-listener.png](images/rename-listener.png) + +* Выберите типы событий, на которые будет реагировать наш слушатель + +![choose-events.png](images/choose-events.png) + +* Укажите сущность + +![specify-entity.png](images/specify-entity.png) + +* Нажмите **OK** + +![listener-basis.png](images/listener-basis.png) + +Класс-основа для слушателя будет сгенерирован. + +Теперь осталось только реализовать логику отправки сообщений в очередь. + +Измените возвращаемое значение в методе `requiresPostCommitHandling` с `false` на `true`, чтобы разрешить Hibernate выполнять всю описанную выше логику после коммита. + +![false-to-true.png](images/false-to-true.png) + +Снова придерживаясь уже известного правила о том, что лучше отправлять DTO, а не сущность, воспользуйтесь постфиксом `mapTo` для преобразования сущности в DTO. + +![use-mapto.png](images/use-mapto.png) + +В качестве типа для DTO выберите **Java Record**, отметьте все базовые поля, а для ветеринара - только идентификатор, как показано на рисунке. + +![create-dto-for-kafka.png](images/create-dto-for-kafka.png) + +Также, необходимо создать новый MapStruct интерфейс. + +![new-mapstruct-interface.png](images/new-mapstruct-interface.png) + +Далее, нажмите **OK**, чтобы завершить генерацию кода для DTO. + +Теперь необходимо воспользоваться еще одним постфиксом `send`, чтобы настроить отправку сообщений в очередь. + +![postfix-send.png](images/postfix-send.png) + +После нажатия на send появится следующее диалоговое окно: + +![kafka-template-dialog.png](images/kafka-template-dialog.png) + +Нажмите **Next**. + +Сериализаторы для ключа и значения выбраны правильно. + +![serializers.png](images/serializers.png) + +Нажмите **Next**. + +Надо изменить только конфигурационный класс, в котором будет зарегистрирован новый Kafka template. + +![kafka-template-configuration-class.png](images/kafka-template-configuration-class.png) + +Выберите `KafkaConfiguration` из выпадающего списка и нажмите **Create**. + +![click-create.png](images/click-create.png) + +Kafka template с нужными типами создан и уже внедрен в класс. + +![kafka-template-in-code.png](images/kafka-template-in-code.png) + +Осталось только указать название очереди, в нашем случае, `visit`. + +![specify-visit.png](images/specify-visit.png) + +При желании можете скопировать следующий код напрямую из текста гайда: + +```asciidoc +kafkaTemplate.send("visit", visitMapper.toDto(visit)); +``` + +Теперь скопируйте получившуюся строку в остальные обработчики событий. + +![copy-to-all-handlers.png](images/copy-to-all-handlers.png) + +Отправка сообщений в очередь полностью настроена. + +### Получение сообщений из Kafka + +Чтобы убедиться в том, что все работает, реализуем получение сообщений из брокера. Для того чтобы настроить получение сообщений из Kafka в Spring, необходимо создать новый сервис. Воспользуйтесь меню **New** и выберите **Spring Service**. + +![new-spring-service-for-receiving-messages.png](images/new-spring-service-for-receiving-messages.png) + +Появится диалоговое окно. Назовите новый класс `KafkaVisitService` и нажмите **OK**. + +![kafka-visit-service.png](images/kafka-visit-service.png) + +Новый класс будет сгенерирован и открыт в редакторе IDE. + +Механизм получения сообщения Spring для Kafka реализуется через слушатель. Amplicode позволяет нам создать их с помощью Amplicode Designer. + +![amplicode-designer-for-kafka.png](images/amplicode-designer-for-kafka.png) + +Нажмите на **@KafkaListener** и из выпадающего списка выберите **New Container**. + +![new-container.png](images/new-container.png) + +В открывшемся окне выберите тип ключа (`String`) и тип значения (`VisitDto`), затем нажмите **Next**. + +![key-type-value-type.png](images/key-type-value-type.png) + +На данный момент оставьте без изменения сериализаторы, которые предлагает Amplicode, и в случае необходимости вы всегда сможете изменить их значения потом. Нажмите **Next**. + +Выберите конфигурационный класс, в котором будет создан необходимый компонент. Для этого, аналогично тому, как это было сделано в предыдущем разделе, выберите `KafkaConfiguration` из выпадающего списка и нажмите **Create**. + +Kafka слушатель готов. Для демонстрации достаточно просто залоггиовать то, что приходит из очереди с названием `visit`. Запустите приложение и создайте новый визит. + +Если все работает корректно, новый визит должен отобразиться в логах. + +![new-visit-in-logs.png](images/new-visit-in-logs.png) + +## Контейнеризация Spring Boot приложения + +В качестве финального шага реализуем возможность запуска приложения также из Docker Compose. С Amplicode весь процесс не займет более двух минут. + +* В Amplicode Designer, Editor Toolbar или Generate menu выберите Spring Boot приложение. + +![select-spring-boot-three-ways.png](images/select-spring-boot-three-ways.png) + +* Образ будет создаваться из `Dockerfile`, который нам также предварительно потребуется создать, для чего воспользуйтесь иконкой "плюс" рядом с полем **Dockerfile**: + +![create-dockerfile.png](images/create-dockerfile.png) + +* Пометьте чекбокс **Include application build stage**, чтобы включить стадию сборки нашего приложения, а настройки Gradle оставьте по умолчанию + +* Нажмите **OK** + +* В качестве зависимых сервисов выберите Postgres + +![depends-on-postgres.png](images/depends-on-postgres.png) + +* Нажмите **OK** еще раз + +Теперь нужно изменить значения свойств в `application.properties`. Так как Kafka и Postgres больше не будут располагаться на localhost, для образа, поднятого в Docker, добавьте переменные окружения, чтобы указать валидные пути к сервисам. Для этого необходимо открыть файл `application.properties` и воспользоваться контекстным действием от Amplicode (нажмите **Alt+Enter** для Windows/Linux или **⌥+Enter** для macOS). + +![context-action.png](images/context-action.png) + +Пользуясь пунктом меню **Wrap property value with environment variable**, укажите значения, которые будут использоваться при запуске в Docker Compose. + +![environment-variables.png](images/environment-variables.png) + +Запустите приложение и проверьте, все ли работает, как прежде. Теперь, используя Docker Compose, вам не составит никакого труда задеплоить приложение для тестирования или демонстрации. + +## Заключение + +Давайте вспомним еще раз, какие задачи были поставлены перед нами в этом гайде. + +* Сделать приложение production-ready, а именно переехать с H2 и инициализировать базу данных посредством стандартного механизма Spring на PostgreSQL и Flyway в качестве системы версионирования базы данных +* Реализовать учет заработных плат сотрудников, расширив существующую модель данных и изменив пользовательский интерфейс (При этом важно будет сохранить обратную совместимость с имеющимся API, а также подключить и настроить Spring Security таким образом, чтобы информацию о зарплатах не могли получить все желающие) +* Подготовить приложение к разработке мобильного клиента, а именно, реализовать REST эндпоинты для получения списка ветеринаров, а также списка ветеринаров с возможностью фильтрации их по специальностям +* Реализовать автоматическое назначение ветеринаров новым визитам +* Настроить оповещение сотрудников о новых визитах через интеграцию с внешним сервисом, используя Kafka +* Описать все сервисы, как и Spring Boot приложение, в качестве контейнеров в файле Docker Compose + +Мы реализовали все поставленные перед нами задачи менее чем за 30 минут. На самом деле, Amplicode содержит еще множество фич, которые просто не уместились в данный гайд. Если говорить о Spring Boot, то не были показаны, но также заслуживают внимания следующие возможности Amplicode: + +* Поддержка Spring Data MongoDB +* Поддержка Spring Data JDBC +* Возможность создания JPA сущностей из таблиц базы данных +* Поддержка Spring Events и Spring Cloud +* И многое другое + +Кроме помощи в написании backend, Amplicode также помогает и при разработке frontend, предоставляя: + +* Создание React Admin модуля +* Генерацию типовых экранов для CRUD +* Помощь в разработке экранов на React Admin + +Кроме того, мы также частично продемонстрировали поддержку деплоймента в данном видео. Но на самом деле она еще более обширная и включает в себя: + +* Помощь при написании GitLab/GitHub CI actions +* Поддержку при разработке Kubernetes/Helm +* А также развертывание в облаке + +В ближайшем будущем мы постараемся раскрыть озвученные ранее возможности в наиболее полном объеме в отдельных видео. А если вы заинтересовались Amplicode и хотите самостоятельно изучить его возможности, то присоединяйтесь к нашему Telegram каналу. Там вы найдете все необходимое для того, чтобы начать получать максимальное удовольствие от разработки вместе с Amplicode. + diff --git a/existing-spring-boot-app-modification/text-based-guide/images/activate-amplicode.png b/existing-spring-boot-app-modification/text-based-guide/images/activate-amplicode.png new file mode 100644 index 0000000..f4fb2c7 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/activate-amplicode.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/add-attribute-to-vet-entity.png b/existing-spring-boot-app-modification/text-based-guide/images/add-attribute-to-vet-entity.png new file mode 100644 index 0000000..7e7d534 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/add-attribute-to-vet-entity.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/add-attribute-vet.png b/existing-spring-boot-app-modification/text-based-guide/images/add-attribute-vet.png new file mode 100644 index 0000000..c86e0fb Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/add-attribute-vet.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/add-authorization-rule.png b/existing-spring-boot-app-modification/text-based-guide/images/add-authorization-rule.png new file mode 100644 index 0000000..636d6c9 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/add-authorization-rule.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/add-mapstruct-link.png b/existing-spring-boot-app-modification/text-based-guide/images/add-mapstruct-link.png new file mode 100644 index 0000000..5441fe8 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/add-mapstruct-link.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/add-spring-security-configuration.png b/existing-spring-boot-app-modification/text-based-guide/images/add-spring-security-configuration.png new file mode 100644 index 0000000..5376c74 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/add-spring-security-configuration.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/amplicode-designer-for-kafka.png b/existing-spring-boot-app-modification/text-based-guide/images/amplicode-designer-for-kafka.png new file mode 100644 index 0000000..be77662 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/amplicode-designer-for-kafka.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/amplicode-explorer.png b/existing-spring-boot-app-modification/text-based-guide/images/amplicode-explorer.png new file mode 100644 index 0000000..9f0736e Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/amplicode-explorer.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/attribute-setup-window.png b/existing-spring-boot-app-modification/text-based-guide/images/attribute-setup-window.png new file mode 100644 index 0000000..cb453cc Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/attribute-setup-window.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-1.png b/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-1.png new file mode 100644 index 0000000..b4e8771 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-1.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-2.png b/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-2.png new file mode 100644 index 0000000..398ef8d Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-2.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-3.png b/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-3.png new file mode 100644 index 0000000..99d3efb Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-3.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-4.png b/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-4.png new file mode 100644 index 0000000..f7cc7ed Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/authentication-method-step-4.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/authentication-methods.png b/existing-spring-boot-app-modification/text-based-guide/images/authentication-methods.png new file mode 100644 index 0000000..d6763dd Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/authentication-methods.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/auto-assignment-code.png b/existing-spring-boot-app-modification/text-based-guide/images/auto-assignment-code.png new file mode 100644 index 0000000..2cdb57b Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/auto-assignment-code.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/auto-ddl-validate.png b/existing-spring-boot-app-modification/text-based-guide/images/auto-ddl-validate.png new file mode 100644 index 0000000..c4c72af Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/auto-ddl-validate.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/auto-ddl.png b/existing-spring-boot-app-modification/text-based-guide/images/auto-ddl.png new file mode 100644 index 0000000..d3c0124 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/auto-ddl.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/both-methods.png b/existing-spring-boot-app-modification/text-based-guide/images/both-methods.png new file mode 100644 index 0000000..ab2bedf Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/both-methods.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/change-type-to-dto.png b/existing-spring-boot-app-modification/text-based-guide/images/change-type-to-dto.png new file mode 100644 index 0000000..ee8d4b0 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/change-type-to-dto.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/change-user-interface.png b/existing-spring-boot-app-modification/text-based-guide/images/change-user-interface.png new file mode 100644 index 0000000..77042bf Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/change-user-interface.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/choose-attribute-window.png b/existing-spring-boot-app-modification/text-based-guide/images/choose-attribute-window.png new file mode 100644 index 0000000..9efd6f5 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/choose-attribute-window.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/choose-condition.png b/existing-spring-boot-app-modification/text-based-guide/images/choose-condition.png new file mode 100644 index 0000000..c7c1419 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/choose-condition.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/choose-database.png b/existing-spring-boot-app-modification/text-based-guide/images/choose-database.png new file mode 100644 index 0000000..48fbfe6 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/choose-database.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/choose-events.png b/existing-spring-boot-app-modification/text-based-guide/images/choose-events.png new file mode 100644 index 0000000..2fd17b8 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/choose-events.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/click-create.png b/existing-spring-boot-app-modification/text-based-guide/images/click-create.png new file mode 100644 index 0000000..5a20bb6 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/click-create.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/click-on-the-lock.png b/existing-spring-boot-app-modification/text-based-guide/images/click-on-the-lock.png new file mode 100644 index 0000000..d725745 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/click-on-the-lock.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/click-three-dots.png b/existing-spring-boot-app-modification/text-based-guide/images/click-three-dots.png new file mode 100644 index 0000000..100caf0 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/click-three-dots.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/code-preview.png b/existing-spring-boot-app-modification/text-based-guide/images/code-preview.png new file mode 100644 index 0000000..b4390ff Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/code-preview.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/context-action.png b/existing-spring-boot-app-modification/text-based-guide/images/context-action.png new file mode 100644 index 0000000..774a69c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/context-action.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/conversion.png b/existing-spring-boot-app-modification/text-based-guide/images/conversion.png new file mode 100644 index 0000000..0b26f26 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/conversion.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/copy-to-all-handlers.png b/existing-spring-boot-app-modification/text-based-guide/images/copy-to-all-handlers.png new file mode 100644 index 0000000..0c53b2f Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/copy-to-all-handlers.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-collection-window.png b/existing-spring-boot-app-modification/text-based-guide/images/create-collection-window.png new file mode 100644 index 0000000..7293dc5 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-collection-window.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-docker-compose.png b/existing-spring-boot-app-modification/text-based-guide/images/create-docker-compose.png new file mode 100644 index 0000000..f3da85e Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-docker-compose.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-dockerfile.png b/existing-spring-boot-app-modification/text-based-guide/images/create-dockerfile.png new file mode 100644 index 0000000..45ac20a Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-dockerfile.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-dto-for-kafka.png b/existing-spring-boot-app-modification/text-based-guide/images/create-dto-for-kafka.png new file mode 100644 index 0000000..ee9789c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-dto-for-kafka.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-dto-popup-menu.png b/existing-spring-boot-app-modification/text-based-guide/images/create-dto-popup-menu.png new file mode 100644 index 0000000..7029f6c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-dto-popup-menu.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-new-method-dialog.png b/existing-spring-boot-app-modification/text-based-guide/images/create-new-method-dialog.png new file mode 100644 index 0000000..79a0ea7 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-new-method-dialog.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-new-test-class.png b/existing-spring-boot-app-modification/text-based-guide/images/create-new-test-class.png new file mode 100644 index 0000000..8554301 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-new-test-class.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-new-visit.png b/existing-spring-boot-app-modification/text-based-guide/images/create-new-visit.png new file mode 100644 index 0000000..29bbc1e Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-new-visit.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/create-pet-repository.png b/existing-spring-boot-app-modification/text-based-guide/images/create-pet-repository.png new file mode 100644 index 0000000..f70e0cd Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/create-pet-repository.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/data-layer.png b/existing-spring-boot-app-modification/text-based-guide/images/data-layer.png new file mode 100644 index 0000000..4bedfb8 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/data-layer.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/data-model.png b/existing-spring-boot-app-modification/text-based-guide/images/data-model.png new file mode 100644 index 0000000..e33cb81 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/data-model.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/database-postgres.png b/existing-spring-boot-app-modification/text-based-guide/images/database-postgres.png new file mode 100644 index 0000000..d495dab Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/database-postgres.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/database-type.png b/existing-spring-boot-app-modification/text-based-guide/images/database-type.png new file mode 100644 index 0000000..0525bb4 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/database-type.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/datasource.png b/existing-spring-boot-app-modification/text-based-guide/images/datasource.png new file mode 100644 index 0000000..585104d Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/datasource.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/db-migration-flyway.png b/existing-spring-boot-app-modification/text-based-guide/images/db-migration-flyway.png new file mode 100644 index 0000000..0fd9c5d Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/db-migration-flyway.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/db-migration-settings-by-default.png b/existing-spring-boot-app-modification/text-based-guide/images/db-migration-settings-by-default.png new file mode 100644 index 0000000..8d86e1f Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/db-migration-settings-by-default.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/delegate-from.png b/existing-spring-boot-app-modification/text-based-guide/images/delegate-from.png new file mode 100644 index 0000000..c8262a2 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/delegate-from.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/delegate-to.png b/existing-spring-boot-app-modification/text-based-guide/images/delegate-to.png new file mode 100644 index 0000000..4ff736f Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/delegate-to.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/delegation-source.png b/existing-spring-boot-app-modification/text-based-guide/images/delegation-source.png new file mode 100644 index 0000000..571de50 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/delegation-source.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/depends-on-postgres.png b/existing-spring-boot-app-modification/text-based-guide/images/depends-on-postgres.png new file mode 100644 index 0000000..1fd606f Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/depends-on-postgres.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/docker-compose-suggestion.png b/existing-spring-boot-app-modification/text-based-guide/images/docker-compose-suggestion.png new file mode 100644 index 0000000..39f231c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/docker-compose-suggestion.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/docker-in-panel.png b/existing-spring-boot-app-modification/text-based-guide/images/docker-in-panel.png new file mode 100644 index 0000000..da73f74 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/docker-in-panel.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/docker-service-ready.png b/existing-spring-boot-app-modification/text-based-guide/images/docker-service-ready.png new file mode 100644 index 0000000..14494b4 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/docker-service-ready.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/dto-for-association.png b/existing-spring-boot-app-modification/text-based-guide/images/dto-for-association.png new file mode 100644 index 0000000..adf2fe0 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/dto-for-association.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/edit-data-source.png b/existing-spring-boot-app-modification/text-based-guide/images/edit-data-source.png new file mode 100644 index 0000000..ec2ed72 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/edit-data-source.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/endpoints.png b/existing-spring-boot-app-modification/text-based-guide/images/endpoints.png new file mode 100644 index 0000000..24007c5 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/endpoints.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/enter-class-name.png b/existing-spring-boot-app-modification/text-based-guide/images/enter-class-name.png new file mode 100644 index 0000000..b9dc10e Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/enter-class-name.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/environment-variables.png b/existing-spring-boot-app-modification/text-based-guide/images/environment-variables.png new file mode 100644 index 0000000..17f1e28 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/environment-variables.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/error-message-from-app.png b/existing-spring-boot-app-modification/text-based-guide/images/error-message-from-app.png new file mode 100644 index 0000000..dd95c64 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/error-message-from-app.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/existing-connection.png b/existing-spring-boot-app-modification/text-based-guide/images/existing-connection.png new file mode 100644 index 0000000..69e214e Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/existing-connection.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/false-to-true.png b/existing-spring-boot-app-modification/text-based-guide/images/false-to-true.png new file mode 100644 index 0000000..4a5c4e8 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/false-to-true.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/find-with-three-dots.png b/existing-spring-boot-app-modification/text-based-guide/images/find-with-three-dots.png new file mode 100644 index 0000000..6989c40 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/find-with-three-dots.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/generate-repository-method.png b/existing-spring-boot-app-modification/text-based-guide/images/generate-repository-method.png new file mode 100644 index 0000000..c59a419 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/generate-repository-method.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/generation-and-bean.png b/existing-spring-boot-app-modification/text-based-guide/images/generation-and-bean.png new file mode 100644 index 0000000..37c41c2 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/generation-and-bean.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/hibernate-event-listener.png b/existing-spring-boot-app-modification/text-based-guide/images/hibernate-event-listener.png new file mode 100644 index 0000000..7fb2e0d Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/hibernate-event-listener.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/ignored-by-default.png b/existing-spring-boot-app-modification/text-based-guide/images/ignored-by-default.png new file mode 100644 index 0000000..a68f534 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/ignored-by-default.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/initialize-salaries.png b/existing-spring-boot-app-modification/text-based-guide/images/initialize-salaries.png new file mode 100644 index 0000000..7de53ab Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/initialize-salaries.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/insert-link.png b/existing-spring-boot-app-modification/text-based-guide/images/insert-link.png new file mode 100644 index 0000000..8ed8372 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/insert-link.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/install-amplicode.png b/existing-spring-boot-app-modification/text-based-guide/images/install-amplicode.png new file mode 100644 index 0000000..52d2a95 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/install-amplicode.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/kafka-configuration-class.png b/existing-spring-boot-app-modification/text-based-guide/images/kafka-configuration-class.png new file mode 100644 index 0000000..a25434f Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/kafka-configuration-class.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/kafka-configuration.png b/existing-spring-boot-app-modification/text-based-guide/images/kafka-configuration.png new file mode 100644 index 0000000..cbe7077 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/kafka-configuration.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-configuration-class.png b/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-configuration-class.png new file mode 100644 index 0000000..20a99e6 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-configuration-class.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-dialog.png b/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-dialog.png new file mode 100644 index 0000000..bdbd6a2 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-dialog.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-in-code.png b/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-in-code.png new file mode 100644 index 0000000..8ccd8ef Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/kafka-template-in-code.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/kafka-visit-service.png b/existing-spring-boot-app-modification/text-based-guide/images/kafka-visit-service.png new file mode 100644 index 0000000..5c32789 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/kafka-visit-service.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/key-type-value-type.png b/existing-spring-boot-app-modification/text-based-guide/images/key-type-value-type.png new file mode 100644 index 0000000..6904af3 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/key-type-value-type.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/link-in-stacktrace.png b/existing-spring-boot-app-modification/text-based-guide/images/link-in-stacktrace.png new file mode 100644 index 0000000..5b7a76e Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/link-in-stacktrace.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/listener-basis.png b/existing-spring-boot-app-modification/text-based-guide/images/listener-basis.png new file mode 100644 index 0000000..45fc50c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/listener-basis.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/make-dto-mutable.png b/existing-spring-boot-app-modification/text-based-guide/images/make-dto-mutable.png new file mode 100644 index 0000000..e6e27d5 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/make-dto-mutable.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/manage-plugin-repositories.png b/existing-spring-boot-app-modification/text-based-guide/images/manage-plugin-repositories.png new file mode 100644 index 0000000..689bc4b Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/manage-plugin-repositories.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/method-find-collection.png b/existing-spring-boot-app-modification/text-based-guide/images/method-find-collection.png new file mode 100644 index 0000000..3e76e6c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/method-find-collection.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/method-implementation.png b/existing-spring-boot-app-modification/text-based-guide/images/method-implementation.png new file mode 100644 index 0000000..fd047c7 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/method-implementation.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/mvc-and-rest-endpoints.png b/existing-spring-boot-app-modification/text-based-guide/images/mvc-and-rest-endpoints.png new file mode 100644 index 0000000..61b7860 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/mvc-and-rest-endpoints.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/name-and-path.png b/existing-spring-boot-app-modification/text-based-guide/images/name-and-path.png new file mode 100644 index 0000000..d1f102a Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/name-and-path.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/new-container.png b/existing-spring-boot-app-modification/text-based-guide/images/new-container.png new file mode 100644 index 0000000..5aaa888 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/new-container.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/new-mapstruct-interface.png b/existing-spring-boot-app-modification/text-based-guide/images/new-mapstruct-interface.png new file mode 100644 index 0000000..caf456a Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/new-mapstruct-interface.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/new-spring-service-for-receiving-messages.png b/existing-spring-boot-app-modification/text-based-guide/images/new-spring-service-for-receiving-messages.png new file mode 100644 index 0000000..9790dc5 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/new-spring-service-for-receiving-messages.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/new-spring-service.png b/existing-spring-boot-app-modification/text-based-guide/images/new-spring-service.png new file mode 100644 index 0000000..8506159 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/new-spring-service.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/new-visit-in-logs.png b/existing-spring-boot-app-modification/text-based-guide/images/new-visit-in-logs.png new file mode 100644 index 0000000..ac7c36a Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/new-visit-in-logs.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/permit-all.png b/existing-spring-boot-app-modification/text-based-guide/images/permit-all.png new file mode 100644 index 0000000..9f70436 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/permit-all.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/plugins.png b/existing-spring-boot-app-modification/text-based-guide/images/plugins.png new file mode 100644 index 0000000..87bd777 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/plugins.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/popup-prompt.png b/existing-spring-boot-app-modification/text-based-guide/images/popup-prompt.png new file mode 100644 index 0000000..890194e Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/popup-prompt.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/popup-window-from-stacktrace.png b/existing-spring-boot-app-modification/text-based-guide/images/popup-window-from-stacktrace.png new file mode 100644 index 0000000..4410c87 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/popup-window-from-stacktrace.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/positive-or-zero.png b/existing-spring-boot-app-modification/text-based-guide/images/positive-or-zero.png new file mode 100644 index 0000000..3b6070c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/positive-or-zero.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/postfix-send.png b/existing-spring-boot-app-modification/text-based-guide/images/postfix-send.png new file mode 100644 index 0000000..f4de335 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/postfix-send.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/postgres-dependency.png b/existing-spring-boot-app-modification/text-based-guide/images/postgres-dependency.png new file mode 100644 index 0000000..9c3af03 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/postgres-dependency.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/postgres-parameters-for-docker.png b/existing-spring-boot-app-modification/text-based-guide/images/postgres-parameters-for-docker.png new file mode 100644 index 0000000..a113468 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/postgres-parameters-for-docker.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/postgres-properties.png b/existing-spring-boot-app-modification/text-based-guide/images/postgres-properties.png new file mode 100644 index 0000000..8fa1502 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/postgres-properties.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/precision-and-scale.png b/existing-spring-boot-app-modification/text-based-guide/images/precision-and-scale.png new file mode 100644 index 0000000..f06050a Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/precision-and-scale.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/properties-to-delete.png b/existing-spring-boot-app-modification/text-based-guide/images/properties-to-delete.png new file mode 100644 index 0000000..d7356de Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/properties-to-delete.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/red-scripts.png b/existing-spring-boot-app-modification/text-based-guide/images/red-scripts.png new file mode 100644 index 0000000..98eb688 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/red-scripts.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/remove-and-ignore.png b/existing-spring-boot-app-modification/text-based-guide/images/remove-and-ignore.png new file mode 100644 index 0000000..045d03b Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/remove-and-ignore.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/rename-listener.png b/existing-spring-boot-app-modification/text-based-guide/images/rename-listener.png new file mode 100644 index 0000000..f3f15b7 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/rename-listener.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/rest-controller-action.png b/existing-spring-boot-app-modification/text-based-guide/images/rest-controller-action.png new file mode 100644 index 0000000..43f664d Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/rest-controller-action.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/rest-controller-parameters.png b/existing-spring-boot-app-modification/text-based-guide/images/rest-controller-parameters.png new file mode 100644 index 0000000..5c0f444 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/rest-controller-parameters.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/rest-endpoint.png b/existing-spring-boot-app-modification/text-based-guide/images/rest-endpoint.png new file mode 100644 index 0000000..d5df862 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/rest-endpoint.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/restart-ide.png b/existing-spring-boot-app-modification/text-based-guide/images/restart-ide.png new file mode 100644 index 0000000..2827ef9 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/restart-ide.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/return-type-dto.png b/existing-spring-boot-app-modification/text-based-guide/images/return-type-dto.png new file mode 100644 index 0000000..92d0fad Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/return-type-dto.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/run-database.png b/existing-spring-boot-app-modification/text-based-guide/images/run-database.png new file mode 100644 index 0000000..20ca44c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/run-database.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/run-kafka.png b/existing-spring-boot-app-modification/text-based-guide/images/run-kafka.png new file mode 100644 index 0000000..86e6978 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/run-kafka.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/run-the-tests.png b/existing-spring-boot-app-modification/text-based-guide/images/run-the-tests.png new file mode 100644 index 0000000..bced501 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/run-the-tests.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/script-init-db.png b/existing-spring-boot-app-modification/text-based-guide/images/script-init-db.png new file mode 100644 index 0000000..b842a76 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/script-init-db.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/script-preview-window.png b/existing-spring-boot-app-modification/text-based-guide/images/script-preview-window.png new file mode 100644 index 0000000..a2ab5e4 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/script-preview-window.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/search-by-speciality-parameters.png b/existing-spring-boot-app-modification/text-based-guide/images/search-by-speciality-parameters.png new file mode 100644 index 0000000..6af0ca8 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/search-by-speciality-parameters.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/search-for-entity-collection.png b/existing-spring-boot-app-modification/text-based-guide/images/search-for-entity-collection.png new file mode 100644 index 0000000..54398c3 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/search-for-entity-collection.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/select-context.png b/existing-spring-boot-app-modification/text-based-guide/images/select-context.png new file mode 100644 index 0000000..58a10e6 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/select-context.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/select-controller.png b/existing-spring-boot-app-modification/text-based-guide/images/select-controller.png new file mode 100644 index 0000000..1951184 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/select-controller.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/select-entity-for-dto.png b/existing-spring-boot-app-modification/text-based-guide/images/select-entity-for-dto.png new file mode 100644 index 0000000..76f7871 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/select-entity-for-dto.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/select-existing-method.png b/existing-spring-boot-app-modification/text-based-guide/images/select-existing-method.png new file mode 100644 index 0000000..5a22f45 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/select-existing-method.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/select-spring-boot-three-ways.png b/existing-spring-boot-app-modification/text-based-guide/images/select-spring-boot-three-ways.png new file mode 100644 index 0000000..93f5a2d Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/select-spring-boot-three-ways.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/serializers.png b/existing-spring-boot-app-modification/text-based-guide/images/serializers.png new file mode 100644 index 0000000..94ee256 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/serializers.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/show-sql.png b/existing-spring-boot-app-modification/text-based-guide/images/show-sql.png new file mode 100644 index 0000000..3f26653 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/show-sql.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/smart-prompt.png b/existing-spring-boot-app-modification/text-based-guide/images/smart-prompt.png new file mode 100644 index 0000000..9e8edef Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/smart-prompt.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/specify-entity.png b/existing-spring-boot-app-modification/text-based-guide/images/specify-entity.png new file mode 100644 index 0000000..dffa720 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/specify-entity.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/specify-group-id.png b/existing-spring-boot-app-modification/text-based-guide/images/specify-group-id.png new file mode 100644 index 0000000..c2749cb Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/specify-group-id.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/specify-path.png b/existing-spring-boot-app-modification/text-based-guide/images/specify-path.png new file mode 100644 index 0000000..447038c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/specify-path.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/specify-visit.png b/existing-spring-boot-app-modification/text-based-guide/images/specify-visit.png new file mode 100644 index 0000000..f5e5843 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/specify-visit.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/spring-data-jpa.png b/existing-spring-boot-app-modification/text-based-guide/images/spring-data-jpa.png new file mode 100644 index 0000000..6262c05 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/spring-data-jpa.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/starters.png b/existing-spring-boot-app-modification/text-based-guide/images/starters.png new file mode 100644 index 0000000..79c8b91 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/starters.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/test-no-errors.png b/existing-spring-boot-app-modification/text-based-guide/images/test-no-errors.png new file mode 100644 index 0000000..5f51097 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/test-no-errors.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/use-generate-in-docker-compose.png b/existing-spring-boot-app-modification/text-based-guide/images/use-generate-in-docker-compose.png new file mode 100644 index 0000000..473a5fd Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/use-generate-in-docker-compose.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/use-mapto.png b/existing-spring-boot-app-modification/text-based-guide/images/use-mapto.png new file mode 100644 index 0000000..4cb211a Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/use-mapto.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/validation-for-attribute.png b/existing-spring-boot-app-modification/text-based-guide/images/validation-for-attribute.png new file mode 100644 index 0000000..c34554c Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/validation-for-attribute.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/verifying-initialization-scripts.png b/existing-spring-boot-app-modification/text-based-guide/images/verifying-initialization-scripts.png new file mode 100644 index 0000000..6ca75ac Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/verifying-initialization-scripts.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/vet-automatically-assigned.png b/existing-spring-boot-app-modification/text-based-guide/images/vet-automatically-assigned.png new file mode 100644 index 0000000..9dd8926 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/vet-automatically-assigned.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/vets-with-salaries.png b/existing-spring-boot-app-modification/text-based-guide/images/vets-with-salaries.png new file mode 100644 index 0000000..c212528 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/vets-with-salaries.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/visit-new-endpoint.png b/existing-spring-boot-app-modification/text-based-guide/images/visit-new-endpoint.png new file mode 100644 index 0000000..0bb724b Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/visit-new-endpoint.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/yellow-and-green-scripts.png b/existing-spring-boot-app-modification/text-based-guide/images/yellow-and-green-scripts.png new file mode 100644 index 0000000..e860fdc Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/yellow-and-green-scripts.png differ diff --git a/existing-spring-boot-app-modification/text-based-guide/images/youtube-thumbnail.png b/existing-spring-boot-app-modification/text-based-guide/images/youtube-thumbnail.png new file mode 100644 index 0000000..45bd083 Binary files /dev/null and b/existing-spring-boot-app-modification/text-based-guide/images/youtube-thumbnail.png differ