Skip to content

kozyrev-m/effective-mobile-task

Repository files navigation

effective-mobile-task

Условие задачи

Реализовать сервис, который будет получать ФИО по API, затем будет обогащать ответ из открытых API наиболее вероятными возрастом, полом и национальностью и сохранять данные в БД. По запросу выдавать информацию о найденных людях.

Необходимо реализовать следующее:

  1. Выставить rest методы:
    • Для получения данных с различными фильтрами и пагинацией
    • Для удаления по идентификатору
    • Для изменения сущности
    • Для добавления новых людей в формате:
      {
        "name": "Dmitriy",
        "surname": "Ushakov",
        "patronymic": "Vasilevich" // необязательно
      }
      
  2. Корректное сообщение обогатить
  3. Обогащенное сообщение положить в БД postgres (структура БД должна быть создана путем миграций)
  4. Покрыть код debug- и info-логами
  5. Вынести конфигурационные данные в .env

Архитектура

Структура приложения

Структура приложения

Схема БД

Схема БД

Подробнее: migrations/01_pg_eff_mobile.sql

Использованные библиотеки

Конфигурация приложения

Приложение конфигурируется с помощью переменных окружения и флагов командной строки.
Доступные параметры для конфигурации представлены в следующей таблице:

Переменная окружения Флаг командной строки Описание
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

}

Управление приложением

Makefile

Подготовка приложения, тестирование, и запуск выполняется с помощью команды 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

About

effective-mobile-task is a test task

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published