dynamic-user-segmentation

module
v0.0.0-...-dfb12f3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 8, 2023 License: MIT

README

dynamic-user-segmentation

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

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

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

$ git clone git@github.com: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 и интеграционные тесты

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL