76 lines
4.1 KiB
Markdown
76 lines
4.1 KiB
Markdown
---
|
||
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).
|