Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
1867301
fix: update use-case.md
skumbriya21 Mar 9, 2026
5c89950
fix: update happy diagram
skumbriya21 Mar 9, 2026
0df43e9
feat: create error case
skumbriya21 Mar 9, 2026
1cb0ed7
feat: create scenarios
skumbriya21 Mar 9, 2026
8da6940
feat: create analysis
skumbriya21 Mar 9, 2026
a4a5e30
fix: update analysis
skumbriya21 Mar 9, 2026
5c2a040
feat: add create use-case
skumbriya21 Mar 9, 2026
642fcef
feat: create happy diagram
skumbriya21 Mar 9, 2026
6a9d698
fix: update use-case
skumbriya21 Mar 9, 2026
d07989a
Merge branch 'main' into lab01-po13-kulikovskaya
skumbriya21 Mar 9, 2026
77c1da2
Merge branch 'lab01-po13-kulikovskaya' of https://github.com/skumbriy…
skumbriya21 Mar 9, 2026
af35725
fix: delete last empty lines
skumbriya21 Mar 9, 2026
d4a8830
feat: diagram image
skumbriya21 Mar 12, 2026
a15aefb
feat: diagram image
skumbriya21 Mar 12, 2026
3a59f5e
feat: create otchet.md
skumbriya21 Mar 12, 2026
e52e629
Merge pull request #1 from skumbriya21/lab01-po13-kulikovskaya
skumbriya21 Mar 26, 2026
f2c8e0b
feate: create Architecture.md
skumbriya21 Mar 26, 2026
79804be
feate: create src/domain/models/slot.py
skumbriya21 Mar 26, 2026
214f286
feate: create src/domain/models/court_type.py
skumbriya21 Mar 26, 2026
d954de9
feat: the remaining files have been created
skumbriya21 Mar 26, 2026
b68e52a
change: name of picture
skumbriya21 Mar 26, 2026
a566a98
Add files via upload
skumbriya21 Mar 26, 2026
32e8a02
feat: process of create
skumbriya21 Mar 26, 2026
cdd2ccf
Merge pull request #2 from skumbriya21/lab02-po13-kulikovskaya
skumbriya21 Mar 26, 2026
af942e1
fix: Optional
skumbriya21 Mar 26, 2026
aa266b8
feat: otchet
skumbriya21 Mar 26, 2026
73e598b
fix: fixed erroneously empty files.
skumbriya21 Mar 27, 2026
a5b21f7
Merge pull request #3 from skumbriya21/lab02-po13-kulikovskaya
skumbriya21 Mar 27, 2026
13147be
fix: error
skumbriya21 Mar 27, 2026
e3a45da
Merge pull request #4 from skumbriya21/lab03-po13-kulikovskaya
skumbriya21 Mar 27, 2026
4ae0a75
Merge pull request #5 from skumbriya21/lab03-po13-kulikovskaya
skumbriya21 Mar 27, 2026
c7aa49a
update: add files to lab3, update __init__.py
skumbriya21 Mar 27, 2026
ed6619f
update: h
skumbriya21 Mar 27, 2026
3a1cd92
feat: create отчет.md
skumbriya21 Apr 6, 2026
efd4cc7
Merge pull request #6 from skumbriya21/lab03-po13-kulikovskaya
skumbriya21 Apr 6, 2026
1831382
feat: create lab04
skumbriya21 Apr 6, 2026
5a06de9
Merge pull request #7 from skumbriya21/lab04-po13-kulikovskaya
skumbriya21 Apr 6, 2026
8032247
feat: create otchet
skumbriya21 Apr 6, 2026
b75fa2a
fix: update Отчет.md
skumbriya21 Apr 6, 2026
7e872e6
Merge pull request #8 from skumbriya21/lab04-po13-kulikovskaya
skumbriya21 Apr 6, 2026
79edacc
feat: create lab5
skumbriya21 Apr 6, 2026
b413f19
feat: add Отчет.md
skumbriya21 Apr 6, 2026
07931ad
Merge pull request #9 from skumbriya21/lab05-po13-kulikovskaya
skumbriya21 Apr 6, 2026
c4b1c9f
feat: create lab6
skumbriya21 Apr 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
133 changes: 133 additions & 0 deletions students/Kulikovskaya_Alina/lab-01/analysis.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Анализ транзакционных границ и ответственности

## 1. Границы транзакции

### Где начинается транзакция?
**Точка входа:** Пользователь нажимает кнопку "Забронировать с оплатой"

### Где заканчивается транзакция?
**Успешный сценарий:** После отправки email-подтверждения и записи события в лог

**Граница транзакции охватывает:**
1. Блокировка слота в Schedule Service
2. Создание записи бронирования в БД
3. Обработка платежа
4. Подтверждение бронирования
5. Отправка уведомления (асинхронно, вне транзакции)


## 2. Таблица операций

