Хранит основные сущности: Flight, Ticket, Passenger, AircraftModel, AircraftFamily и DataSeeder, хранящий тестовые данные
In-memory репозитории для работы с коллекциями объектов без базы данных
Репозитории наследуются от общего InMemoryRepository, который реализует интерфейс IRepository<TEntity, int>
Реализация репозиториев через Entity Framework Core с использованием Postgres
Содержит:
- AirCompanyDbContext - конфигурация сущностей, связей, ключей, индексов
- DbSeeder - класс для наполнения базы начальными данными из DataSeeder
- Migrations (автоматически генерируемые миграции)
- Repository для каждой сущности
DTO-классы двух видов для каждой сущности:
- EntityDto - для получения сущностей из запросов
- EntityCreateUpdateDto - для создания и изменения сущностей
А также интерфейсы для сервисов, реализованные в проекте Application
Новые DTO для батчей: BatchMessage (payload от продюсера) и BatchAckResponse (ответ консьюмера)
Сервисы реализуют интерфейсы из Contracts и используют Mapster для маппинга между DTO и Entity сущностями
Добавлен TicketService.ReceiveContractList — метод для приёма батчей; возвращает количество вставленных записей (int)
Контроллеры, наследующие CrudControllerBase
Методы для CRUD и дополнительных запросов: топ-5 рейсов, рейсы по модели, рейсы с минимальной длительностью и т.д
Использует логирование через ILogger
Проект для Aspire оркестратора: AppHost.cs регистрирует и запускает контейнеры с параметрами из appsettings.json
Добавлена поддержка NATS
Содержит стандартные настройки приложения и расширения для быстрой конфигурации сервисов
Основные функции:
OpenTelemetry — настройка логирования, метрик и трассировки HTTP и ASP.NET
Health Checks — дефолтные эндпоинты /health и /alive для проверки состояния приложения
Service Discovery — интеграция с механизмом обнаружения сервисов
HTTP-клиенты — стандартные настройки, включая обработку отказов (resilience) и интеграцию с сервис-дискавери
AirCompanyFixture для инициализации и заполнения коллекций репозиториев
Unit-тесты проверяют необходимую бизнес-логику доменных сущностей и репозиториев
Проект для генерации билетов и отправки через NATS-Producer-а в Consumer:
TicketGenerator - генерирует список TickerCreateUpdateDto через Bogus
GeneratorController - вызывает генерацию через TicketGenerator, генерирует заданное количество контрактов партиями по определенному количество с задержкой между партиями, и проверяет результат Producer-а для возможности дополнительной генерации до нужного числа
IProducerService - интерфейс для реализации Producer у Nats
AirCompanyNatsProducer - класс, реализующий IProducerService, публикует BatchMessage с BatchId и ждёт reply/ACK от consumer (request/reply)
SendAsync возвращает информацию о вставленных элементах (через BatchAckResponse ) - продюсер на основе этого решает, догенерировать недостающие элементы или повторить отправку
Также содержит Program.cs для запуска генератора, продюсера и отдельной OpenApi страницы для тестирования генерации через контроллер
NATS-consumer проект:
AirCompanyNatsConsumer - подписывается на ValidatedSubject, обрабатывает BatchMessage, вызывает TicketService.ReceiveContractList(), затем публикует BatchAckResponse в message.ReplyTo
Обрабатывает Ack / Nak и логирует результат
Проект для валидации билетов:
TicketValidatorService - получает список TickerCreateUpdateDto из RawSubject(Producer), валидирует данные, сравнивая с данными из базы данных и отправляет в ValidatedSubject только подходящие билеты