9.1 KiB
9.1 KiB
Backend: архитектура модулей
apps/backend - новый API-слой и единое хранилище данных на Symfony 7.3. Приложение обслуживается контейнером php84, nginx направляет домен api.sovamed.ru в apps/backend/public/index.php.
Слои
flowchart TB
controllers[Controller\n25 классов]
dto[Dto\n12 классов]
services[Service\n50 классов]
repositories[Repository\n26 классов]
entities[Entity\n26 классов]
commands[Command\n13 классов]
messages[Message / Handler\n3 async-сценария]
external[Внешние системы\nBitrix, Infoclinica, SMS, Calltouch, SmartCaptcha]
db[(PostgreSQL)]
mysql[(Bitrix MySQL)]
cabinet[(Cabinet PostgreSQL)]
redis[(Redis)]
controllers --> dto
controllers --> services
services --> repositories
repositories --> entities
repositories --> db
services --> external
services --> redis
commands --> services
messages --> services
services --> mysql
services --> cabinet
Контроллеры и зоны ответственности
Пользователь и авторизация
UserController-/user: логин, logout, текущий пользователь, смена региона, регистрация/авторизация по UID или pcode.- Использует
AuthenticationService,RegistrationService,UserProfileService,JWTDecoderService. - Авторизация stateless через JWT (
lexik/jwt-authentication-bundle), пользователь ищется поUser.email.
sequenceDiagram
participant Client
participant UserController
participant Validator
participant Auth as AuthenticationService
participant JWT as JWTTokenManager
participant DB as UserRepository
Client->>UserController: POST /user/login
UserController->>Validator: UserLoginDto
UserController->>Auth: jsonAuth(dto)
Auth->>DB: поиск User по email
DB-->>Auth: User
Auth-->>UserController: user + isPasswordValid
UserController->>JWT: create(user)
UserController-->>Client: token + user
Справочники и CMS-контент
ArticleController- статьи.DiseaseController- заболевания.MedicalCenterController- медицинские центры.NewsController- новости.PromoController- акции.SiteServiceController- услуги сайта.StockController- акции/предложения с привязкой к врачам.
Типовой CRUD-поток:
flowchart LR
request[HTTP request] --> controller[CRUD Controller]
controller --> crud[Crud Service\ncreate/update/delete/sync]
crud --> repository[Repository]
repository --> entity[Entity]
entity --> db[(PostgreSQL)]
Врачи, филиалы, расписание и цены
SpecialistController- врачи, карточка врача, фильтрация, фото, расписание, запись.DepartmentController- отделения.FilialController- филиалы, поиск по региону, фото.LocationController- локации врача: отделение, филиал, online mode, ближайшая дата.PriceListControllerиPriceDepartmentController- цены и группы цен.SpecialistDocsController- документы/сертификаты врача.SpecialistDcodeDescriptionController- описания врача поdcode.WebGetDocinfoController- данные врачей из внешнего представления/источника.
Ключевая логика находится в:
SpecialistService- список, карточка, расписание, создание анонимной записи, загрузка фото.ScheduleCacheService- кеш расписания.ScheduleErrorHandlerService- нормализация ошибок расписания.PriceListService,DepartmentService,FilialService,LocationService- чтение справочников.
Интеграции и служебные endpoints
InfoclinicaController- прокси/интеграция с MIS: расписание, врачи, anonymous reserve.CalltouchController- создание лида.ServiceController- отправка email и SmartCaptcha.XmlFeedController- XML-фиды для Яндекса.HelperController- вспомогательные методы, например склонение лет.UsrlogController- список пользовательских логов.
Сервисы
HTTP-клиенты
AbstractHttpClientService- общая обертка над HTTP-клиентом, cookies, request.InfoclinicaClientService- расписание, филиалы, регистрация, anonymous reserve.BitrixClientService- получение изображения специалиста.CalltouchClientService- создание заявки.SmartCaptchaClientService- проверка captcha.Sms4bClientService,SmsruClientService- отправка SMS, отправители, баланс.
Доменная логика
SpecialistService- врач как центральный доменный объект: расписание, карточка, список, фото, запись.RegistrationServiceиAuthenticationService- создание пользователя и проверка авторизации.UserProfileService- изменение профиля пользователя.DiseaseCrudService,MedicalCenterCrudService,NewsCrudService,PromoCrudService,SiteServiceCrudService- CRUD и синхронизация контента из внешних представлений.SequenceService- синхронизация PostgreSQL sequence после импортов.FileUploaderService,ImageService- файлы и изображения.XmlFeedGeneratorService,XmlFeedGeneratorV1Service- генерация XML-фидов.
Инфраструктурные сервисы
AESCryptService- шифрование/дешифрование AES.JWTDecoderService- получение текущего пользователя из JWT.TransliteService- транслитерация.PerformanceTrackerService- замер длительности операций.SendMailService,SendMailConfig- отправка почты.
Консольные команды
flowchart TB
cron[Cron / ручной запуск] --> command[Symfony Command]
command --> bitrix[BitrixService]
command --> crud[Crud/Domain Service]
command --> repo[Repository]
repo --> db[(PostgreSQL)]
Команды в src/Command синхронизируют врачей, отзывы, отделения, заболевания, филиалы, медцентры, новости, цены, акции и услуги. Отдельная команда ClearScheduleCacheCommand чистит кеш расписания.
Асинхронные сообщения
GetScheduleMessage/GetScheduleMessageHandler- получение расписания.GetSpecialistPictureMessage/ handler - загрузка изображения специалиста.GetAnonymousReserveRequestMessage/ handler - обработка анонимной записи.
Главные доменные сущности
Specialist- врач: имя, фото, активность, регион, alias, должность, опыт, расписание, связи сLocation,Review,SpecialistDocs,Stock.Location- привязка врача к отделению/филиалу и режиму приема.Schedule- слот расписания:dcode, отделение, филиал, дата, кабинет, интервал, цена, свободность.User- пользователь API: UID, email, роли, регион, пароль, дата рождения, время входа.Record- запись пациента: врач, телефон, дата создания, hash, payloadreserve.PriceListиPriceDepartment- цены и группы цен.Filial,Department,MedicalCenter- организационная структура.Article,News,Promo,Disease,SiteService,Stock- контент сайта.
Полная ER-схема вынесена на страницу Модели данных.
Детальная карта ограниченных контекстов, сущностей, контроллеров и команд — на странице Backend: DDD / бизнес-сущности.
Пошаговые бизнес-сценарии (JWT, расписание, запись, синхронизация, фиды): Backend: бизнес-сценарии.