Skip to content

Сервис, хранящий пользователя и сегменты, в которых он состоит.

License

Notifications You must be signed in to change notification settings

zd4r/dynamic-user-segmentation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dynamic-user-segmentation

Сервис, хранящий пользователя и сегменты, в которых он состоит (создание, изменение, удаление сегментов, а также добавление и удаление пользователей в сегмент).

Запуск сервиса

Выполните команду для клонирования репозитория:

$ 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"
    ]
}

Доп. задание 1.

Получение отчета по пользователю за определенный период времени.

Решение

Для получения отчета в формате 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 документации.

Доп. задание 2.

Реализовать возможность задавать 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 документации.

Доп. задание 3.

В методе создания сегмента, добавить опцию указания процента пользователей, которые будут попадать в сегмент автоматически.

Решение

В метод создания сегмента используется опциональный параметр 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 документации.

TODO:

  • Unit и интеграционные тесты

About

Сервис, хранящий пользователя и сегменты, в которых он состоит.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published