feat: migrate to VitePress from monorepo docs, add test-contour section

This commit is contained in:
sova-bootstrap
2026-05-28 12:29:31 +03:00
parent e90dfe1bd4
commit e3e438df68
76 changed files with 11998 additions and 60 deletions
+163
View File
@@ -0,0 +1,163 @@
# 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).