Это простой backend для внутренних переводов между счетами.
Что тут есть:
- регистрация и логин
- JWT auth
- refresh / logout / logout-all
- получение аккаунта и истории операций
- перевод денег между счетами
- rate limiting через Redis
- PostgreSQL для балансов и идемпотентности
- миграции и seed для development
Нужны Docker и Docker Compose:
docker compose up --buildПосле запуска сервис будет доступен по адресу:
http://localhost:8080
Проверка готовности:
make api-health-testВ development режиме уже есть два пользователя:
- sender@example.test / DemoPass123!
- receiver@example.test / DemoPass123!
Их счета и стартовые балансы уже созданы через seed.
Готовые smoke-проверки уже есть в make:
make api-auth-test
make api-accounts-testЕсли хочешь вручную сделать запрос на перевод, можно так:
curl -X POST http://localhost:8080/transactions \
-H "Authorization: Bearer <access_token>" \
-H "Idempotency-Key: demo-transfer-1" \
-H "Content-Type: application/json" \
-d '{"receiver_id":"22222222-2222-2222-2222-222222222222","amount":"125.50"}'Важно:
- одинаковый
Idempotency-Key+ тот же payload = тот же результат - тот же
Idempotency-Key+ другой payload =409 Conflict
POST /auth/registerPOST /auth/loginPOST /auth/refreshPOST /auth/logoutPOST /auth/logout-allGET /accounts/{id}GET /accounts/{id}/transactionsPOST /transactionsGET /transactions/{id}GET /health/liveGET /health/ready
- PostgreSQL — источник правды для балансов и операций
- Redis — для rate limiting
- переводы делаются внутри одной SQL-транзакции
- суммы проверяются до записи, чтобы не было некорректных значений
go test ./internal/... ./cmd/server/...E2E тесты требуют Docker:
go test ./e2e/...cmd/server— запуск APIcmd/migrate— миграцииcmd/seed— demo seedinternal/delivery/http— HTTP слойinternal/usecase— бизнес-логикаinternal/domain— сущности и интерфейсыinternal/infrastructure— PostgreSQL, Redis, config, loggermigrations— SQL миграцииe2e— end-to-end тесты
Это не продакшн-платёжка, а учебный проект, который показывает, как можно сделать нормальный backend с безопасными переводами и базовой архитектурой.