| Операция | Тип | Откат при ошибке | Retry-стратегия | Идемпотентность |
|----------|-----|------------------|-----------------|-----------------|
| **Блокировка слота** | Синхронная | Да (release lock) | Нет (TTL 10 минут) | Да (idempotency_key = booking_id) |
| **Создание бронирования в БД** | Синхронная | Да (DELETE) | Нет (PK constraint) | Да (проверка уникальности user+slot+date) |
| **Вызов Payment Gateway** | Синхронная | Нет (async проверка) | 3 попытки с exponential backoff (1s, 2s, 4s) | Да (payment_intent_id) |
| **Обновление статуса бронирования** | Синхронная | Да (ROLLBACK) | Нет | Да |
| **Отправка email** | **Асинхронная** | Нет (best-effort) | 5 попыток с exp. backoff | Да (deduplication по booking_id) |
| **Освобождение слота при отмене** | Синхронная | Нет | Нет | Да |


## 3. Обоснование выбора синхронных/асинхронных операций

### Почему блокировка слота — синхронная?
- **Критичность:** Двойное бронирование недопустимо
- **Консистентность:** Необходима immediate consistency
- **Откат:** При ошибке платежа слот должен освободиться

### Почему отправка email — асинхронная?
- **Некритичность:** Пользователь уже видит страницу успеха
- **Надёжность:** Email может быть недоступен временно
- **Производительность:** Не блокировать ответ пользователю
- **Eventual consistency:** Email дойдёт через несколько секунд/минут

### Почему платёж — синхронный с fallback?
- **UX:** Пользователь ждёт immediate feedback
- **Сложность:** Требуется подтверждение перед финализацией бронирования
- **Fallback:** При таймауте → статус PENDING_PAYMENT + async проверка


## 4. Обработка исключительных ситуаций

### 4.1 Race Condition (двойное бронирование)

**Условие:** Два пользователя одновременно бронируют последний слот

**Обнаружение:**
- Schedule Service возвращает ошибку "Slot already locked"
- Или БД возвращает constraint violation при INSERT

**Реакция:**
1. Транзакция второго пользователя откатывается
2. Система предлагает альтернативные слоты
3. Логируется попытка конфликтного доступа

**Компенсация:**
- Не требуется (атомарная проверка в Schedule Service)
- Слот остаётся заблокированным за первым пользователем

**Уведомление:**
- "Извините, этот слот только что заняли. Выберите другое время: 19:00-20:00 или 20:00-21:00"


### 4.2 Таймаут Payment Gateway

**Условие:** Платёжный шлюз не отвечает > 30 секунд

**Обнаружение:**
- HTTP-клиент выбрасывает TimeoutException
- Circuit Breaker открывается после 3 таймаутов

**Реакция:**
1. НЕ откатывать бронирование сразу (возможно, платёж прошёл)
2. Перевести статус в "PAYMENT_PENDING"
3. Запустить фоновую задачу проверки статуса (через 1, 5, 15 минут)
4. Блокировка слота продлевается до 30 минут

**Компенсация (если платёж не прошёл):**
- Через 15 минут: статус → CANCELLED
- Освободить слот в Schedule Service
- Уведомить пользователя об отмене

**Уведомление:**
- Немедленно: "Проверяем статус платежа... Не закрывайте страницу"
- Через 15 мин (если failed): "Бронирование отменено. Попробуйте снова."


### 4.3 Недостаточно средств

**Условие:** Payment Gateway возвращает "Insufficient funds"

**Обнаружение:**
- HTTP 200 с body: `{status: "failed", reason: "insufficient_funds"}`

**Реакция:**
1. Сохранить бронирование со статусом "PAYMENT_FAILED"
2. Предложить варианты: другая карта / оплата на месте / отмена
3. Установить таймер на 10 минут для автоматической отмены

**Компенсация:**
- Если пользователь не выбирает действие → автоматическая отмена
- Освобождение слота

**Уведомление:**
- "Недостаточно средств на карте. Попробуйте другую карту или оплатите на ресепшене."


### 4.4 Нарушение бизнес-правила (минимальное время)

**Условие:** Попытка бронирования < 30 минут до начала слота

**Обнаружение:**
- Валидация на уровне Application Layer: `if (slot_start - now) < 30min`

**Реакция:**
1. Отклонить запрос до создания бронирования
2. Предложить позвонить администратору

**Компенсация:**
- Не требуется (бронирование не создавалось)

**Уведомление:**
- "Слишком поздно для online-бронирования. Звоните: +375 (17) 123-45-67"

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
@startuml
!theme plain
skinparam sequenceMessageAlign center

title Бронирование - Ошибка: Таймаут платёжного шлюза

actor "Пользователь" as User
participant "Web UI" as UI
participant "Booking API" as API
database "PostgreSQL" as DB
participant "Payment Gateway" as Payment
participant "Scheduler\n(Cron)" as Cron
participant "Notification Service" as Notify

User -> UI: Выбрать слот, нажать "Забронировать"
activate UI
UI -> API: POST /api/bookings
activate API
API -> DB: INSERT status: PENDING_PAYMENT
activate DB
DB --> API: booking_id: BK-2025-00143
deactivate DB
API --> UI: 201 + payment_url
deactivate API
UI --> User: Страница оплаты
deactivate UI

