- 🚀 Установка и запуск
- 📦 Архитектура проекта
- 🔐 Аутентификация
- ✅ Валидация данных
- 🧪 Тестирование
- 📺 Демонстрация работы в Swagger
Перед запуском убедитесь, что установлены:
git clone https://github.com/Volodya1000/EventManager.git
cd EventManagerВыполните
Cert\generate-dev-cert.ps1 данный файл создаст сертификат Cert\localhost-dev.pfx
Открыть решение EventManager.sln.
В выпадающем списке запуска выбрать docker-compose.
Нажать F5 или кнопку
В браузере автоматически откроется:
https://localhost:5001/swagger
Visual Studio автоматически соберет проект, запустит все сервисы (API, PostgreSQL, Redis), и пробросит порты.
Убедитесь, что Docker Desktop, и вы находитесь в корне проекта (EventManager/)
Выполните команду:
docker-compose up --buildПосле успешного запуска Swagger будет доступен на:
https://localhost:5001/swagger
Для остановки:
docker-compose downВот как выглядят запущенные контейнеры
Для тестирования конечных точек, доступных только администраторам, вы можете использовать учётные данные администратора, заданные по умолчанию:
{
"email": "admin@example.com",
"password": "StrongPassword123!"
}Этот первый администратор автоматически добавляется в базу данных.
После успешного входа в систему с этими данными, администратор получает доступ к защищённым конечным точкам, а также может назначать права администратора другим пользователям
- Содержит Minimal API endpoints
- Реализован глобальный обработчик ошибок
- Настроена аутентификация и авторизация
- Конфигурация сервисов и middlewares
- реализован глобальный обработчик ошибок
- Реализация всей бизнес-логики
- Связующее звено между API и Persistence
- Реализации сервисов, интерфейсы сервисов и репозиториев
- Определены запросы
- Используется
FluentValidationдля валидации запросов - Используется
AutoMapperдля преобразования моделей в Dto
- Хранит доменные модели и бизнес-логику
- Содержит интерфейсы репозиториев и UnitOfWork
- Реализованы правила: например, добавление/удаление участников события
- Валидация происходит через фабричный метод (
Create), а не через публичные конструкторы - Все коллекции объявлены как
private readonly, поля — сprivate set - Используются кастомные исключения
- Не зависит от других проектов
- Слой инфраструктуры доступа к данным
- Используется PostgreSQL в Docker-контейнере
- Используется EF Core, конфигурации сущностей вынесены в классы, реализующие
IEntityTypeConfiguration<T> - Реализован паттерн Unit of Work для обеспечения транзакционности операций удаления изображений
- Осуществляется маппинг между сущностями базы и DTO/доменными моделями
- Все запросы LINQ к EF Core используют
AsNoTracking
- Реализация сервиса кеширования и сервиса работы с файлами
По всему стеку вызовов, во всех проектах внедрён CancellationToken:
- позволяет отменять долгие или ненужные операции
- освобождает ресурсы при отмене запроса
Для кеширования используется Redis как распределённое кэш-хранилище для оптимизации работы с изображениями событий.
Сервис ImageService реализует методы для загрузки, удаления и получения изображений, связанных с событиями. Redis используется при получении изображений для:
- Уменьшения количества обращений к файловой системе;
- Повышения скорости отклика при повторных запросах;
- Минимизации нагрузки на хранилище.
- Используется xUnit
- Библиотеки:
FluentAssertions- её преимущество в удобном синтаксисе (формат написания проверки субъект -> действие -> объект более привычен для людей). Другим плюсом является информативность сообщений, который встроены по умолчанию- библиотека
Moq
- Используется InMemoryDatabase
- Реализованы тесты для модели события:
- Для бизнес-логики модели события
- Для всех слоев: Application, Persistence, Domain
- Проект
Application.Tests:- Тестируется
EventService - Используется
EventTestFactoryдля создания моков, данных пользователей и событий по умолчанию
- Тестируется
Валидация происходит на нескольких уровнях в разных слоях проекта:
- Используется FluentValidation для валидации входящих запросов (например, регистрация пользователя, создание события и т.д.).
- При проверке ограничений, таких как длина строк, используются константы, определённые в доменных моделях.
- Все валидаторы находятся в проекте
EventManager.Application.
- Создание экземпляров доменных моделей осуществляется через
Create(...). - Внутри метода
Createпроверяется корректность переданных параметров..
- Вся бизнес логика проверяется толко в проекте
EventManager.Application. Благодаря этому конечные точки остаются тонкими и репозитории не захламлены проверками
В проекте реализована безопасная система аутентификации на основе JWT-токенов и токенов обновления.
Используется Microsoft.AspNetCore.Identity
- Пользователь предоставляет: email, пароль, имя, фамилию, дату рождения.
- Пароль валидируется по правилам ASP.NET Identity:
- Минимум 8 символов
- Обязательные: заглавная буква, строчная буква, цифра, специальный символ
- При успешной регистрации:
- Создается запись пользователя
- Назначается роль User по умолчанию
- Пользователь вводит email и пароль
- Проверка учетных данных через Identity
- При успехе:
- JWT Access Token:
- Содержит: ID пользователя, email, имя, роли
- Подписывается симметричным ключом из конфигурации
- Клиент отправляет истекший
access tokenи валидныйrefresh token - Система проверяет:
- Существование
refresh tokenв базе - Срок действия
refresh token
- Существование
- При успехе:
- Выдаются новые
accessиrefreshтокены
- Выдаются новые
- Реализована ролевая модель доступа через ASP.NET Identity
- Эндпоинты защищаются атрибутами:
[Authorize(Roles = "Admin")] - Системные роли:
User— базовые праваAdmin— расширенные привилегии (назначение ролей и добавление, редактирование событий, категорий)
Назначение прав администратора:
- Существующие админы могут повышать пользователей по email
- После назначения:
- Пользователь добавляется в роль
Admin - Текущие сессии сохранят старые права до обновления токенов
- Пользователь добавляется в роль