Files
docs/apps/backend-scenarios/kiosk-checkpass.md
T

76 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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](./auth-uid-pcode.md).
## Пошаговый алгоритм
1. Проверка JWT; если пользователь не найден — `401` с телом `{"error":"Пользователь не найден"}`.
2. `$pcode = $user->getUid()`.
3. Репозиторий `MarkKiosk` ищет запись по паре `['pcode' => $pcode, 'filial' => $filial]`.
4. Если записи нет — создаётся `new MarkKiosk()` с `pcode`, `filial`, `createdAt`/`modifyAt` (текущее время), `persist` + `flush`.
5. Повторная выборка той же сущности (как в коде после создания).
6. Ответ API: JSON c булевым полем из `MarkKiosk::isResult()` — для **новой** строки поле `result` в сущности по умолчанию **`null`** (в setter при создании в контроллере `result` не выставляется).
## Mermaid
```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.php`
- `apps/backend/src/Entity/MarkKiosk.php`
- `apps/backend/src/Service/DecoderJWT/JWTDecoderService.php`
Карта домена: [backend-ddd.md](../backend-ddd.md).