Files
docs/apps/backend-architecture.md

174 lines
9.1 KiB
Markdown

# Backend: архитектура модулей
`apps/backend` - новый API-слой и единое хранилище данных на Symfony 7.3. Приложение обслуживается контейнером `php84`, nginx направляет домен `api.sovamed.ru` в `apps/backend/public/index.php`.
## Слои
```mermaid
flowchart TB
controllers[Controller\n25 классов]
dto[Dto\n12 классов]
services[Service\n50 классов]
repositories[Repository\n26 классов]
entities[Entity\n26 классов]
commands[Command\n13 классов]
messages[Message / Handler\n3 async-сценария]
external[Внешние системы\nBitrix, Infoclinica, SMS, Calltouch, SmartCaptcha]
db[(PostgreSQL)]
mysql[(Bitrix MySQL)]
cabinet[(Cabinet PostgreSQL)]
redis[(Redis)]
controllers --> dto
controllers --> services
services --> repositories
repositories --> entities
repositories --> db
services --> external
services --> redis
commands --> services
messages --> services
services --> mysql
services --> cabinet
```
## Контроллеры и зоны ответственности
### Пользователь и авторизация
- `UserController` - `/user`: логин, logout, текущий пользователь, смена региона, регистрация/авторизация по UID или pcode.
- Использует `AuthenticationService`, `RegistrationService`, `UserProfileService`, `JWTDecoderService`.
- Авторизация stateless через JWT (`lexik/jwt-authentication-bundle`), пользователь ищется по `User.email`.
```mermaid
sequenceDiagram
participant Client
participant UserController
participant Validator
participant Auth as AuthenticationService
participant JWT as JWTTokenManager
participant DB as UserRepository
Client->>UserController: POST /user/login
UserController->>Validator: UserLoginDto
UserController->>Auth: jsonAuth(dto)
Auth->>DB: поиск User по email
DB-->>Auth: User
Auth-->>UserController: user + isPasswordValid
UserController->>JWT: create(user)
UserController-->>Client: token + user
```
### Справочники и CMS-контент
- `ArticleController` - статьи.
- `DiseaseController` - заболевания.
- `MedicalCenterController` - медицинские центры.
- `NewsController` - новости.
- `PromoController` - акции.
- `SiteServiceController` - услуги сайта.
- `StockController` - акции/предложения с привязкой к врачам.
Типовой CRUD-поток:
```mermaid
flowchart LR
request[HTTP request] --> controller[CRUD Controller]
controller --> crud[Crud Service\ncreate/update/delete/sync]
crud --> repository[Repository]
repository --> entity[Entity]
entity --> db[(PostgreSQL)]
```
### Врачи, филиалы, расписание и цены
- `SpecialistController` - врачи, карточка врача, фильтрация, фото, расписание, запись.
- `DepartmentController` - отделения.
- `FilialController` - филиалы, поиск по региону, фото.
- `LocationController` - локации врача: отделение, филиал, online mode, ближайшая дата.
- `PriceListController` и `PriceDepartmentController` - цены и группы цен.
- `SpecialistDocsController` - документы/сертификаты врача.
- `SpecialistDcodeDescriptionController` - описания врача по `dcode`.
- `WebGetDocinfoController` - данные врачей из внешнего представления/источника.
Ключевая логика находится в:
- `SpecialistService` - список, карточка, расписание, создание анонимной записи, загрузка фото.
- `ScheduleCacheService` - кеш расписания.
- `ScheduleErrorHandlerService` - нормализация ошибок расписания.
- `PriceListService`, `DepartmentService`, `FilialService`, `LocationService` - чтение справочников.
### Интеграции и служебные endpoints
- `InfoclinicaController` - прокси/интеграция с MIS: расписание, врачи, anonymous reserve.
- `CalltouchController` - создание лида.
- `ServiceController` - отправка email и SmartCaptcha.
- `XmlFeedController` - XML-фиды для Яндекса.
- `HelperController` - вспомогательные методы, например склонение лет.
- `UsrlogController` - список пользовательских логов.
## Сервисы
### HTTP-клиенты
- `AbstractHttpClientService` - общая обертка над HTTP-клиентом, cookies, request.
- `InfoclinicaClientService` - расписание, филиалы, регистрация, anonymous reserve.
- `BitrixClientService` - получение изображения специалиста.
- `CalltouchClientService` - создание заявки.
- `SmartCaptchaClientService` - проверка captcha.
- `Sms4bClientService`, `SmsruClientService` - отправка SMS, отправители, баланс.
### Доменная логика
- `SpecialistService` - врач как центральный доменный объект: расписание, карточка, список, фото, запись.
- `RegistrationService` и `AuthenticationService` - создание пользователя и проверка авторизации.
- `UserProfileService` - изменение профиля пользователя.
- `DiseaseCrudService`, `MedicalCenterCrudService`, `NewsCrudService`, `PromoCrudService`, `SiteServiceCrudService` - CRUD и синхронизация контента из внешних представлений.
- `SequenceService` - синхронизация PostgreSQL sequence после импортов.
- `FileUploaderService`, `ImageService` - файлы и изображения.
- `XmlFeedGeneratorService`, `XmlFeedGeneratorV1Service` - генерация XML-фидов.
### Инфраструктурные сервисы
- `AESCryptService` - шифрование/дешифрование AES.
- `JWTDecoderService` - получение текущего пользователя из JWT.
- `TransliteService` - транслитерация.
- `PerformanceTrackerService` - замер длительности операций.
- `SendMailService`, `SendMailConfig` - отправка почты.
## Консольные команды
```mermaid
flowchart TB
cron[Cron / ручной запуск] --> command[Symfony Command]
command --> bitrix[BitrixService]
command --> crud[Crud/Domain Service]
command --> repo[Repository]
repo --> db[(PostgreSQL)]
```
Команды в `src/Command` синхронизируют врачей, отзывы, отделения, заболевания, филиалы, медцентры, новости, цены, акции и услуги. Отдельная команда `ClearScheduleCacheCommand` чистит кеш расписания.
## Асинхронные сообщения
- `GetScheduleMessage` / `GetScheduleMessageHandler` - получение расписания.
- `GetSpecialistPictureMessage` / handler - загрузка изображения специалиста.
- `GetAnonymousReserveRequestMessage` / handler - обработка анонимной записи.
## Главные доменные сущности
- `Specialist` - врач: имя, фото, активность, регион, alias, должность, опыт, расписание, связи с `Location`, `Review`, `SpecialistDocs`, `Stock`.
- `Location` - привязка врача к отделению/филиалу и режиму приема.
- `Schedule` - слот расписания: `dcode`, отделение, филиал, дата, кабинет, интервал, цена, свободность.
- `User` - пользователь API: UID, email, роли, регион, пароль, дата рождения, время входа.
- `Record` - запись пациента: врач, телефон, дата создания, hash, payload `reserve`.
- `PriceList` и `PriceDepartment` - цены и группы цен.
- `Filial`, `Department`, `MedicalCenter` - организационная структура.
- `Article`, `News`, `Promo`, `Disease`, `SiteService`, `Stock` - контент сайта.
Полная ER-схема вынесена на страницу [Модели данных](../data-model.md).
Детальная карта **ограниченных контекстов, сущностей, контроллеров и команд** — на странице [Backend: DDD / бизнес-сущности](./backend-ddd.md).
Пошаговые **бизнес-сценарии** (JWT, расписание, запись, синхронизация, фиды): [Backend: бизнес-сценарии](./backend-scenarios/index.md).