feat: migrate to VitePress from monorepo docs, add test-contour section

This commit is contained in:
sova-bootstrap
2026-05-28 12:29:31 +03:00
parent e90dfe1bd4
commit e3e438df68
76 changed files with 11998 additions and 60 deletions
+61
View File
@@ -0,0 +1,61 @@
---
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).