Микросервис для динамического сегментирования пользователей
Используемые технологии:
- PostgreSQL (в качестве хранилища данных)
- Docker (для запуска сервиса)
- Swagger (для документации API)
- Mux (веб фреймворк)
- viper (для конфигурации)
- pgx (драйвер для работы с PostgreSQL)
Конфигурацию можно настроить в файле .env
Запустить сервис можно с помощью команды docker compose up
Миграция бд отсутствует. Конечный файл для создания всех необходимых таблиц находится в папке migrations
Документацию после завпуска сервиса можно посмотреть по адресу http://localhost:8080/swagger/index.html
с портом 8080 по умолчанию
Некоторые примеры запросов
- Добавление сегмента
- Удаление сегмента
- Добавление пользователя в сегмент
- Получение активных сегентов пользователя
- Получение списка операций в формате csv
Добавление сегмента с заданным процентом пользователей:
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"]
Пример:
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