Сервис, хранящий пользователя и сегменты, в которых он состоит (создание, изменение, удаление сегментов, а также добавление и удаление пользователей в сегмент).
Выполните команду для клонирования репозитория:
$ git clone [email protected]:zd4r/dynamic-user-segmentation.git
Перейдите в папку проекта:
$ cd dynamic-user-segmentation
Выполните команду для запуска сервиса:
$ make compose-build-up
Примечание: схема в БД создается автоматически при помощи инициализирующего скрипта init.sql
, расположенного в корневой папке проекта.
Для запуска тестов можно использовать следующую команду:
$ make test
Ознакомиться с примерами запросов и ответов можно также в swagger
документации.
Она доступна по ссылке http://localhost:8080/docs/ после запуска сервиса. Также файлы спецификации в формате .yaml
и .json
находятся в папке docs
в корневой папке проекта.
Запрос:
$ curl -X 'POST' \
'http://localhost:8080/v1/segment' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"slug": "avito_discount_50",
"usersPercent": 50
}'
Ответ:
status code
: 201
response body
: null
Запрос:
$ curl -X 'DELETE' \
'http://localhost:8080/v1/segment/AVITO_DISCOUNT_110' \
-H 'accept: application/json'
Ответ:
status code
: 200
response body
: null
Запрос:
$ curl -X 'POST' \
'http://localhost:8080/v1/user' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"id": 1
}'
Ответ:
status code
: 201
response body
: null
Запрос:
$ curl -X 'DELETE' \
'http://localhost:8080/v1/user/1' \
-H 'accept: application/json'
Ответ:
status code
: 200
response body
: null
Запрос:
expireAt
- опциональное поле, формат: YYYY-MM-DDTHH:MM:SSZ
.
$ curl -X 'POST' \
'http://localhost:8080/v1/user/1/segments' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"segmentsToAdd": [
{
"slug": "avito_discount_50",
"expireAt": "2023-09-15T00:00:00Z"
},
{
"slug": "avito_voice_messages"
}
],
"segmentsToRemove": [
{
"slug": "avito_voice_messages"
}
]
}'
Ответ:
status code
: 200
response body
: null
Запрос:
$ curl -X 'GET' \
'http://localhost:8080/v1/user/1/segments' \
-H 'accept: application/json'
Ответ:
status code
: 200
response body
:
{
"segments": [
"avito_discount_50"
]
}
Получение отчета по пользователю за определенный период времени.
Для получения отчета в формате CSV
по пользователю за определенный период времени, необходимо выполнить следующий запрос (формат опциональных query
параметров: YYYY-MM
, при отсутствии параметров, предоставляется весь доступный отчет):
curl -X 'GET' \
'http://localhost:8080/v1/user/1/report?from=2023-08&to=2023-09' \
-H 'accept: application/json'
В результате данного запроса начнется загрузка файла с отчетом по пользователю в формате CSV
. Подробнее с методом можно ознакомиться после запуска сервиса в swagger документации.
Реализовать возможность задавать TTL (время автоматического удаления пользователя из сегмента)
Опциональное добавление времени жизни сегмента для пользователя. Далее для соответствующих методов сервис проверяет, является ли сегмент актуальным для пользователя или нет, на основании этого поля. Также реализована регулярная очистка устаревших сегментов пользователя в БД.
Запрос:
expireAt
- опциональное поле, формат (UTC): YYYY-MM-DDTHH:MM:SSZ
.
$ curl -X 'POST' \
'http://localhost:8080/v1/user/1/segments' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"segmentsToAdd": [
{
"slug": "avito_discount_50",
"expireAt": "2023-09-15T00:00:00Z"
},
{
"slug": "avito_voice_messages"
}
],
"segmentsToRemove": [
{
"slug": "avito_voice_messages"
}
]
}'
Ответ:
status code
: 200
response body
: null
Подробнее с методом можно ознакомиться после запуска сервиса в swagger документации.
В методе создания сегмента, добавить опцию указания процента пользователей, которые будут попадать в сегмент автоматически.
В метод создания сегмента используется опциональный параметр usersPercent
. При его указании заданному проценту текущих пользователей будет присвоен создаваемый сегмент (пользователи выбираются случайным образом без повторения).
Запрос:
$ curl -X 'POST' \
'http://localhost:8080/v1/segment' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"slug": "avito_discount_50",
"usersPercent": 50
}'
Ответ:
status code
: 201
response body
: null
Подробнее с методом можно ознакомиться после запуска сервиса в swagger документации.
- Unit и интеграционные тесты