Categorygithub.com/GR4NDS0N162/dynamic-user-segmentation-service
module
0.0.0-20230831070544-3b9acdbc75be
Repository: https://github.com/gr4nds0n162/dynamic-user-segmentation-service.git
Documentation: pkg.go.dev

# 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"
}

# Packages

No description provided by the author
No description provided by the author
No description provided by the author