# README
Сервис динамического сегментирования пользователей
Инструкция по запуску
Клонировать репозиторий на локальную машину.
Необходимо иметь доступ к Docker Engine версией 19.03.0+.
Запустить команду docker-compose up
из корня проекта.
Когда в консоли появится сообщение подобное сообщению ниже, можно считать, что сервер запущен и способен обрабатывать запросы.
┌───────────────────────────────────────────────────┐
│ Fiber v2.49.0 │
│ http://127.0.0.1:3000 │
│ (bound on host 0.0.0.0 and port 3000) │
│ │
│ Handlers ............. 5 Processes ........... 1 │
│ Prefork ....... Disabled PID ............... 194 │
└───────────────────────────────────────────────────┘
По умолчанию сервер запускается на порту аналогичном порту контейнера, то есть :3000
.
На тот случай если ваш порт :3000
занят, можно поменять номер порта в файле "docker-compose.yml". Настройка порта
находится по пути services.web.ports[0].published
.
Если вы перенастроили порт контейнера Docker, то и запросы нужно отправлять по адресу 127.0.0.1:{ваш порт}.
Пример:
Ваш порт: 8080
Файл "docker-compose.yml":
version: "3.8"
services:
web:
build: .
env_file:
- .env
ports:
- target: 3000
published: 8080
protocol: tcp
mode: host
volumes:
- .:/usr/src/app
command: air ./cmd/main.go -b 0.0.0.0
db:
image: postgres:latest
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
ports:
- target: 5432
published: 5432
protocol: tcp
mode: host
volumes:
- postgres-db:/var/lib/postgresql/data
volumes:
postgres-db:
Вопросы, которые нужно было решить
Как нужно хранить информацию о связях между сегментами и пользователями?
Так как был расчет на первое доп. задание, эти связи хранятся в неявном виде. Они хранятся в виде истории действий, которые происходили с пользователями и сегментами. Активные сегменты выводятся
Что будет когда придет запрос на удаление сегмента?
Так как данные не должны теряться, я решил, что сегмент не будет удаляться полностью, а будет помечаться как удаленный. Так будет сохраняться история.
Если потребуется история сегментирования пользователей, то история связанная с удаленными сегментами будет доступна в будущем, только если придет запрос на добавление когда-то существовавшего сегмента, то есть восстановление сегмента.
Что делать, если приходит запрос на добавление?
Так как сегменты помечаются как удаленные и не удалённые, то:
- Запрос на добавление не существовавшего ранее/удаленного сегмента просто будет добавлять/восстанавливать сегмент;
- На запрос на добавление не удаленного сегмента будет ответ с сообщением о том, что сегмент уже существует.
Как происходит сегментирование?
Записи добавляются если в них есть смысл. То есть пользователь добавляется в сегмент, если он не в сегменте. Аналогично с удаление из сегмента.
Сначала происходят все добавления, затем удаления в/из сегментов.
Примеры запросов/ответов
Создание сегмента
Метод: POST
URL: домен/api/create_segment
Тело запроса:
{
"slug": "AVITO_VOICE_MESSAGES"
}
Ответ успешной обработки
Код статуса: 201
Тело ответа:
{
"id": 6
}
Ответ на добавление уже существующего сегмента
Код статуса: 409
Тело ответа:
{
"message": "segment already exists"
}
Удаление сегмента
Метод: DELETE
URL: домен/api/delete_segment
Тело запроса:
{
"slug": "AVITO_VOICE_MESSAGES"
}
Ответ успешной обработки
Код статуса: 204
Тело ответа:
Ответ на удаление не существующего сегмента
Код статуса: 404
Тело ответа:
{
"message": "segment doesn't exists"
}
Сегментирование пользователя
Метод: POST
URL: домен/api/segment_user/1000
Тело запроса:
{
"add":[
"AVITO_VOICE_MESSAGES",
"AVITO_PERFORMANCE_VAS",
"AVITO_DISCOUNT_30"
],
"remove":[
"AVITO_DISCOUNT_50",
"AVITO_DISCOUNT_70"
]
}
Ответ успешной обработки
Код статуса: 200
Тело ответа:
{
"message": "user successfully segmented"
}
Ответ на удаление не существующего сегмента
Код статуса: 404
Тело ответа:
{
"message": "segment doesn't exists"
}
Получение активных сегментов пользователя
Метод: GET
URL: домен/api/active_segment/1000
Тело запроса отсутствует.
Ответ успешной обработки
Код статуса: 200
Тело ответа:
[
"AVITO_PERFORMANCE_VAS"
]
Получение истории
Метод: GET
URL: домен/api/get_history
Тело запроса:
{
"year": 2023,
"month": 8
}
Ответ успешной обработки
Код статуса: 201
Тело ответа:
{
"url": "http://localhost:3000/download/2023-8-19.csv"
}