- Условие задачи
- Архитектура
- Использованные библиотеки
- Конфигурация приложения
- Функциональность
- Управление приложением
- Тестовая демонстрация
Реализовать сервис, который будет получать ФИО по API, затем будет обогащать ответ из открытых API наиболее вероятными возрастом, полом и национальностью и сохранять данные в БД. По запросу выдавать информацию о найденных людях.
Необходимо реализовать следующее:
- Выставить rest методы:
- Для получения данных с различными фильтрами и пагинацией
- Для удаления по идентификатору
- Для изменения сущности
- Для добавления новых людей в формате:
{ "name": "Dmitriy", "surname": "Ushakov", "patronymic": "Vasilevich" // необязательно }
- Корректное сообщение обогатить
- Возрастом - https://api.agify.io/?name=Dmitriy
- Полом - https://api.genderize.io/?name=Dmitriy
- Национальностью - https://api.nationalize.io/?name=Dmitriy
- Обогащенное сообщение положить в БД postgres (структура БД должна быть создана путем миграций)
- Покрыть код debug- и info-логами
- Вынести конфигурационные данные в .env
Подробнее: migrations/01_pg_eff_mobile.sql
- Логгирование: go.uber.org/zap
- Работа с БД: jackc/pgx, pressly/goose
- Работа с HTTP: gin-gonic/gin, go-resty/resty
- Тестирование: stretchr/testify, go.uber.org/mock/gomock
Приложение конфигурируется с помощью переменных окружения и флагов командной строки.
Доступные параметры для конфигурации представлены в следующей таблице:
Переменная окружения | Флаг командной строки | Описание |
---|---|---|
RUN_ADDR |
-a <host:port> |
адрес и порт запуска сервера |
LOG_LEVEL |
-l <level> |
уровень логирования |
DATABASE_DSN |
-d <dsn> |
адрес подключения к базе данных |
Способ конфигурации зависит от места и контекста работы приложения.
Например, если приложение запускается в контейнере, то конфигурировать его [приложение] следует через переменные окружения среды [контейнера].
А если выполняется разработка и/или отладка, то для конфигурации удобнее ипользовать флаги командной строки.
Добавление данных человека в систему.
В тело запроса необходимо передать ФИО человека.
Формат запроса:
POST http://<host>:<port>/add
Content-Type: application/json
{
"name": <ИМЯ>,
"surname": <ФАМИЛИЯ>,
"patronymic": <ОТЧЕСТВО> // необязательно
}
Перед добавлением в БД корректное сообщение из сторонних ресурсов обогащается Возврастом, Полом и Национальностью.
Признак | Название признака в БД | Адрес ресурса |
---|---|---|
Возраст | age | https://api.agify.io/?name={ИМЯ} |
Пол | gender | https://api.genderize.io/?name={ИМЯ} |
Национальность | nationality | https://api.nationalize.io/?name={ИМЯ} |
Поиск человека в системе выполняется по идентификатору (id).
Идентификатор записи (id) обязательно добавить в строку запроса.
Формат запроса:
GET http://<host>:<port>/find/{id}
Content-Type: application/json
Обновление записи человека в системе выполняется по идентификатору (id).
К запросу на обновление нужно добавить тело с данными человека, которые необходим обновить.
При обновлении можно задать любую комбинацию данных.
Формат запроса:
PATCH http://<host>:<port>/update/{id}
{
"name": <ИМЯ>, // необязательно
"surname": <ФАМИЛИЯ>, // необязательно
"patronymic": <ОТЧЕСТВО>, // необязательно
"age": <ВОЗРАСТ>, // необязательно
"gender": <ПОЛ>, // необязательно
"nationality": <НАЦИОНАЛЬНОСТЬ> // необязательно
}
Удаление записи человека из системы выполняется по идентификатору (id).
Формат запроса:
DELETE http://<host>:<port>/delete/{id}
В системе предусмотрен поиск людей по фильтру.
Для этого нужно добавить комбинацию признаков в тело запроса.
Текущий функционал также имеет пагинацию, которая определяется двумя параметрами:
- Номер страницы (page)
- Кол-во элементов на странице (per_page)
Формат запроса:
POST http://<host>:<port>/persons
Content-Type: application/json
{
// Параметры фильтра
"name": <ИМЯ>, // необязательно
"surname": <ФАМИЛИЯ>, // необязательно
"patronymic": <ОТЧЕСТВО>, // необязательно
"age": <ВОЗРАСТ>, // необязательно
"gender": <ПОЛ>, // необязательно
"nationality": <НАЦИОНАЛЬНОСТЬ> // необязательно
// Пагинация
"page": <НОМЕР_СТРАНИЦЫ>, // необязательно, по умолчанию 1
"per_page": <КОЛИЧЕСТВО_НА_СТРАНИЦУ> // необязательно, по умолчанию 10
}
Подготовка приложения, тестирование, и запуск выполняется с помощью команды make (из корня репозитория).
В Makefile определены основные команды для управления приложением:
- Информация о доступных командах Makefil-а:
make info
- Запуск тестов приложения
make test
- Создание и запуск контейнеров, необходимых для работы приложения (программа и база данных)
make docker-app-up
- Остановка и удаление контейнеров, созданных командой выше (docker-dev-up)
make docker-app-down
- Создание и запуск контейнера c БД для разработки и отладки приложения
make docker-dev-db-up
- Остановка и удаление контейнера, созданного предыдущей командой (docker-dev-db-up)
make docker-dev-db-down
Подробнее: Makefile
Команда для создания и запуска контейнеров с приложением и базой данных (запускать из корня репозитория):
make docker-app-up
API приложения будет доступно на localhost:8084
Конфигурация запущенных контейнеров: docker-compose/app/docker-compose.yml
После успешного запуска приложения можно проверить работу сервиса в ручном режиме.
Файл для тестовой демонстрации работы сервиса: demonstration.http
В файле представлены все возможные HTTP-запросы к приложению.
Файл demonstration.http предназначен для расширения REST Client в редакторе Visual Studio Code