Тестовое задание
Общее описание
В качестве тестового задания необходимо реализовать RESTfull приложение
- При разработке использовать spring boot остальное на ваше усмотрение, желательно придерживаться экосистемы spring.
- При разработке использовать в качестве базы Postgres
- cross-origin должно быть отключено.
- доступ к сервису возможен только при наличии токена ‘secret’ во всех остальных случаях кроме “GET /exit” возвращать 401 название и реализация на ваше усмотрение, инструкция для передачи токена должна прилагаться в месте с тестовым заданием.
- сервис должен запускаться на 8010 порту
- name и email должны быть регистронезависимые
- Добавить фильтр при регистрации на проверку уникальности поля email в случае если Email есть в базе возвращать 409 статус
- к исходникам должен прилагаться артефакт приложения
- Для данного приложения реализуйте и подключил OpenApi (swagger)
- Версия java не выше 11
- Сборщик 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
- DEFAULT - в данном режиме используется база данных postgresql с настройками по умолчанию, а именно
url:jdbc:postgresql://localhost/test, username: test, password: test. Для запуска используем следующие параметрыjava -jar restsrv.jar - DEMO - в данном режиме используется база данных H2 DB. Для запуска используем следующие параметры
java -jar restsrv.jar --spring.profiles.active=demo - 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