Микросервисная система курсов валют ЦБ РФ с избранными валютами пользователя.
- .NET 8, PostgreSQL (две БД), Redis, gRPC, JWT, YARP API Gateway
- Clean Architecture + MediatR (CQRS) в User и Finance
- Сервисы: Migration (EF migrations), CbrWorker (фоновая загрузка XML ЦБ), User API, Finance API, Gateway
- ТЗ: spec/Тестовое задание .Net 2.pdf
- Архитектура: spec/ARCHITECTURE.md
- .NET 8 SDK
- Docker Desktop
- Visual Studio 2022 (опционально)
git clone https://github.com/PersonaN1/finance_test_code.git
cd finance_test_code
docker compose up --buildДождитесь завершения migration и первого цикла cbr-worker.
Данные Postgres и Redis сохраняются в ./data/postgres и ./data/redis (относительные volume mounts — перезапуск контейнеров не удаляет данные).
При первом запуске Postgres выполняет docker/postgres/init-databases.sql и создаёт:
currency_user— пользователи, избранное, refresh-токены (Redis)currency_finance— справочник валют и курсы
Скрипт init выполняется только если каталог данных пуст. Если нужно пересоздать БД с нуля:
docker compose down
# Windows PowerShell:
Remove-Item -Recurse -Force .\data\postgres\*
# Linux/macOS:
# rm -rf ./data/postgres/*
docker compose up --buildПосле wipe migration применит EF-миграции заново.
| Сервис | URL |
|---|---|
| Gateway (публичный REST) | http://localhost:8080 |
| User Swagger (через gateway) | http://localhost:8080/user/swagger |
| Finance Swagger (через gateway) | http://localhost:8080/finance/swagger |
Прямой доступ к API/Swagger (порты уже в docker-compose.yml): http://localhost:5001/swagger , http://localhost:5002/swagger
- Поднять только инфраструктуру:
docker compose -f docker-compose.infra.yml up -dPostgres: localhost:5432, Redis: localhost:6379. Если 5432 занят — в docker-compose.infra.yml поставь "5433:5432" и тот же Port в launchSettings.
- Открыть
CurrencyRates.sln. - Включить Multi-Project Launch Profiles (VS 17.11+): Tools → Options → Preview Features → Enable Multi-Project Launch Profiles.
- В toolbar выбрать профиль All services (файл
CurrencyRates.slnLaunch) и F5.
Профили:
- All services — Migration (one-shot, без отладчика: накатит схему и выйдет) → User → Finance → Worker → Gateway
- All services (no migration) — то же без Migration (если схема уже есть)
Gateway: http://localhost:8080
Jwt/Grpc ключи заданы в Properties/launchSettings.json каждого проекта.
# Регистрация
curl -X POST http://localhost:8080/api/auth/register -H "Content-Type: application/json" -d "{\"name\":\"demo\",\"password\":\"secret123\"}"
# Логин
curl -X POST http://localhost:8080/api/auth/login -H "Content-Type: application/json" -d "{\"name\":\"demo\",\"password\":\"secret123\"}"
# Справочник валют (без JWT)
curl http://localhost:8080/api/finance/currencies
# Избранное (подставьте accessToken)
curl -X PUT http://localhost:8080/api/users/me/favorites -H "Authorization: Bearer ACCESS_TOKEN" -H "Content-Type: application/json" -d "{\"currencyCodes\":[\"USD\",\"EUR\"]}"
# Курсы
curl http://localhost:8080/api/finance/rates -H "Authorization: Bearer ACCESS_TOKEN"
# Logout
curl -X POST http://localhost:8080/api/auth/logout -H "Authorization: Bearer ACCESS_TOKEN" -H "Content-Type: application/json" -d "{\"refreshToken\":\"REFRESH_TOKEN\"}"dotnet test