# 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).