Применение фильтров и линз в http4k #
Используйте результаты предыдущей практической работы для решения задач данной практической работы.
Документация #
- Использование линз в http4k
 - Обработка форм с помощью линз
 - Использование линз шалблонизаторов
 - Использование фильтров
 
Использование линз для формирования HTML-документов #
В текущей ситуации приложение не оповещает своих клиентов о типе документов, которые возвращаются после обращения к маршрутам. Созданные HTML-документы должны иметь тип text/html.
- Создайте линзу на основе ранее созданного шаблонизатора. У линзы укажите тип данных ContentType TEXT_HTML.
 - Передайте линзу вместо шаблонизатора в маршрутизатор, а из него в соответствующие обработчики маршрута.
 
После изменения приложения удостоверьтесь, что при возвращении HTML-документов им корректно устанавливается корректный тип данных.
Обработка ошибочных запросов #
Сформируйте фильтр для обработки ошибочных ответов на запросы пользователя. По умолчанию необходимо реализовать следующую схему.
- Необходимо показывать пользователю HTML-документ, содержащий ошибочный запрос. На странице также должна присутствовать возможность вернуться к другим частям сайта.
 - Страницу необходимо показывать, если
- Статус ответа находится в рамках ошибочных ответов: клиентских ошибок, Status.clientError, и серверных ошибок, Status.serverError.
 - В рамках ответа не установлен заголовок 
ContentType. 
 
Подход к реализации
- Создайте страницу для отображения страницы в случае ошибочного запроса.
 - Создайте фильтр для обработки ошибочных ответов согласно логике выше. Фильтр принимает в качестве аргумента обработчик HttpHandler и возвращает новый обработчик HttpHandler.
 - Добавьте фильтр в цепочку по обработке запросов. Фильтр должен охватывать всю логику по обработке запросов.
 
Обработка параметров запроса #
В рамках процесса обработки запроса для отображения конкретного треугольника необходимо обработать переменную, приходящую из маршрута.
- Если в рамках переменной передано не-число, то обработчик должен возвращать код ошибки 400, BAD_REQUEST.
 - Если по указанному числу невозможно найти запись о добавленном треугольнике, то обработчик должен возвращать код ошибки 400, BAD_REQUEST.
 - Если удалось найти нужный треугольник, то вывести HTML-документ пользователю.
 
Выполните данную задачу вручную и с использованием линз.
Подход к реализации с использованием линз.
- Создайте линзу для получения параметра пути с помощью Path.
 - Укажите преобразование пути к целому числу, int().
 - Укажите данный параметр обязательным, required().
 - Примените линзу к запросу, полученному от пользователя 
triangleNumberLens(request). - Добавьте обработку исключения LensFailure. В случае возникновения исключительной ситуации обработчик должен возвращать ответ с кодом 400, BAD_REQUEST.
 
Обработка параметров формы добавления новых треугольников #
При работе с формой добавления треугольника форма должна:
- Не терять данные, которые ввёл пользователь.
 - Показывать сообщения: почему форма не была принята сервером.
 - Принимать корректный ввод от пользователя.
 
Для реализации используйте линзы FormField и обёртку для линз, Body.webForm.
Подход к реализации
- Создайте отдельный пакет для хранения обработчиков, 
ru.ac.uniyar.handlers. - Создайте файл для хранения обработчиков по работе с формой добавления треугольников, 
ru.ac.uniyar.handlers.NewTriangleForm. - Перенесите в данный файл обработчики запросов
- Обработчик GET-запроса на отображение формы, 
showNewTriangleForm. - Обработчик POST-запроса на добавление треугольника, 
createNewTriangle. 
 - Обработчик GET-запроса на отображение формы, 
 - Опишите линзы для обработки полей формы.
- Для каждой из сторон треугольника создайте линзу на основе FormField.
 - Укажите тип данных для преобразования строки в число, int().
 - Укажите необходимость для показа информации, required(). В рамках вызова метода укажите название поля формы и описание.
 - Описание линз можно вынести вне функций-обработчика.
 
 - Опишите общую линзу для обработки формы.
- Объедините отдельные линзы для полей формы в единую линзу для всей формы с помощью Body.webForm.
 - В качестве валидатора формы используйте Validator.Feedback
 
 - Преобразуйте модель шаблонизатора 
NewTriangleDataViewModelтак, чтобы он принимал объект типа WebForm. - В рамках обработчика запроса на показ формы, 
showNewTriangleForm, инициализируйте данную модель с помощью пустого объектаWebForm. - В рамках обработчика запроса на добавление нового треугольника, 
createNewTriangle, реализуйте проверку параметров формы с помощью линзы всей формы.- Обработайте запрос от пользователя с помощью линзы формы.
 - Если в результате проверки формы в полученном объекте WebForm находятся ошибки, то необходимо показать пользователю HTML-документ с формой.
 - Если в результате проверки формы нет ошибок, то необходимо создать новый объект 
Triangle, передав ему в конструктор параметры, полученные от пользователя. 
 - Модифицируйте шаблон отображения формы таким образом, чтобы он отображал данные из передаваемого объекта WebForm.
- Используйте свойство 
errorsдля отображения списка ошибок, которые были получены в результате проверки формы. - Используйте свойство 
fieldsдля отображения данных, которые были введены пользователем при отправке формы. 
 - Используйте свойство