164 lines
7.5 KiB
Markdown
164 lines
7.5 KiB
Markdown
# 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).
|