Очень упрощенная Clean Architecture. Проект небольшой и я решил сильно не заморачиваться. Entities ≈ models, Usecases ≈ service, Controllers/Presenters ≈ api, Repositories ≈ db. Показалось, что интерфейсы только добавят путаницы, и отказался от них.
Файл с созданием индексов.
Их всего два: текстовый, для уникальных значений report_id, и второй, для ускорения работы с user_id в POST /api/user/link-anonymous и GET /api/user/reports.
Перед запуском нужно только настроить .env.
DB_USER=admin
DB_PASS=admin
DB_NAME=billing
POSTGRES_HOST=localhost:5432
MONGO_HOST=localhost:27017
SECRET_KEY=secret-key
Переменные DB_* общие для PostgreSQL и MongoDB (сделано для удобства). POSTGRES_HOST и MONGO_HOST нужны, если запускать апи отдельно от docker-compose.yml и на запуск через docker-compose up не влияют. SECRET_KEY ключ для JWT токенов.
После настройки окружения, просто запуск:
docker compose up -dcurl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"login": "testuser",
"password": "testpass"
}'curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"login": "testuser",
"password": "testpass"
}'curl -X POST http://localhost:8080/api/mock/create-report \
-H "Content-Type: application/json" \
-d '{
"client_generated_id": "abc123"
}'curl -X POST http://localhost:8080/api/user/link-anonymous \
-H "Content-Type: application/json" \
-H "Authorization: {{ACCESS_TOKEN}}" \
-d '{
"client_generated_id": "abc123"
}'a bit of bad practice
curl -X GET http://localhost:8080/api/user/reports \
-H "Content-Type: application/json" \
-H "Authorization: {{ACCESS_TOKEN}}" \
-d '{
"limit": 10,
"offset": 0
}'curl -X POST http://localhost:8080/api/reports/{{report_id}}/purchase \
-H "Content-Type: application/json" \
-H "Authorization: {{ACCESS_TOKEN}}" \
-d '{
"price": 100
}'