- Создание и удаление сегментов;
- Удаление старых и добавление новых сегментов пользователю;
- Получение актуальных сегментов пользователя;
- Получение истории изменений сегментов пользователя в формате CSV;
- Добавление пользователей в сегмент на время.
В связи с необходимостью поддерживать целостность истории операций, при удалении существующего сегмента лишь устанавливается метка о его неактивности.
Были добавления новые операции (обновлено значение, удален в связи с удалением сегмента и т.д.), позволяющие более четко контролировать изменения состояния пользователей.
- Запуск через docker-compose. В базу данных автоматически загрузится необходимая схема и таблицы. Сервер будет доступен по порту
8080, а база данных -8001. - Запуск бинарного файла. Настройки по умолчанию можно найти в файле
/config/config-example.yml. Для данного случая необходимо поставитьPostgres версии 15и выполнить скрипт инициализацииinit.sql.
После запуска программа выведен сообщение о начале работы. С этого момента можно начинать отправлять запросы через HTTP API.
Скрипт инициализации базы данных не содержит пользователей или сегментов. Сегменты добавляются вручную, пользователи - автоматически при вызове добавления в сегмент.
Приоритет конфигурации: config.yml рядом с бинарником > переменные окружения > настройки по умолчанию.
Swagger-документацию по API можно найти в папке /docs, а также по адресу /swagger включенного сервиса.
PUT /segment
curl --location --request PUT 'localhost:8080/segment' \
--header 'Content-Type: application/json' \
--data '{
"slug" : "TEST_SEG"
}'
DELETE /segment
curl --location --request DELETE 'localhost:8080/segment' \
--header 'Content-Type: application/json' \
--data '{
"slug" : "TEST_SEG_3"
}'
PUT /segment
curl --location --request PUT 'localhost:8080/segment' \
--header 'Content-Type: application/json' \
--data '{
"slug" : "TEST_SEG_3",
"untilDate" : "2023-09-10T13:29:07+03:00",
"percent" : "10"
}'
PUT /assignment
curl --location --request PUT 'localhost:8080/assignment' \
--header 'Content-Type: application/json' \
--data '{
"userID" : "1035",
"segmentAdd" : [
{
"slug" : "TEST_SEG"
}
],
"segmentRemove" : []
}'
PUT /assignment
curl --location --request PUT 'localhost:8080/assignment' \
--header 'Content-Type: application/json' \
--data '{
"userID" : "1026",
"segmentAdd" : [
{
"slug" : "TEST_SEG",
"untilDate" : "2023-09-05T06:51:13+03:00"
}
],
"segmentRemove" : []
}'
PUT /assignment
curl --location --request PUT 'localhost:8080/assignment' \
--header 'Content-Type: application/json' \
--data '{
"userID" : "1026",
"segmentAdd" : [
{
"slug" : "TEST_SEG_2"
}
],
"segmentRemove" : [
"TEST_SEG"
]
}'
GET /user
curl --location --request GET 'localhost:8080/user' \
--header 'Content-Type: application/json' \
--data '{
"userID" : "1026"
}'
HTTP/1.1 200 OK
Date: Thu, 31 Aug 2023 14:21:05 GMT
Status: 200 OK
Content-Type: application/json
Content-Length: 140
{
"userID": 1035,
"segmentAdd": [
{
"slug": "TEST_SEG_2",
"untilDate": ""
},
{
"slug": "TEST_SEG_3",
"untilDate": ""
},
{
"slug": "TEST_SEG",
"untilDate": ""
}
]
}
GET /user/history
curl --location --request GET 'localhost:8080/user/history' \
--header 'Content-Type: application/json' \
--data '{
"userID" : "1026",
"year" : "2023",
"month" : "8"
}'
200 OK
HTTP/1.1 200 OK
Date: Thu, 31 Aug 2023 14:18:09 GMT
Status: 200 OK
Content-Type: text/csv
Content-Length: 619
1035;TEST_SEG;Добавление;2023-08-31T17:16:05+03:00
1035;TEST_SEG_2;Добавление;2023-08-31T17:16:05+03:00
1035;TEST_SEG_3;Добавление;2023-08-31T17:16:05+03:00
1035;TEST_SEG;Обновление значения;2023-08-31T17:16:20+03:00
1035;TEST_SEG;Добавление;2023-08-31T17:17:44+03:00
1035;TEST_SEG;Удаление;2023-08-31T17:17:44+03:00
1035;TEST_SEG;Добавление;2023-08-31T17:17:57+03:00
1035;TEST_SEG;Удаление;2023-08-31T17:17:57+03:00
1035;TEST_SEG;Добавление;2023-08-31T17:18:00+03:00
1035;TEST_SEG;Удаление;2023-08-31T17:18:00+03:00
- go-chi/chi - маршрутизация, middleware;
- rs/zerolog - логгирование;
- ilyakaznacheev/cleanenv - загрузка конфигурации;
- go-playground/validator/v10 - валидация данных;
- pgx/v5 - драйвер Postgres;
- scany/v5 - чтение данных из БД в структуры;
- swaggo/swag - генерация документации API.