4.1 KiB
4.1 KiB
title
| title |
|---|
| Отметка киоска clvisitsovacheckpass (Backend) |
Сценарий 3.3: Проверка / отметка киоска (clvisitsovacheckpass)
Бизнес-цель
В филиале может стоять киоск самообслуживания. Когда пациент авторизован в приложении, backend фиксирует факт «проверки прохода» для пары пациент (pcode/uid) + филиал, чтобы киоск знал, можно ли продолжить сценарий (метод возвращает булев признак isResult() у сущности MarkKiosk).
Точки входа
| Тип | Метод + URL | Класс |
|---|---|---|
| HTTP | GET /infoclinica/clvisitsovacheckpass/{filial} |
InfoclinicaController::clvisitsovacheckpass |
Доступ: #[IsGranted('ROLE_USER')] — нужен JWT. filial — целочисленный идентификатор из URL.
Что такое pcode здесь
Внутри метода берётся текущий пользователь через JWTDecoderService::getUser(), далее $user->getUid() трактуется как pcode пациента для записи в MarkKiosk. То есть это тот же числовой uid, что хранится в users.uid после сценариев auth-uid-pcode.md.
Пошаговый алгоритм
- Проверка JWT; если пользователь не найден —
401с телом{"error":"Пользователь не найден"}. $pcode = $user->getUid().- Репозиторий
MarkKioskищет запись по паре['pcode' => $pcode, 'filial' => $filial]. - Если записи нет — создаётся
new MarkKiosk()сpcode,filial,createdAt/modifyAt(текущее время),persist+flush. - Повторная выборка той же сущности (как в коде после создания).
- Ответ API: JSON c булевым полем из
MarkKiosk::isResult()— для новой строки полеresultв сущности по умолчаниюnull(в setter при создании в контроллереresultне выставляется).
Mermaid
sequenceDiagram
participant K as Киоск / клиент
participant IC as InfoclinicaController
participant JWT as JWTDecoderService
participant EM as EntityManager
participant MK as MarkKiosk
K->>IC: GET .../clvisitsovacheckpass/{filial} + JWT
IC->>JWT: getUser()
alt нет пользователя
IC-->>K: 401
else ok
IC->>EM: find MarkKiosk pcode+filial
alt нет строки
IC->>EM: persist новый MarkKiosk
end
EM-->>IC: MarkKiosk
IC-->>K: {result: isResult()}
end
Внешние зависимости
| Система | Роль |
|---|---|
| PostgreSQL | таблица mark_kiosk (имя по маппингу Doctrine) |
| Инфоклиника | не вызывается в этом методе; имя маршрута исторически связано с MIS |
Обработка ошибок и edge cases
- Нет JWT / неверный токен — ответ средства Symfony Security (не разобран в контроллере).
- Повторный вызов — запись уже есть; логика
isResult()определяет, что отдать киоску при повторе (см.Entity/MarkKiosk.php). - У пользователя нет
uid— маловероятно по модели, но при0возможны коллизии — вопрос целостности данных.
Ссылки на классы
apps/backend/src/Controller/InfoclinicaController.phpapps/backend/src/Entity/MarkKiosk.phpapps/backend/src/Service/DecoderJWT/JWTDecoderService.php
Карта домена: backend-ddd.md.