# Тестовое задание ## Общее описание В качестве тестового задания необходимо реализовать RESTfull приложение 1. При разработке использовать spring boot остальное на ваше усмотрение, желательно придерживаться экосистемы spring. 1. При разработке использовать в качестве базы Postgres 1. cross-origin должно быть отключено. 1. доступ к сервису возможен только при наличии токена ‘secret’ во всех остальных случаях кроме “GET /exit” возвращать 401 название и реализация на ваше усмотрение, инструкция для передачи токена должна прилагаться в месте с тестовым заданием. 1. сервис должен запускаться на 8010 порту 1. name и email должны быть регистронезависимые 1. Добавить фильтр при регистрации на проверку уникальности поля email в случае если Email есть в базе возвращать 409 статус 1. к исходникам должен прилагаться артефакт приложения 1. Для данного приложения реализуйте и подключил OpenApi (swagger) 1. Версия java не выше 11 1. Сборщик Maven ## Описание endpoints ### POST /profiles/set Создает запись профиля и присваивает ему id **Request**: принимает json следующей структурой: ``` { "name": string "email": string "age": int } ``` **Responses**: в случае успеха возвращает id записи пользователя **_status 200_** ``` { "idUser": int } ``` В случае не корректного email **_status 400_** ``` { "msg": string } ``` В случае если email уже передавался (реализовать через фильтр) **_status 403_** ``` { “msg”: string } ``` ### GET /profiles/last Возвращает последний созданный профиль **Responses**: **_status 200_** ``` { "id": int "name": string "email": string "age": int "created": timestamp } ``` ### GET /profiles Возвращает все созданные профили **Responses**: **_status 200_** ``` [{ "id": int "name": string "email": string "age": int "created": timestamp }...] ``` ###GET /profiles/{ID} Возвращает профиль по его ID Responses: **_status 200_** ``` { "id": int "name": string "email": string "age": int "created": timestamp } ``` **_status 404_** в случае если запись не найдена ``` { "msg": string } ``` ### POST /profiles/get Возвращает профиль по email **Request**: принимает json следующей структурой: ``` { "email": string } ``` **Responses**: **_status 200_** ``` { 'id": int "name": string "email": string "age": int "created": timestamp } ``` **_status 404_** в случае если запись не найдена ``` { "msg": string } ``` ### GET /error/last Возвращает сообщение последней ошибки **Responses**: **_status 200_** ``` { "msg": string "created": timestamp } ``` ### Не обязательная часть задания: **GET /exit** Производит закрытия приложение с редиректом на страницу /exit-success (название вариативно) с надписью ‘приложение закрыто’ допускаются и другие варианты информирования о закрытие. --- # Комментарий к выполненной работе Программу можно запустить в нескольких режимах используя профили spring boot 1. **DEFAULT** - в данном режиме используется база данных postgresql с настройками по умолчанию, а именно `url:jdbc:postgresql://localhost/test, username: test, password: test`. Для запуска используем следующие параметры `java -jar restsrv.jar` 1. **DEMO** - в данном режиме используется база данных H2 DB. Для запуска используем следующие параметры `java -jar restsrv.jar --spring.profiles.active=demo` 1. **PRODUCTION** - в данном режиме используется база данных postgresql c альтернативными настройками прописанными в файле `application-prod.properties`, данный файл должен находиться в том же каталоге где и запускаемый jar-файл программы. Для запуска используем следующие параметры `java -jar restsrv.jar --spring.profiles.active=prod` Пример содержимого файла `application-prod.properties` ``` RESTSRV_PGSQL_DB_HOST=jdbc:postgresql://localhost RESTSRV_PGSQL_DB_PORT=5432 RESTSRV_PGSQL_DB_NAME=test RESTSRV_PGSQL_DB_USER=test RESTSRV_PGSQL_DB_PASSWORD=test ``` Так же для запуска программы в linux, можно воспользоваться скриптом `restsrv_linux.sh` , при этом запускаемый jar-файл должен называться `restsrv.jar` и находиться в том же каталоге, где и скрипт. Выполните `restsrv_linux.sh --help` для получения помощи. При запуске в режиме `PRODUCTION` будет выполнена проверка на наличие файла `application-prod.properties`, если он не найден, то запустится интерактивный режим, где будет предложено заполнить необходимые данные. ## Работа с программой ### Инициализация БД Если работа ведётся с postgresql воспользуйтесь файлами `ddl-postgresql.sql` и `schema-postgresql.sql` см. каталог `init_postgresql_db` ### Работа с токеном безопасности. По условию задания, доступ к эндпоинтам сервиса осуществляется при помощи токена `secret` . В каждом звпросе, в заголовке запроса, должна присутствовать следующая строка `Authorization: Bearer secret` , без данной записи в заголовке, при обращении к защищенным эндпоинтам будет возвращаться код 401. ### Прочее В программе используется OpenApi c ui, для доступа к ui используем http://localhost:8010/swagger-ui/index.html , в представлении json используем http://localhost:8010/v3/api-docs --- Тестовое задание выполнил Александров А.А. (alexandrov@resprojects.ru) ссылка на профиль hh.ru - https://hh.ru/resume/7cdada75ff015e78530039ed1f366c4b4a5273