Skip to content

Mansur51-hub/customer-segmentation-service

Repository files navigation

Customer segmentation service

Микросервис для динамического сегментирования пользователей

Используемые технологии:

  • PostgreSQL (в качестве хранилища данных)
  • Docker (для запуска сервиса)
  • Swagger (для документации API)
  • Mux (веб фреймворк)
  • viper (для конфигурации)
  • pgx (драйвер для работы с PostgreSQL)

Usage

Конфигурацию можно настроить в файле .env

Запустить сервис можно с помощью команды docker compose up

Миграция бд отсутствует. Конечный файл для создания всех необходимых таблиц находится в папке migrations

Документацию после завпуска сервиса можно посмотреть по адресу http://localhost:8080/swagger/index.html с портом 8080 по умолчанию

Examples

Некоторые примеры запросов

Добавление сегмента

Добавление сегмента с заданным процентом пользователей:

curl -X 'POST' \
  'http://localhost:8080/segments' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "percent": 70,
  "slug": "AVITO_VOICE_MESSAGES"
}'

Добавление сегмента без автоматического заполнения:

curl -X 'POST' \
  'http://localhost:8080/segments' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "slug": "AVITO_DISCOUNT_50"
}'

Пример ответа:

{
  "id": 3,
  "slug": "AVITO_DISCOUNT_50",
  "percent": 0
}

Удаление сегмента

Удаление сегмента:

curl -X 'DELETE' \
  'http://localhost:8080/segments' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "slug": "AVITO_VOICE_MESSAGES"
}'

Пример ответа:

"success"

Добавление пользователя в сегменты

NOTE: для назначения ttl необходимо добавить поле "ttl" в формате time.Duration string

Пример:

curl -X 'POST' \
  'http://localhost:8080/users' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "segments_to_add": [
    {
      "slug": "AVITO_DISCOUNT_50"
    },
    {
     "slug": "AVITO_VOICE_MESSAGES",
      "ttl": "24h"  
    },
    {
     "slug": "AVITO_PERFORMANCE_VAS",
      "ttl": "48h"  
    }
  ],
  "segments_to_delete": [
    "AVITO_DISCOUNT_50"
  ],
  "user_id": 1000
}'

Пример ответа:

[
  {
    "id": 1,
    "user_id": 1000,
    "segment_slug": "AVITO_DISCOUNT_50",
    "created_at": "2023-08-31T21:08:07.8915698+03:00",
    "expired_at": "0001-01-01T00:00:00Z"
  },
  {
    "id": 2,
    "user_id": 1000,
    "segment_slug": "AVITO_VOICE_MESSAGES",
    "created_at": "2023-08-31T21:08:07.8981185+03:00",
    "expired_at": "2023-09-01T21:08:07.898118Z"
  },
  {
    "id": 3,
    "user_id": 1000,
    "segment_slug": "AVITO_PERFORMANCE_VAS",
    "created_at": "2023-08-31T21:08:07.9009127+03:00",
    "expired_at": "2023-09-02T21:08:07.900912Z"
  }
]

Получение активных сегентов пользователя

NOTE: запросы GET c body могут не выполняться в сваггере.

Запрос с curl из консоли выполняется всегда.

Пример:

curl -X 'GET' \
  'http://localhost:8080/users' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "limit": 10,
  "offset": 0,
  "user_id": 1000
}'

Пример ответа:

["AVITO_PERFORMANCE_VAS","AVITO_VOICE_MESSAGES"]

Получение списка операций в формате csv

Пример:

curl -X 'GET' \
  'http://localhost:8080/operations' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "limit": 10,
  "month": 8,
  "offset": 0,
  "year": 2023
}'

Пример ответа:

1000,AVITO_DISCOUNT_50,adding,Thu Aug 31 21:08:07 2023
1000,AVITO_VOICE_MESSAGES,adding,Thu Aug 31 21:08:07 2023
1000,AVITO_PERFORMANCE_VAS,adding,Thu Aug 31 21:08:07 2023
1000,AVITO_DISCOUNT_50,removing,Thu Aug 31 21:08:07 2023

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published