62 lines
3.6 KiB
Markdown
62 lines
3.6 KiB
Markdown
---
|
|
title: SMS-уведомления и сущности Record / AlertSms (Backend)
|
|
---
|
|
|
|
# Сценарий 3.2: Уведомления (SMS), связь `Record` ↔ `AlertSms`
|
|
|
|
## Бизнес-цель
|
|
|
|
После записи к врачу пациент может получить **SMS** (напоминание, код подтверждения и т.п.). В модели данных предусмотрено локальное хранение **факта записи** (`Record`) и **ответа SMS-провайдера** (`AlertSms`) в связке один-к-одному.
|
|
|
|
## Точки входа (фактический код)
|
|
|
|
| Компонент | Назначение |
|
|
| --- | --- |
|
|
| `App\Entity\Record` | Телефон, `specialistId`, `hash`, JSON-блоб `reserve`, время создания. |
|
|
| `App\Entity\AlertSms` | Ссылка на `Record`, время, текст/ответ провайдера. |
|
|
| `Sms4bClientService`, `SmsruClientService` | Реализации `SmsClientServiceInterface` (HTTP-клиенты). |
|
|
|
|
**Поиск по дереву `apps/backend/src`:** вызовов `Sms4bClientService` / `SmsruClientService` или `RecordRepository` из контроллеров и обработчиков **не обнаружено**. То есть **интеграция SMS заложена на уровне инфраструктуры/сервисов, но не подключена к HTTP-сценарию анонимной записи** в этом репозитории на момент документирования.
|
|
|
|
## Как бы выглядел целевой flow (рекомендуемая логика)
|
|
|
|
1. После успешного ответа MIS о записи backend создаёт `Record` с телефоном и сериализованным `reserve`.
|
|
2. Асинхронно или синхронно вызывается SMS-клиент с текстом шаблона.
|
|
3. Ответ провайдера сохраняется в `AlertSms`, линкуется через `Record::setAlertSms` (Doctrine `OneToOne`).
|
|
|
|
## Mermaid (целевая схема — не полностью реализована в коде)
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant API as Backend API
|
|
participant DB as PostgreSQL
|
|
participant SMS as SMS шлюз (Sms4b / sms.ru)
|
|
|
|
API->>DB: persist Record
|
|
API->>SMS: отправить SMS
|
|
SMS-->>API: ответ / статус
|
|
API->>DB: persist AlertSms ↔ Record
|
|
```
|
|
|
|
## Внешние зависимости
|
|
|
|
| Система | Статус в коде |
|
|
| --- | --- |
|
|
| Sms4b / sms.ru | Классы-клиенты есть |
|
|
| PostgreSQL | Таблицы под `Record` / `AlertSms` предполагаются миграциями |
|
|
|
|
## Обработка ошибок и edge cases
|
|
|
|
- **Нет вызова SMS** — риск «тихого» пропуска уведомления; фронт не может отличить по API, если нет явного шага.
|
|
- **Повторная отправка** — нужна идемпотентность по `hash` записи (поле в `Record`) — в коде не просматривалось.
|
|
|
|
## Ссылки на классы
|
|
|
|
- `apps/backend/src/Entity/Record.php`
|
|
- `apps/backend/src/Entity/AlertSms.php`
|
|
- `apps/backend/src/Repository/RecordRepository.php`, `AlertSmsRepository.php`
|
|
- `apps/backend/src/Service/Client/Sms4bClientService.php`
|
|
- `apps/backend/src/Service/Client/SmsruClientService.php`
|
|
|
|
Модель данных: [data-model.md](../../data-model.md). Сценарий записи в MIS: [anonymous-reserve.md](./anonymous-reserve.md).
|