233 lines
7.5 KiB
Markdown
233 lines
7.5 KiB
Markdown
# Тестовое задание
|
||
|
||
## Общее описание
|
||
|
||
В качестве тестового задания необходимо реализовать 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 |