Files
docs/apps/cabinet-architecture.md

7.5 KiB
Raw Permalink Blame History

Cabinet: архитектура модулей

apps/cabinet - legacy-монолит личного кабинета на Symfony 5.4. Он обслуживается контейнером php82, nginx направляет cabinet.sovamed.ru в apps/cabinet/public/index.php.

Слои

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, проверка записи/виджета.

Поток защищенной страницы:

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

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.

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 и очисткой пользователей.

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-схема вынесена на страницу Модели данных.