REST-сервис для агрегации данных об онлайн-подписках пользователей.
- Go 1.26
- PostgreSQL 17
- chi — HTTP-роутер
- pgx/v5 — драйвер PostgreSQL (connection pool)
- golang-migrate — миграции БД
- cleanenv — конфигурация через YAML + env
- swaggo — Swagger-документация
- Docker Compose
- CRUDL-операции над подписками
- Подсчёт суммарной стоимости подписок за период с фильтрацией по пользователю и сервису
- Поле
end_date— последний оплаченный месяц (включительно)
- Создать
.envв корне проекта:
POSTGRES_DB=subscriptions
POSTGRES_USER=admin
POSTGRES_PASSWORD=your_password
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_SSLMODE=disable
HTTP_ADDRESS=0.0.0.0:8080
CONFIG_PATH=config/docker.yaml- Запустить:
docker compose up --buildСервис поднимется на http://localhost:8080. Миграции применяются автоматически при старте.
-
Запустить PostgreSQL и создать базу данных.
-
Заполнить
config/local.yaml:
env: "local"
http_server:
address: "localhost:8080"
timeout: 4s
idle_timeout: 30s
db_server:
host: "localhost"
port: "5432"
user: "admin"
password: "your_password"
database_name: "subscriptions"
sslmode: "disable"- Запустить:
CONFIG_PATH=config/local.yaml go run ./cmd/appSwagger UI доступен по адресу: http://localhost:8080/swagger/index.html
| Метод | Путь | Описание |
|---|---|---|
POST |
/subscriptions |
Создать подписку |
GET |
/subscriptions |
Список всех подписок |
GET |
/subscriptions/{id} |
Получить подписку по ID |
PUT |
/subscriptions/{id} |
Обновить подписку |
DELETE |
/subscriptions/{id} |
Удалить подписку |
GET |
/subscriptions/total |
Суммарная стоимость за период |
curl -X POST http://localhost:8080/subscriptions \
-H "Content-Type: application/json" \
-d '{
"service_name": "Yandex Plus",
"price": 400,
"user_id": "60601fee-2bf1-4721-ae6f-7636e79a0cba",
"start_date": "07-2025",
"end_date": "09-2025"
}'curl "http://localhost:8080/subscriptions/total?start_date=07-2025&end_date=10-2025&user_id=60601fee-2bf1-4721-ae6f-7636e79a0cba"Параметры user_id и service_name — опциональные фильтры. Период задаётся в формате MM-YYYY, start_date включается, end_date исключается.