Сервис управления подписками пользователей с полным жизненным циклом, историей изменений, уведомлениями и статистикой.
Основной функционал:
- Создание подписок с валидацией дат и стоимости
- Управление статусом (активна, приостановлена, отменена, истекла)
- Просмотр подписок по ID, списком, с фильтрацией
- Отмена и приостановка с корректной обработкой переходов статусов
- Получение активных подписок пользователя
Фильтры и поиск:
- По пользователю (userId)
- По сервису (serviceName)
- По статусу (status)
- По диапазону дат (startDate, endDate)
- Пагинация и сортировка
Дополнительные функции:
- Автоматический перевод истёкших подписок в статус EXPIRED (каждый час)
- Напоминания за 7 дней до окончания подписки (ежедневно в 9:00)
- Полная история изменений статусов
- Статистика по статусам подписок
- Экспорт подписок в CSV
- Spring Boot 3.5.14
- Kotlin
- Spring Data JPA
- PostgreSQL / H2
- Liquibase
- Quartz Scheduler
- OpenAPI / Swagger
- JUnit 5, Testcontainers
- Docker & docker-compose
ACTIVE -> PAUSED <-> ACTIVE -> CANCELLED ACTIVE -> EXPIRED (автоматически)
Правила:
- ACTIVE -> PAUSED, CANCELLED
- PAUSED -> ACTIVE, CANCELLED
- CANCELLED и EXPIRED не имеют дальнейших переходов
docker-compose up --build
Приложение будет доступно на http://localhost:8080 Swagger UI: http://localhost:8080/swagger-ui.html
./gradlew build
./gradlew bootRun
Приложение будет доступно на http://localhost:8080 Swagger UI: http://localhost:8080/swagger-ui.html H2 Console: http://localhost:8080/h2-console
./gradlew test
Основные эндпоинты (базовый путь /api/v1/subscriptions):
- POST / - создание подписки
- GET /{id} - получение подписки по ID
- GET / - список подписок с пагинацией
- GET /filter - фильтрация подписок
- PUT /{id}/status - обновление статуса
- PUT /{id}/pause - приостановка
- PUT /{id}/resume - возобновление
- DELETE /{id} - отмена
- GET /user/{userId}/active - активные подписки пользователя
- GET /{id}/history - история изменений
- GET /statistics - статистика
- GET /export/csv - экспорт в CSV
Пример создания подписки:
POST /api/v1/subscriptions
Content-Type: application/json
{
"userId": 1,
"serviceName": "Netflix",
"cost": 15.99,
"startDate": "2026-05-24T10:00:00",
"endDate": "2026-06-24T10:00:00"
}
Основные параметры в application.yaml:
- spring.datasource.url
- spring.jpa.hibernate.ddl-auto
- spring.liquibase.change-log
- spring.quartz.properties
- Все даты в формате ISO-8601
- Стоимость указывается с двумя знаками после запятой
- Поле updatedAt обновляется автоматически при изменении
- Все изменения статусов сохраняются в истории с причиной и временем