Files
docs/apps/cabinet-architecture.md

164 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Cabinet: архитектура модулей
`apps/cabinet` - legacy-монолит личного кабинета на Symfony 5.4. Он обслуживается контейнером `php82`, nginx направляет `cabinet.sovamed.ru` в `apps/cabinet/public/index.php`.
## Слои
```mermaid
flowchart TB
browser[Browser]
controllers[Controller\n14 классов]
forms[Form\n19 классов]
services[Service\n4 класса]
bundles[Bundle\nлокальные интеграции]
repositories[Repository\n21 класс]
entities[Entity\n21 класс]
twig[Twig templates]
assets[Webpack Encore assets]
db[(PostgreSQL)]
bitrix[(Bitrix)]
mis[Infoclinica / MIS]
external[Calltouch, SMS, Notisend, Yandex Direct]
browser --> controllers
controllers --> forms
controllers --> services
controllers --> bundles
controllers --> repositories
repositories --> entities
repositories --> db
controllers --> twig
twig --> assets
services --> repositories
bundles --> bitrix
bundles --> mis
bundles --> external
```
## Контроллеры
### Пользовательский кабинет
- `SecurityController` - login/logout, регистрация, восстановление, настройки, платежи, история болезни, направления, refund, проверка авторизации API.
- `DefaultController` - главная кабинета, вызов врача на дом, стоимость услуг, админское обновление прайса, справка.
- `SpecialistController` - каталог врачей, карточка врача, онлайн-специалисты, избранное.
- `WidgetController` - справки, review source, проверка записи/виджета.
Поток защищенной страницы:
```mermaid
sequenceDiagram
participant User
participant Security as Security Firewall
participant Controller
participant Service
participant Repository
participant Twig
User->>Security: GET / или /payment
Security->>Controller: проверка сессии / ROLE_USER
Controller->>Service: подготовка данных
Service->>Repository: запросы к БД
Repository-->>Service: сущности
Service-->>Controller: данные
Controller->>Twig: render
Twig-->>User: HTML
```
### Админка и CMS
- `BannerController` - баннеры.
- `CategoryPageController` и `PageController` - категории и страницы.
- `DepartmentController` - отделения.
- `ReviewSourceController` - источники отзывов.
- `WidgetFormController`, `WidgetFormInputController` - конструктор форм виджетов.
Большинство таких контроллеров используют Symfony Forms и Doctrine repositories напрямую.
### API
- `PublicAPIController` - публичные методы `/api`: anonymous reserve, интервалы расписания, данные пользователя, прайс, врачи.
- `InternalAPIController` - swagger, captcha, баннеры, логирование, запись, сообщения, поиск, отделения.
- `CalltouchAPIController` - добавление заявки Calltouch.
## Локальные Bundle-интеграции
В `src/Bundle` находятся не Symfony bundle в классическом смысле, а локальные клиенты/утилиты:
- `Infoclinica\Client` и `Infoclinica\Rest` - низкоуровневый HTTP-клиент и набор методов MIS: записи, профиль, платежи, бонусы, направления, история болезни, login, reserve.
- `Bitrix\Request` - врачи, отзывы, изображения, филиалы, отделения, услуги.
- `Calltouch\Request` - заявки и выборки звонков/обращений.
- `Sms\Manager` и `Notisend\Request` - отправка сообщений.
- `Yandex\Direct` - отчеты и сущности Direct.
- `Crypt\AES` - AES-операции.
- `Helper\AmountInWords` - сумма прописью.
- `Utils\Logger` - логирование.
## Сервисы
- `PriceListService` - фильтрация и построение запросов прайса.
- `SpecialistService` - списки и карточки врачей.
- `SpecialistMoreService` - вычисляемая информация по врачу: локации, цены, отзывы, минимальная цена.
- `UserCleanupService` - очистка просроченных/неподтвержденных пользователей.
## Формы и Twig
```mermaid
flowchart LR
controller[Controller] --> form[Symfony Form]
form --> entity[Entity]
controller --> twig[Twig template]
twig --> encore[Webpack Encore assets]
encore --> public[public/build]
```
Формы лежат в `src/Form`; шаблоны - в `templates`; frontend-ассеты - в `assets`; сборка описана в `webpack.config.js` и `package.json`.
## Авторизация
Security использует `LoginFormAuthenticator`. Пользователь берется из `App\Entity\User` по email, пароль хешируется bcrypt. Logout удаляет cookies `CABINET_SESSION`, `WR_SESSION`, `WR_FLASH`, `PLAY_SESSION`, `WR_DETAIL`, `region`.
```mermaid
sequenceDiagram
participant User
participant Login as SecurityController
participant Auth as LoginFormAuthenticator
participant Provider as User Provider
participant Session
User->>Login: POST /login
Login->>Auth: credentials
Auth->>Provider: load user by email
Provider-->>Auth: User
Auth->>Session: создать сессию
Session-->>User: cookies
```
## Консольные команды
Команды в `src/Command` синхронизируют данные из Infoclinica/Bitrix, обновляют врачей и прайсы, сравнивают врачей, работают с Yandex Direct, AES и очисткой пользователей.
```mermaid
flowchart TB
cron[Cron / ручной запуск] --> cmd[Symfony Command]
cmd --> base[BaseCommand]
cmd --> bundles[Bundle clients]
cmd --> services[Services]
services --> repositories[Repositories]
repositories --> db[(PostgreSQL)]
```
## Доменные сущности
- `User` - пользователь кабинета: email, роли, пароль, UID, token, ФИО, телефон, флаг подтверждения, активность.
- `SpecialistView` - представление врача: имя, специальность, категория, опыт, описание, alias, `dcode`, регион, услуга, признак ДМС.
- `LocationView` - представление локации врача: `dcode`, отделение, филиал, режим online, ближайшая дата.
- `PriceList`, `PriceDepartment`, `Price` - прайс и группы.
- `Record` и `AlertSms` - запись и связанное SMS-уведомление.
- `City`, `Filial`, `ReviewSource`, `Banner` - региональная структура и источники отзывов.
- `CategoryPage`, `Page` - CMS-страницы.
- `WidgetForm`, `WidgetFormInput` - формы виджетов.
- `DirectCompany`, `DirectReport` - данные Яндекс Директа.
Полная ER-схема вынесена на страницу [Модели данных](../data-model.md).