REST API для управления интерактивной картой планов корпусов.
| Компонент | Версия |
|---|---|
| .NET SDK | 10.0 или выше |
| Docker | 20.10 или выше |
| Docker Compose | 2.0 или выше |
| PostgreSQL | 18 (используется в Docker) |
На Windows/macOS/Linux:
- Установите .NET 10 SDK
- Установите Docker Desktop
- .NET 10 / ASP.NET Core 10 - веб-фреймворк
- Docker + Docker Compose - контейнеризация и оркестрация
- PostgreSQL 18 + Entity Framework Core 10 (Npgsql) - база данных и ORM
- Swagger / OpenAPI - документация API
- AutoMapper 16 - маппинг между DTOs и сущностями
- xUnit 2.9 - фреймворк для тестирования
Проект построен по принципам Clean Architecture и разбит на 4 слоя:
src/
├── VoguMap.Web # Точка входа: контроллеры, middleware, DI
├── VoguMap.Application # Бизнес-логика: сервисы, DTO, AutoMapper-профили
├── VoguMap.Domain # Ядро: сущности, интерфейсы, исключения
├── VoguMap.Infrastructure # Инфраструктура: EF Core, репозитории, контекст БД
└── VoguMap.Tests # Тесты: интеграционные и юнит-тесты
- Запуск проекта в Docker:
docker compose up --build- Проверка доступности сервисов:
| Сервис | Адрес |
|---|---|
| API | http://localhost:8080 |
| Swagger UI | http://localhost:8080/swagger |
| PostgreSQL | localhost:5432 (контейнер) |
База данных
postgresподнимается автоматически в Docker-контейнере.
В режиме Development миграции применяются самим приложением при старте.
-
Установи .NET 10 SDK и PostgreSQL 18.
-
В корне проекта создай файл
.envна основе.env.example:
cp .env.example .envОтредактируй .env с правильными параметрами:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=vogumap
DB_USER=postgres
DB_PASSWORD=your_password
ASPNETCORE_ENVIRONMENT=Development
ASPNETCORE_URLS=http://0.0.0.0:5000- Примени миграции базы данных:
dotnet ef database update --project src/VoguMap.Infrastructure- Запусти API:
dotnet run --project src/VoguMap.WebAPI будет доступен на http://localhost:5000, Swagger на http://localhost:5000/swagger.
Файл .env в корне проекта содержит переменные окружения для API и БД.
| Переменная | Описание | Пример |
|---|---|---|
DB_HOST |
Host базы данных (в Docker postgres, локально localhost) |
postgres |
DB_PORT |
Порт базы данных | 5432 |
DB_NAME |
Имя базы данных | vogumap |
DB_USER |
Пользователь PostgreSQL | postgres |
DB_PASSWORD |
Пароль PostgreSQL | password123 |
ASPNETCORE_ENVIRONMENT |
Окружение ASP.NET Core (Development/Production) |
Production |
ASPNETCORE_URLS |
URL, на котором слушает Kestrel | http://0.0.0.0:80 |
dotnet testdotnet test --verbosity normaldotnet test --filter "Category=Integration"src/VoguMap.Tests/
├── IntegrationTests/
│ ├── BuildingServiceIntegrationTests.cs # Тесты сервиса корпусов
│ └── RoomServiceIntegrationTests.cs # Тесты сервиса помещений
├── Repositories/
│ └── *RepositoryTests.cs # Юнит-тесты репозиториев
├── Context/
│ └── InMemoryDbContext.cs # InMemory контекст для тестов
└── Factories/
└── *Factory.cs # Фабрики для создания тестовых данных
Запуск интеграционных тестов:
dotnet test src/VoguMap.Tests/VoguMap.Tests.csproj --filter "FullyQualifiedName~IntegrationTests"Запуск конкретного теста:
dotnet test src/VoguMap.Tests/VoguMap.Tests.csproj --filter "FullyQualifiedName~BuildingServiceIntegrationTests"| Поле | Тип | Описание |
|---|---|---|
Id |
int | Первичный ключ |
Name |
string | Название корпуса |
Address |
string | Адрес корпуса |
Rooms |
List | Помещения в корпусе (навигационное свойство) |
CreatedAt |
DateTime | Дата создания |
UpdatedAt |
DateTime? | Дата последнего обновления |
| Поле | Тип | Описание |
|---|---|---|
Id |
int | Первичный ключ |
Name |
string | Название помещения |
Floor |
int | Номер этажа |
Capacity |
int | Вместимость помещения |
BuildingId |
int | Внешний ключ на Building |
Building |
Building | Навигационное свойство на корпус |
CreatedAt |
DateTime | Дата создания |
UpdatedAt |
DateTime? | Дата последнего обновления |
Приложение использует встроенную систему логирования ASP.NET Core. Логи выводятся в консоль.
docker compose logs webapiПросмотр логов в реальном времени:
docker compose logs -f webapiПросмотр логов только PostgreSQL:
docker compose logs postgres- Подготовка переменных окружения:
Создай .env файл с Production переменными:
DB_HOST=your-production-db-host
DB_PORT=5432
DB_NAME=vogumap_prod
DB_USER=prod_user
DB_PASSWORD=strong_password_here
ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://0.0.0.0:80- Сборка и запуск в Docker:
docker compose -f docker-compose.yml up -d- Проверка статуса контейнеров:
docker compose psСоздание бэкапа:
docker exec vogumap-postgres pg_dump -U $DB_USER $DB_NAME > backup.sqlВосстановление из бэкапа:
docker exec -i vogumap-postgres psql -U $DB_USER $DB_NAME < backup.sqlsrc/
├── VoguMap.Web/
│ ├── Controllers/v1/ # REST-контроллеры (Building, Room)
│ ├── Middlewares/ # Промежуточные слои (ExceptionHandler)
│ ├── appsettings.json # Конфигурация приложения
│ └── Program.cs # Точка входа, конфигурация DI
│
├── VoguMap.Application/
│ ├── Common/ # Базовые классы (PagedResultDto, BaseService)
│ ├── DTOs/ # Data Transfer Objects (BuildingDto, RoomDto)
│ ├── Helpers/ # Вспомогательные классы
│ ├── Mappings/ # AutoMapper-профили (BuildingProfile, RoomProfile)
│ └── Services/ # Интерфейсы и реализации сервисов
│ ├── Interfaces/ # IBuildingService, IRoomService
│ └── Implementations/ # BuildingService, RoomService
│
├── VoguMap.Domain/
│ ├── Entities/ # EF Core-сущности (Building, Room)
│ ├── Interfaces/ # Интерфейсы (IRepository, IUnitOfWork)
│ ├── Filters/ # Классы для фильтрации (RoomFilterDto)
│ └── Exceptions/ # Пользовательские исключения
│
├── VoguMap.Infrastructure/
│ └── Persistence/
│ ├── Context/ # VoguMapContext (DbContext)
│ ├── Repositories/ # Реализации репозиториев (GenericRepository, BuildingRepository)
│ ├── Migrations/ # EF Core-миграции
│ ├── Seed/ # Заполнение справочных данных (ApplicationDbSeeder)
│ └── Factories/ # Фабрика для создания контекста
│
└── VoguMap.Tests/
├── Context/ # Имитации DbContext (InMemory)
├── Factories/ # Фабрики создания тестовых сущностей
├── IntegrationTests/ # Интеграционные тесты сервисов
│ ├── BuildingServiceIntegrationTests.cs
│ └── RoomServiceIntegrationTests.cs
└── Repositories/ # Юнит-тесты репозиториев
├── BuildingRepositoryTests.cs
└── RoomRepositoryTests.cs