Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/anatoliybr/dynamic-user-segmentation-service
REST API server for dynamic user segmentation
https://github.com/anatoliybr/dynamic-user-segmentation-service
clean-architecture dependency-injection docker-compose dockerfile go http-api migrations postgresql
Last synced: about 2 months ago
JSON representation
REST API server for dynamic user segmentation
- Host: GitHub
- URL: https://github.com/anatoliybr/dynamic-user-segmentation-service
- Owner: AnatoliyBr
- License: agpl-3.0
- Created: 2023-08-30T10:36:14.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2023-10-10T12:21:44.000Z (about 1 year ago)
- Last Synced: 2023-10-10T13:31:54.149Z (about 1 year ago)
- Topics: clean-architecture, dependency-injection, docker-compose, dockerfile, go, http-api, migrations, postgresql
- Language: Go
- Homepage:
- Size: 353 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## Сервис динамического сегментирования пользователей
Это решение тестового задания для стажёра Backend в AvitoTech. Сценарии использования, требования и детали по заданию в [репозитории](https://github.com/avito-tech/backend-trainee-assignment-2023/).## Задача
Требовалось реализовать сервис, хранящий **пользователя** и **сегменты**, в которых он состоит (создание, изменение, удаление сегментов, а также добавление и удаление пользователей в сегмент).Сервис предоставляет **HTTP API** с форматом **JSON** как при отправке запроса, так и при получении результата.
## Структура HTTP API
**Публичные endpoint'ы**, доступные всем:```
POST /seg - создание сегмента
DELETE /seg - удаление сегмента
PUT /seg - добавление/удаление пользователя в сегмент
GET /seg - просмотр активных сегментов пользователя
```## Схема базы данных
## Архитектура
## Структура проекта
```
├── cmd
| ├── app
|
├── configs
├── internal
| ├── app
| ├── controller
| ├── entity
| ├── repository
| ├── usecase
|
├── migrations
├── .env
├── .gitignore
├── Makefile
├── README.md
├── go.mod
├── go.sum
```## Запуск и отладка
Все команды, используемые в процессе разработки и тестирования, фиксировались в `Makefile`.Чтобы поднять проект, необходимо выполнить **две задачи** из `Makefile`:
```bash
make compose-build
make compose-up
```## Примеры запросов
* [Создание сегмента](#создание-сегмента)
* [Удаление сегмента](#удаление-сегмента)
* [Добавление/удаление пользователя в сегмент](#добавлениеудаление-пользователя-в-сегмент)
* [Просмотр активных сегментов пользователя](#просмотр-активных-сегментов-пользователя)### Создание сегмента
Создание нового сегмента:```bash
curl --location --request POST http://localhost:8080/seg \
--data-raw '{
"slug": "AVITO_DISCOUNT_30"
}'
```Пример ответа:
```bash
{
"seg_id": 1,
"slug": "AVITO_DISCOUNT_30"
}
```### Удаление сегмента
Удаление сегмента:```bash
curl --location --request DELETE http://localhost:8080/seg \
--data-raw '{
"slug": "AVITO_DISCOUNT_30"
}'
```Пример ответа:
```bash
{
"delete segment": "AVITO_DISCOUNT_30"
}
```### Добавление/удаление пользователя в сегмент
Добавление/удаление пользователя в сегмент:```bash
curl --location --request PUT http://localhost:8080/seg \
--data-raw '{
"slug_list_add": [
"AVITO_VOICE_MESSAGES",
"AVITO_PERFORMANCE_VAS"
],
"slug_list_del": [
"AVITO_DISCOUNT_30",
"AVITO_DISCOUNT_40",
"AVITO_DISCOUNT_50",
"AVITO_DISCOUNT_60"],
"user_id": 1
}'
```Пример ответа:
```bash
{
"add segments": [
"AVITO_VOICE_MESSAGES",
"AVITO_PERFORMANCE_VAS"
],
"delete segments": [
"AVITO_DISCOUNT_30",
"AVITO_DISCOUNT_40",
"AVITO_DISCOUNT_50",
"AVITO_DISCOUNT_60"
],
"user_id": 1
}
```### Просмотр активных сегментов пользователя
Просмотр активных сегментов пользователя:```bash
curl --location --request GET http://localhost:8080/seg \
--data-raw '{
"user_id": 1
}'
```Пример ответа:
```bash
[
{
"seg_id": 5,
"slug": "AVITO_VOICE_MESSAGES"
},
{
"seg_id": 6,
"slug": "AVITO_PERFORMANCE_VAS"
}
]
```## Миграции БД
```
CREATE USER dev WITH PASSWORD 'qwerty';
CREATE DATABASE user_seg_app_dev;migrate create -ext sql -dir migrations create_segments
migrate create -ext sql -dir migrations create_users_with_segmentsmigrate -path migrations -database "postgres://localhost/user_seg_app_dev?sslmode=disable&user=dev&password=qwerty" up
\c user_seg_app_dev
\d segments
\d users_with_segmentsCREATE DATABASE user_seg_app_test;
migrate -path migrations -database "postgres://localhost/user_seg_app_test?sslmode=disable&user=dev&password=qwerty" up
```