User -> UI: Подтвердить оплату
activate UI
UI -> Payment: Charge booking BK-2025-00143
activate Payment

note right of Payment
Платёжный шлюз не отвечает
> 30 секунд
end note

Payment --> UI: **TimeoutException**
deactivate Payment

UI -> API: POST /bookings/BK-2025-00143/timeout
activate API

API -> DB: UPDATE status='PAYMENT_PENDING'
activate DB
DB --> API: OK
deactivate DB

API -> Cron: Запланировать проверку\nчерез 1, 5, 15 минут
activate Cron
Cron --> API: Scheduled
deactivate Cron

API --> UI: 202 Accepted\n"Проверяем статус платежа..."
deactivate API

UI --> User: "Обработка платежа...\nНе закрывайте страницу"
deactivate UI

Cron -> API: GET /internal/bookings/BK-2025-00143/check-payment
activate API
API -> Payment: Query payment status
activate Payment
Payment --> API: Status: UNKNOWN/FAILED
deactivate Payment

API -> DB: UPDATE status='CANCELLED'
activate DB
DB --> API: OK
deactivate DB

API -> DB: UPDATE slot SET status='AVAILABLE'
activate DB
DB --> API: OK
deactivate DB

API -> Notify: Отправить уведомление об отмене
activate Notify
Notify --> API: OK
deactivate Notify

deactivate API

Notify -> User: Email: "Бронирование отменено\nПлатёж не прошёл"

@enduml
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
104 changes: 104 additions & 0 deletions students/Kulikovskaya_Alina/lab-01/diagrams/sequence-happy.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
@startuml
!theme plain
skinparam sequenceMessageAlign center
skinparam responseMessageBelowArrow true

title Бронирование площадки - Happy Path (Online + Оплата)

actor "Пользователь" as User
participant "Web UI\n(React/Vue)" as UI
participant "Booking API\n" as API
participant "Schedule Service" as Schedule
database "PostgreSQL" as DB
participant "Payment Gateway\n" as Payment
participant "Notification Service\n(Email/SMS)" as Notify

User -> UI: 1. Открыть каталог площадок
activate UI
UI -> API: GET /api/courts?type=badminton
activate API
API -> DB: SELECT courts WHERE type='badminton'
activate DB
DB --> API: Список 8 кортов
deactivate DB
API --> UI: 200 OK + данные площадок
deactivate API
UI --> User: Отображение карточек кортов
deactivate UI

User -> UI: 2. Выбрать корт #3, дату 15.03, время 18:00
activate UI
UI -> API: GET /api/slots?court_id=3&date=2025-03-15
activate API
API -> Schedule: Проверка доступности
activate Schedule
Schedule --> API: Доступные время [18:00, 19:00, 20:00]
deactivate Schedule
API --> UI: 200 OK + время
deactivate API
UI --> User: Отображение календаря с временем
deactivate UI

User -> UI: 3. Нажать "Забронировать с оплатой"
activate UI
UI -> API: POST /api/bookings\n{court_id:3, slot:"18:00-19:00", date:"2025-03-15"}
activate API

API -> Schedule: Блокировка времени (10 мин)
activate Schedule
Schedule --> API: OK (slot reserved)
deactivate Schedule

API -> DB: INSERT booking\nstatus: PENDING_PAYMENT
activate DB
DB --> API: booking_id: "BK-2025-00142"
deactivate DB

API --> UI: 201 Created + booking_id + payment_url
deactivate API
UI --> User: Редирект на страницу оплаты
deactivate UI

User -> UI: 4. Ввести данные карты, подтвердить
activate UI
UI -> Payment: Charge(amount: 17BYN, booking_id: BK-2025-00142)
activate Payment
Payment -> Payment: Обработка платежа
Payment --> UI: 200 OK + payment_id: "PAY-789"
deactivate Payment

UI -> API: POST /api/bookings/BK-2025-00142/confirm\n{payment_id: PAY-789}
activate API

API -> Payment: Verify payment PAY-789
activate Payment
Payment --> API: Status: SUCCESS
deactivate Payment

API -> DB: UPDATE booking\nSET status='CONFIRMED', payment_id='PAY-789'
activate DB
DB --> API: OK
deactivate DB

API -> Schedule: Подтверждение бронирования слота
activate Schedule
Schedule --> API: OK (slot confirmed)
deactivate Schedule

API -> Notify: Отправить подтверждение\nbooking_id: BK-2025-00142
activate Notify
Notify -> Notify: Генерация QR-кода
Notify --> API: OK (email queued)
deactivate Notify

API --> UI: 200 OK + booking details
deactivate API
UI --> User: Страница успеха с QR-кодом
deactivate UI

Notify -> User: Email с QR-кодом и деталями
activate Notify #LightBlue
Notify --> User: "Ваше бронирование подтверждено!"
deactivate Notify

@enduml
Loading
Loading