# Пользовательские истории: Обработка ошибок, граничные случаи и доступность ## US-85: Ошибка 404 — Страница не найдена **Цель:** Пользователь видит понятное сообщение при переходе на несуществующий URL и может быстро вернуться к рабочему разделу. **Путь клиента:** 1. **Переход по неверному URL — ввод или клик по битой ссылке** — пользователь вводит `/onlineboard/invalid` или попадает на устаревшую ссылку. 2. **Router сопоставляет маршрут — wildcard redirect** — роутер не находит соответствия и перенаправляет на `/error/404`. 3. **Страница ошибки загружается — ErrorPageComponent** — компонент читает `errorCode`, `title`, `description` из `route.snapshot.data`. 4. **Отображение сообщения — код и текст** — на экране виден код «404», заголовок `PAGE404.HEADER` и описание `PAGE404.DESCRIPTION`. 5. **Скрытие баннеров хоста — hideAflComponents()** — страница скрывает `.afl-component--banners` на время показа ошибки. 6. **Поле поиска на странице ошибки** — на странице отображается текстовое поле с кнопкой поиска; ввод запроса и клик по кнопке открывает результаты поиска на aeroflot.ru в новой вкладке. 7. **Возврат к работе — переход на главную** — пользователь нажимает кнопку и возвращается на `/onlineboard` или в поиск. **Критерии приёмки:** - ✅ Маршрут `/error/404` отображает страницу с кодом 404. - ✅ Любой неизвестный URL приводит к редиректу на `/error/404`. - ✅ Заголовок и описание берутся из переводов (`PAGE404.*`). - ✅ Поле поиска позволяет выполнить поиск на aeroflot.ru из страницы ошибки (открывается в новой вкладке). - ✅ Кнопка «На главную» возвращает на рабочий раздел. - ✅ Баннеры хост-приложения скрыты на время показа ошибки и восстанавливаются при уходе со страницы (`ngOnDestroy`). **Примечание:** URL онлайн-табло — `/onlineboard` (без дефиса). Компонент ошибки — общий для 404 и 500, различие задаётся через `route.data`. --- ## US-86: Ошибка 500 — Внутренняя ошибка сервера **Цель:** Пользователь получает понятное сообщение при серверной ошибке и возможность повторить запрос или вернуться на главную. **Путь клиента:** 1. **Действие пользователя — поиск или загрузка расписания** — пользователь запускает поиск рейсов. 2. **Ошибка на бэкенде — HTTP 5xx** — API возвращает 500 либо приложение роутится на `/error/500` как default. 3. **Показ страницы ошибки — ErrorPageComponent с errorCode=500** — читаются `PAGE500.HEADER` и `PAGE500.DESCRIPTION`. 4. **Скрытие баннеров — hideAflComponents()** — сторонние компоненты хоста временно скрываются. 5. **Действия пользователя — повтор или возврат** — пользователь может повторить запрос или перейти на главную. 6. **Восстановление — ngOnDestroy** — при уходе со страницы баннеры возвращаются в прежнее состояние. **Критерии приёмки:** - ✅ При неизвестной ошибке приложение показывает `/error/500` (дефолтный редирект с `/error`). - ✅ На странице отображается код «500» и локализованные `PAGE500.*` строки. - ✅ Кнопка «На главную» доступна и работает. - ✅ Баннеры хоста скрываются и корректно восстанавливаются. - ✅ Страница не ломает верстку хост-приложения. **Примечание:** URL онлайн-табло — `/onlineboard` (без дефиса). В Angular-источнике ErrorPage один компонент на оба кода; дифференциация — через `route.data`. --- ## US-88: Timeout при загрузке данных **Цель:** Пользователь видит корректное состояние, если ответ сервера долго не приходит, и может отменить или повторить запрос. **Путь клиента:** 1. **Запуск запроса — пользователь выполняет поиск** — отправляется запрос на API рейсов/расписания. 2. **Отображение спиннера — loading state** — UI показывает индикатор загрузки до получения ответа. 3. **Ожидание превышает лимит — длительное отсутствие ответа** — сеть медленная или сервер не отвечает. 4. **Обработка таймаута — http-cancel / error handler** — запрос завершается с ошибкой, приложение переходит в состояние ошибки. 5. **Сообщение пользователю — понятный текст** — отображается сообщение о проблеме соединения и предложение повторить. 6. **Повтор или отмена — пользователь управляет ситуацией** — можно повторить поиск либо отказаться. **Критерии приёмки:** - ✅ Во время загрузки виден индикатор прогресса. - ✅ При длительном отсутствии ответа приложение не «зависает». - ✅ После таймаута пользователь видит понятное сообщение об ошибке. - ✅ Доступно действие «Повторить». - ✅ Отменённые запросы не обновляют UI задним числом. **Примечание:** Сценарий тестовый — описывает ожидаемое поведение; в Angular-источнике явного лимита таймаута нет, обработка опирается на общий error handler и `HttpCancelService`. --- ## US-89: Некорректный ввод (специальные символы) **Цель:** Система безопасно обрабатывает ввод со специальными символами и не допускает XSS. **Путь клиента:** 1. **Ввод спецсимволов — пользователь печатает `