Тестовое задание по написанию сервиса работы с пользователями
- Клонируем репозиторий проекта:
git clone https://github.com/LinqCod/user-service.git
- Далее необходимо сбилдить и запустить сервис. Сам сервис, как и бд (в данном случае postgres) работают в докер контейнерах, их конфигурация и связь прописаны в
docker-compose
файле. Также перед запуском следует установить пакетgolang-migrate
, если еще не был установлен.
Для удобства все команды прописаны в Makefile
- Для запуска сервиса достаточно использовать команду
make service-up
, которая сбилдит и запустит приложение, доступное на порту 8080:
make service-up
- Для последующих запусков сервиса достаточно использовать команду
make service-run
, которая будет запускать уже существующий контейнер.
make service-run
- Для завершения работы сервиса следует воспользоваться командой:
make service-down
- Для создания файлов миграции таблицы пользователей необходимо выполнить следующую команду (для удобства файлы миграции, которые создают и дропают таблицу пользователей, уже присутствуют в проекте):
make migration-create-user
- Чтобы накатить миграции достаточно выполнить команду:
make migration-up
- Для роллбека миграций воспользуйтесь командой:
make migration-down
- Для удобства добавлена команда для входа в postgres терминал созданной базы данных:
make shell-postgres
- Сервис реализован, используя основные концепции
Clean Architecture
(разделение на слои handlers, repository и usecase, также прописаны доменные модели для каждого кейса) - Для создания основного контейнера сервиса используется
multi-stage build
дабы уменьшить вес итогового контейнера и увеличить скорость его запуска - Конфигурация вынесена в
.env
файл. Для инициализации и взаимодействия с конфигом используется пакетviper
- Для логирования используется качественная библиотека
zap
- Реализован механизм
graceful shutdown
для грамотного завершения сервиса
- POST /api/v1/users - создание пользователя. На вход принимает json-объект с обязательными полями name, surname. Остальные поля (patronymic, age, gender, nationality) являются необязательными. Поля age, gender и nationality запрашиваются со сторонних апи.
- DELETE /api/v1/users/:id - удаление пользователя по айди. На вход принимает айди пользователя в качестве path параметра.
- PATCH /api/v1/users/:id - изменение пользователя по айди. На вход принимает айди пользователя в качестве path параметра, а также json-объект с новыми значениями полей. Если какие то поля не будут указаны в request body, в базе они останутся прежними.
- GET /api/v1/users/:id - получение пользователя по айди. На вход принимает айди пользователя в качестве path параметра.
- GET /api/v1/users - получение отфильтрованного списка пользователей. Фильтрация происходит путем указания следующих query параметров: gender, minAge, maxAge, nationality, count (пагинация). Параметры можно указать как все, так и часть, или вообще не указывать. В случае, если какие то параметры не указаны, они не будут учитываться при фильтрации.