Repository navigation
Implementation Details
Сводка по репозиторию: порты, gRPC-контракты, структура решения, инфраструктура Docker и общие компоненты. Используется как справочник при разработке и онбординге.
- Порты и сервисы
- gRPC: контракты и вызовы
- Базы данных
- Общие библиотеки
- Структура решения (sln)
- Фронтенд
- Переменные окружения (Docker)
| Сервис | Порт (host→container) | Описание |
|---|---|---|
| gateway | 5000→8080 | API Gateway (YARP), единая точка входа |
| identity-service | 5010→8080 | Identity: auth, JWT, профиль, gRPC GetUserSummary |
| catalog-service | 5020→8080 | Catalog: туры, направления, gRPC GetTourSnapshot |
| booking-service | 5030→8080 | Booking: заявки, избранное, gRPC ValidateBookingAccess |
| chat-service | 5040→8080 | Chat: сообщения по заявке, SignalR /hubs/chat |
| media-service | 5050→8080 | Media: загрузка/скачивание файлов, MinIO |
| frontend | 3000→80 | SPA (Vite), профиль full в Docker Compose |
| postgres | 5432 | Один инстанс, несколько БД |
| redis | 6379 | Health check Chat (опционально) |
| minio | 9000, 9001 | API и консоль |
Клиенты обращаются к Gateway (например, http://localhost:5000); запросы к /api/v1/* проксируются на соответствующий бэкенд с заменой префикса пути (см. Service-Gateway).
Файлы .proto лежат в TravelAgency.Contracts.Grpc/Protos/.
- Сервис: IdentityGrpc.
- Метод: GetUserSummary(user_id) → UserSummaryResponse (user_id, email, first_name, last_name, role).
- Кто вызывает: Booking (при создании заявки/предложения — проверка пользователя).
- Сервис: CatalogService.
- Метод: GetTourSnapshot(tour_id) → TourSnapshotResponse (tour_id, title, description, price, currency, duration_days, snapshot_taken_at, found).
- Кто вызывает: Booking (при создании заявки/предложения — проверка тура и снимок данных).
- Сервис: BookingService.
- Метод: ValidateBookingAccess(booking_id, user_id) → ValidateBookingAccessResponse (has_access).
- Кто вызывает: Chat (перед выдачей сообщений или при подключении к Hub по заявке).
Все межсервисные gRPC-вызовы защищены заголовком с InternalServiceToken (GrpcSettings:InternalServiceToken). Реализация интерцептора и регистрация клиентов — в Shared.Infrastructure и в Infrastructure каждого сервиса.
Один экземпляр PostgreSQL; отдельная БД на сервис (database-per-service). Создание БД — скрипт docker/init-db.sql:
- travel_identity
- travel_catalog
- travel_booking
- travel_chat
- travel_media
Миграции EF Core хранятся в проекте Infrastructure каждого сервиса. Приложение может применять миграции при старте, если задано ASPNETCORE_RUN_MIGRATIONS=true (типично в Docker Compose).
| Проект | Назначение |
|---|---|
| TravelAgency.Shared.Contracts | Роли (Client, Manager, Admin), политики авторизации (AuthPolicies), DTO/абстракции (ICurrentUserService и др.). |
| TravelAgency.Contracts.Grpc | .proto-файлы (identity, catalog, booking) и сгенерированный C# код для gRPC. |
| TravelAgency.Shared.Infrastructure | Serilog, MediatR, FluentValidation, CorrelationIdMiddleware, GlobalExceptionHandlerMiddleware, маппинг исключений в ProblemDetails (IExceptionMapper), регистрация gRPC-клиентов и GrpcAuthInterceptor. |
API и сервисы ссылаются на Shared.Contracts и Shared.Infrastructure; сервисы, участвующие в gRPC, ссылаются на Contracts.Grpc.
- src/Shared/ — Contracts, Contracts.Grpc, Shared.Infrastructure (+ Tests).
- src/Gateway/ — Gateway, Gateway.Tests.
- src/Services/Identity/ — Domain, Application, Infrastructure, API, UnitTests, IntegrationTests.
- src/Services/Catalog/ — то же.
- src/Services/Booking/ — Domain, Application, Infrastructure, API, UnitTests, Infrastructure.UnitTests, IntegrationTests.
- src/Services/Chat/ — Domain, Application, Infrastructure, API, UnitTests, IntegrationTests.
- src/Services/Media/ — Domain, Application, Infrastructure, API, UnitTests, IntegrationTests.
- src/Frontend/travel-agency-frontend/ — не в .sln; Vite + React, свой Dockerfile.
Целевая платформа бэкенда: .NET 10 (global.json, Directory.Build.props). Сборка: dotnet build из корня решения; Docker — из папки docker (docker compose up).
- Путь: src/Frontend/travel-agency-frontend/.
- Стек: Vite, React, TypeScript.
- В Docker Compose: сервис frontend, профиль full (запускается только с
docker compose --profile full up). Переменная сборки VITE_API_URL — базовый URL к API (обычно к Gateway). - Не входит в TravelAgency.sln.
Типичные переменные в .env (или в docker-compose):
| Переменная | Пример | Назначение |
|---|---|---|
| POSTGRES_USER | postgres | Пользователь PostgreSQL |
| POSTGRES_PASSWORD | secret | Пароль PostgreSQL |
| JWT_SIGNING_KEY | строка ≥32 символов | Подпись JWT (все сервисы и Gateway) |
| GRPC_INTERNAL_SERVICE_TOKEN | секрет | Токен для gRPC сервис-сервис |
| MINIO_ROOT_USER | minioadmin | MinIO (Media) |
| MINIO_ROOT_PASSWORD | minioadmin | MinIO (Media) |
| VITE_API_URL | http://localhost:5000 | URL Gateway для фронтенда (при сборке образа) |
В compose для каждого сервиса задаются свои ConnectionStrings, JwtSettings, GrpcClients и т.д. (см. docker/docker-compose.yml).
- Архитектура — принципы, сервисные границы и runtime-схема.
- Сервис API Gateway — маршруты, auth, rate limit.
- Сервис Identity | Catalog | Booking | Chat | Media — описание каждого сервиса.
- Обзор проекта
- Архитектура и зависимости
- API-карта
- Gateway
- Identity
- Catalog
- Booking
- Chat
- Media
- gRPC контракты
- Архитектура
- Детали реализации
- Сервис API Gateway
- Сервис Identity
- Сервис Catalog
- ADR-001. Модель тура
- Сервис Booking
- Сервис Chat
- Сервис Media
- Содержимое сайта
- Стек и версии
- Глоссарий
- Соответствие экранов и API