UI Design Principles¶
Описание¶
Работа пользовательского интерфейса с сущностями системы во многих случаях сводится к набору типовых операций:
- Получение списка сущностей, возможно, с фильтрацией и заданием лимитов
- Получение данных для сущности
- Создание новой сущности
- Редактирование сущности: Как одного поля, так и всех полей в целом
- Удаление сущности
В результате анализа мы пришли к выводу, что в разных частях интерфейса одна и та же сущность может быть представлена в нескольких видах:
- id, текст -- для combobox
- набор редактируемых полей - для формы редактирования.
- сжатая информация - для всплывающих подсказок.
- Расширенная информация, включающая в себя и часть связанных сущностей - карточки объекта и так далее.
В связи с этим было решено ввести в API такое понятие как View
- фактический вид сущности. В информационных запросах View
должен быть частью пути url по двум причинам:
- FastAPI не поддерживает роутинг по
querystring
- Для каждого
View
типresponse
отличается кардинально. Делать несколько типов ответов и объединять их через Union - крайне плохой вариант, так как пользователь API не будет заранее знать, в каком виде ему ожидать ответ. Делать один тип ответа с большинством полей вOptional
- еще более худший вариант, так как тогда у пользователя вообще не будет понимания, в каком случае может быть заполнено конкретное поле.
Предлагается принять соглашение о следующем наборе view:
default
- вид по умолчанию (если не задан). Если не определен, использовать previewlabel
- для комбобоксов - id + метка + стиль + иконка (если есть)short
- короткий preview для комбобоксов, если не определен, используется previewpreview
- просмотрfull
- самый расширенный вариант, если не определен, использовать preview.form
- форма редактированияsecret
- показать credentials?
Предлагается следующая иерархия URL
- GET
/api/ui/<сущность>?<filter>
- список сущностей (результат сформатирован для view default) - GET
/api/ui/<сущность>/v/<view>?<filter>
- список сущностей (результат сформатирован для заданного view) - GET
/api/ui/<сущность>/<id>
- данные для сущности с(результат сформатирован для view default) - GET
/api/ui/<сущность>/<id>/v/<view>
- данные для сущности с(результат сформатирован для заданного view) - POST
/api/ui/<cущность>
- создать новый объект.- PUT
/api/ui/<сущность>/<id>/v/<view>
- редактировать объект с заданным набором полей- DELETE `/api/ui/<сущность>/
- удаление объекта То есть вводится дополнительный классификатор-суффикс:
/v/<view>
- использовать формат<view>
/a/<action>
- запуск дополнительного действия для объекта
Открытые вопросы¶
- Завязывать ли POST на view?
- GET