Переписаны модули, тесты, обработка ошибок

This commit is contained in:
Халимов Рустам
2026-03-10 21:08:03 +03:00
parent 5c9c6ab975
commit 4e06e48657
126 changed files with 6549 additions and 803 deletions
+72 -98
View File
@@ -1,138 +1,112 @@
# 🔮 Nashel — Backend API
> **ASP.NET Core · Modular Monolith · PostgreSQL · Docker**
> **ASP.NET Core · Modular Monolith · PostgreSQL (PostGIS) · Docker**
Серверная часть платформы **Nashel** — маркетплейса для поиска и найма профессиональных исполнителей (мастеров, специалистов и компаний). Бэкенд построен по принципу **Модульного Монолита** с чёткой доменной изоляцией.
Серверная часть платформы **Nashel** инновационного маркетплейса для поиска и найма профессиональных исполнителей. Бэкенд построен по принципу **Модульного Монолита**, что обеспечивает идеальный баланс между скоростью разработки и чистотой архитектуры с четкой доменной изоляцией.
---
## 🎯 Какую проблему решает Nashel
## 🎯 Миссия Nashel
В России огромное количество мастеров и специалистов, которые работают «по сарафанному радио» — без нормальных инструментов для привлечения клиентов. А клиенты, в свою очередь, тратят время на поиск через знакомых или ненадёжные сайты объявлений.
Мы создаем прозрачную экосистему, где мастера получают профессиональный инструментарий для ведения бизнеса, а клиенты — надежный сервис поиска по геолокации, реальным отзывам и защищенным сделкам.
**Nashel** — это:
- Удобный и быстрый поиск исполнителей **рядом с тобой** на карте
- Прозрачная система услуг с ценами, фото и описанием
- Система репутации и отзывов
- Безопасное взаимодействие клиента и исполнителя
**Ключевые преимущества:**
- **Гео-центричность:** Поиск исполнителей в радиусе на карте.
- **Интеллектуальный статус:** Проверка доступности мастера в реальном времени.
- **Безопасность:** Проработанный жизненный цикл заказа с системой споров.
- **Репутация:** Честная система отзывов, привязанная к реальным сделкам.
---
## 👤 Роли пользователей
## 🧱 Архитектура и Технологии
| Роль | Описание |
|------|----------|
| **Клиент** | Ищет услуги на карте, просматривает профили исполнителей, оставляет заявки |
| **Кандидат в мастера** | Зарегистрировался как исполнитель, проходит верификацию |
| **Мастер** | Верифицированный исполнитель — частный специалист, самозанятый |
| **Компания** | Юридическое лицо, предоставляющее услуги через платформу |
Проект реализован как **Modular Monolith**. Каждый модуль — это изолированная единица со своей логикой, данными и API, взаимодействующая с другими через контракты BuildingBlocks.
---
## 🧱 Архитектура
Проект реализован как **Modular Monolith** — единое приложение, разделённое на изолированные модули с чёткими границами. Каждый модуль содержит:
### Технологический стек
- **Runtime:** .NET 8 / ASP.NET Core
- **Database:** PostgreSQL + **PostGIS** (гео-запросы)
- **ORM:** Entity Framework Core
- **Messaging:** MediatR (In-process commands/queries)
- **Security:** JWT Authentication, Role-based Access Control
- **Spatial:** NetTopologySuite
### Структура модуля
```
Modules/<Module>/
├── Application/ # Команды, запросы, DTO (MediatR)
├── Domain/ # Сущности, бизнес-логика, интерфейсы репозиториев
├── Infrastructure/ # Реализация репозиториев, EF Core DbContext
└── Presentation/ # HTTP Endpoints (Minimal API)
├── Domain/ # Сущности, Value Objects, Доменные события
├── Application/ # Use Cases (MediatR Handlers), DTOs, Mapping
├── Infrastructure/ # EF Core (Persistence), External Services
└── Presentation/ # Minimal API Endpoints
```
### Модули
---
| Модуль | Назначение |
|--------|------------|
| **Identity** | Регистрация, авторизация (JWT), профиль, роли, аватар, геолокация, расписание |
| **Catalog** | Управление услугами (CRUD), изображения, статусы, атрибуты |
| **Geo** | Геозоны, расчёт расстояний (PostGIS / NetTopologySuite) |
| **Search** | Полнотекстовый поиск по услугам и компетенциям с учётом геопозиции |
| **Reputation** | Отзывы и рейтинги (в разработке) |
| **Collaboration** | Заявки и взаимодействие клиент ↔ исполнитель (в разработке) |
| **Order** | Заказы и их жизненный цикл (в разработке) |
## 🚀 Реализованные Модули
### Host
`Host/` — точка входа приложения. Здесь настраиваются DI, middleware, маршрутизация и сборка всех модулей.
| Модуль | Статус | Функционал |
|--------|--------|------------|
| **Identity** | ✅ Ready | Auth (JWT), Профили, Аватары (Base64), Расписание, Статусы доступности |
| **Catalog** | ✅ Ready | Управление услугами (CRUD), Multi-image (до 10 фото), Атрибуты |
| **Search** | ✅ Ready | Full-text search, сортировка по Geo-дистанции и релевантности |
| **Geo** | ✅ Ready | Расчет расстояний, Геозоны, Индексация координат |
| **Order** | ✅ Ready | Заказы (Direct/Public), SLA таймеры, Система споров (Disputes), Отклики |
| **Reputation** | ✅ Ready | Отзывы, Рейтинги (User/Offer), Дополнения к отзывам |
| **Collaboration**| ✅ Ready | HR-инструментарий: Найм, Наложение вето на расписание, Проверки |
---
## ✅ Что реализовано
## ⚙️ Ключевая Логика
### Аутентификация и профиль
- Регистрация и вход по логину/паролю (JWT токены)
- Смена пароля, обновление профиля
- Загрузка аватара (хранится как base64 в БД)
- Переход в роль исполнителя: описание, компетенции, геолокация
### 1. Умная доступность (Smart Status)
Мастер может управлять своей доступностью двумя способами:
- **Расписание:** Настройка рабочих дней и часов.
- **Manual Toggle:** Ручное переключение статуса «Готов к заказу». Ручная активация имеет приоритет и действует до конца текущего дня, перекрывая стандартное расписание.
### Геолокация
- Привязка основного адреса и текущего местоположения
- Расчёт расстояния до исполнителей с помощью **PostGIS + NetTopologySuite**
- Геозоны для фильтрации исполнителей в радиусе
### 2. Жизненный цикл заказа (Order Flow)
Реализована сложная машина состояний:
1. **Создание:** Прямой заказ мастеру или публикация заявки в общий доступ.
2. **SLA:** Для прямых заказов действует 60-минутный таймер на принятие.
3. **Исполнение:** Статусы "В работе", "Выполнено", "Подтверждено".
4. **Споры (Disputes):** Многоэтапный процесс разрешения конфликтов (Открытие -> Ответ мастера -> Возражение клиента -> Принятие условий).
### Услуги (Catalog)
- Создание, редактирование, удаление (soft delete) услуг
- Приостановка услуги (пауза)
- Загрузка до 10 изображений (≤5 МБ каждое), хранение в БД
- Атрибуты услуги (произвольные ключ-значение пары)
- Первое изображение является обложкой
### Поиск
- Полнотекстовый поиск по: названию услуги, описанию, компетенциям
- Результаты сортируются с учётом расстояния и релевантности
- Исполнитель показывается в поиске только если у него нет найденных услуг (приоритет услуги над специалистом)
- Приостановленные и удалённые услуги не отображаются
- Возврат URL первого изображения услуги для превью в поиске
### Расписание и статус доступности
- Настройка рабочих дней и «всегда готов»
- Умная логика статуса: ручное включение статуса «Готов к заказу» переопределяет расписание до конца текущего дня
### 3. Поиск и Геолокация
- Поиск учитывает не только текст, но и **расстояние**.
- В приоритете — конкретные услуги. Если мастер не имеет услуг, он показывается как специалист.
- Интеграция с PostGIS позволяет делать сверхбыстрые выборки в радиусе.
---
## 🗄️ База данных
- **PostgreSQL** с расширением **PostGIS** (геопространственные запросы)
- **Entity Framework Core** (Code First, миграции)
- Структура: таблица `Accounts`, `Performers`, `Offers`, `Competencies` и др.
---
## 🐳 Запуск через Docker
## 🐳 Развертывание
### Docker (Рекомендуемо)
```bash
# Запуск базы данных и бэкенда
docker-compose up -d --build
```
Это запустит:
- Бэкенд (порт 5000)
- PostgreSQL + PostGIS (порт 5432)
Настройки в `docker-compose.yml` (строка подключения, порты, переменные окружения).
### Локальный запуск
1. Установите PostgreSQL и расширение PostGIS.
2. Обновите строку подключения в `appsettings.json`.
3. Примените миграции:
```bash
dotnet ef database update -p src/Host -s src/Host
```
4. Запустите Host:
```bash
dotnet run --project src/Host
```
---
## ⚙️ Локальный запуск
```bash
cd nashel-backend
# Применить миграции
dotnet ef database update -p src/Host -s src/Host
# Запустить
dotnet run --project src/Host
```
Swagger UI доступен по адресу: `http://localhost:5000/swagger`
Swagger доступен по адресу: `http://localhost:5000/swagger`
---
## 🔮 Планы развития
- [ ] Полный модуль **Collaboration**: чат между клиентом и исполнителем
- [ ] Модуль **Order**: жизненный цикл заказа, статусы, оплата
- [ ] Модуль **Reputation**: система отзывов и рейтингов (реальные данные вместо заглушек)
- [ ] Верификация документов исполнителя
- [ ] Push-уведомления
- [ ] Поддержка OAuth (VK, Google)
- [ ] Аналитика для исполнителей (просмотры, конверсии)
- [ ] **Real-time:** Интеграция WebSockets для чатов и уведомлений.
- [ ] **Verification:** Модуль проверки документов исполнителей.
- [ ] **Finances:** Интеграция платежных шлюзов.
- [ ] **Analytics:** Сбор метрик просмотров и конверсий для мастеров.
- [ ] **Mobile SDK:** API для нативных мобильных приложений.
- [ ] **Notifications:** Push и Email уведомления о статусах заказов.