174 lines
9.1 KiB
Markdown
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).
|