МОД «Исключение из авторизации»
Постановка задачи
Задача - сделать так, чтобы заказы, сделанные определенными пользователями клиента, подтверждались без авторизации независимо от типа пассажира в них (т. е., даже если пассажир требует авторизации, если БЫ бронировал сам себе).
Назначение - если заказ делает авторизованное (доверенное) лицо клиента, то эти заказы не должны требовать дополнительной авторизации независимо от всех прочих условий, включая тип/статус пассажира - не важно, для кого он делает этот заказ.
Описание мода
Подключение МОДа
Для подключения МОДа необходимо перейти в раздел “Расширения” и выбрать раздел “Marketplace”.
Настройка МОДа
После активации МОДа, необходимо перейти в раздел настройки → “Персоны и Пользователи”
Далее выбрать интересующую персону.
Перейти в раздел “Изменить аккаунт”
В “расширениях” находится кнопка активации.
ВНИМАНИЕ: Для включения / отключения данной настройки у персоны, она должна быть пользователем системы.
Работа с МОДом
После подключения, персона с активным правилом “Исключение из авторизации” будет иметь возможность оформлять заказы без необходимости авторизации.
Процесс разработки
В рамках разработки МОДа надо сделать следующие вещи:
Расширить модель пользователя, добавив к ней булевый признак "Без авторизации";
Расширить редактор пользователя, чтобы можно было включить настройку из п. 1;
Переопределить бизнес-логику процесса старта авторизации из МОДа "Схемы авторизации". Это необходимо для того, чтобы при условии наличия у клиента этого признака выполнялся не запуск авторизации, а бизнес-логика базового контроллера перевода заказа в чистовик;
Сформировать остнастку мода(прописать правила инициализации и описание для marketplace).
Расширение модели
Для расширения модели мы создаем класс AuthorizationExceptionSettings (находится в папке Structure), который реализует интерфейс IXmlConvertible для сериализации и десериализации класса, который будет размещен в BLModels/Structures.
Далее создаем класс ClientWithAuthorizationException, который наследуется от JavelinModelV2.Users.BaseUser <Structures.AuthorizationExceptionSettings>, который, кроме конструктора по умолчанию содержит конструктор, принимающий в качестве параметра id пользователя, по которому из базы загружаются данные пользователя.
Доработка редактора пользователя
В рамках этой задачи мы должны добавить представление для редактирования пользователя и View Controller, который отвечает за это действие (настройка расположена в редакторе персоны (раздел "Расширения" редактора) и выглядит таким образом:
Для реализации этого представления мы должны сделать контроллер MVC и представление .cshtml, которое и рисует данный портлет. Они будут размещены в папке Controllers и в подпапке PortableViews соответственно:
Далее разрабатываем сам контроллер ModAuthorizationExceptionClientEdtorController: BaseViewController, IExtendibleJavelinObject
В нем реализуем методы интерфейса IExtendibleJavelinObject:
Также делаем метод переключения необходимости авторизации ToggleAuthorizationIsNotRequired, который будет вызываться через AJAX при включении/выключении пользователем данного переключателя:
На входе в этот метод передается идентификатор пользователя, для которого осуществляется переключение:
Реализацию view можно посмотреть в примере на github.
Реализация бизнес-логики
Контроллер для работы с логикой авторизации с учетом настройки "Исключение авторизации" AuthorizationExceptionLogicsController наследуется от контроллера запуска авторизации ModComplexAuth.PluginLogics.BLControllers.Process.AuthorizationStartController.
Данный класс содержит два основных метода:
- Получение кнопки "Перевести в чистовик", если включена настройка "Исключение из авторизации" (GetActionInfo())
- Перевод заказа сразу в "Чистовик", если включена настройка "Исключение из авторизации" (ToCleanCopy(int id_ComplexReserve)) и настройки пользователя - свойство CurrentClientAuthSettings.
Контроллеры (папка Controllers):
Класс контроллера ModAuthorizationExceptionClientEdtorController наследуется от класса BaseViewController и реализовывает интерфейс IextendibleJavelinObject, который содержит метод проверки применения мода IsApplicable по его названию на латинице.
Метод контролера ToggleAuthorizationIsNotRequired(int id) служит для взаимодействия с переключателем настройки в представлении ClientSettingsEditor.cshtml через AJAX.
Метод RenderExtension (JavelinObject source) возвращает представление для включения / отключения настройки «Исключение из авторизации» ClientSettingsEditor.cshtml.
Представления мода (папка PortableViews):
Представление ClientSettingsEditor.cshtml включает / отключает настройку «Исключение из авторизации».
Взаимодействие с моделью данных через вызов jquery и id пользователя:
<input… onchange="(function () { $.get('/ModAuthorizationExceptionClientEdtor/ToggleAuthorizationIsNotRequired', {id: @(Model.id)}); })() ">