Для интеграции виджета HBW во внешние системы необходимо:
- сделать прокси-контроллеры, через которые встроенный виджет будет делать запросы в бэкенд HOMS с базовой аутентификацией (используя пароль и логин из конфига);
- встроить JS виджета и отрендерить.
Значение параметров запросов:
hbw_url
– адрес HOMS (http://localhost:3002, указывается в конфиге);hbw_assets_path
– адрес статичесаких файлов HOMS (указывается в конфиге);hbw_login
– логин (user@example.com, указывается в конфиге);hbw_token
– токен (renewmeplease, указывается в конфиге);entity_class
– идентификатор интеграции (указывается в конфиге);entity_type
– тип заказа (указывается в конфиге или в месте монтирования);entity_code
– уникальный код для создания заказа;bp_code
– код бизнес-процесса;initial_variables
– параметры, с которыми создается бизнес-процесс.
Прокси-контроллеры
Прокси-контроллер служит прослойкой между внешней системой и HOMS, где задаются необходимые параметры для работы с заказами и идентификации пользователя.
Необходимо разработать следующие методы:
- методы, которые делают
GET,
POST и PUT
запросы в бэкенд HOMS:- параметры, которые передаются в
GET
запросы должны задаваться в заголовке запроса; - параметры, которые задаются в
POST и PUT
запросы должны задаваться в теле запроса.
- параметры, которые передаются в
def get_request_bpm_backend(path, parameters = {}) params = request_params(path).merge( method: :get, headers: { params: parameters } ) rest_rack_response(params) end def post_request_bpm_backend(path, parameters = {}) params = request_params(path).merge( method: :post, payload: parameters ) rest_rack_response(params) end def put_request_bpm_backend(path, parameters = {}) params = request_params(path).merge( method: :put, payload: parameters ) rest_rack_response(params) end private def rest_rack_response(params) response = RestClient::Request.execute(params) [response.code, response.headers, [response.body]] end def request_params(path) { url: build_bpm_widget_path(path), user: configuration[:login], password: configuration[:password] } end def build_bpm_widget_path(path = '') URI.join(configuration[:url], '/widget/', path).to_s end
где
configuration: { url: "http://localhost:3002/" (hbw_url), login: user@example.com (hbw_login), password: renewmeplease (hbw_token) }
- метод, в котором ко всем параметрам запросов будет добавляться идентификатор пользователя, который взаимодействует с HOMS
def with_user_identifier(parameters) parameters.merge( 'user_identifier' => GetSession.(params[:payload][:token])[:session][:email] ) end def allow_params(*allowed_params) with_user_identifier(params.slice(*allowed_params)) end
- методы, которые работают с кнопками начала бизнес-процесса
метод, который делает запрос для получения (GET) кнопок для начала бизнес-процесса, необходимые параметры:
entity_class, entity_type, entity_code
get_request_bpm_backend('buttons', allow_params('entity_class', 'entity_type', 'entity_code'))
- метод, который начинает бизнес-процесс
post_request_bpm_backend('buttons', allow_params('entity_class', 'entity_type', 'entity_code', 'bp_code', 'initial_variables'))
- методы для работы с формами заказа
- получение всех заказов –
GET
запрос c параметрамиentity_class
,entity_code
:
get_request_bpm_backend('tasks', allow_params('entity_class', 'entity_code'))
- получение формы текущего заказа –
GET
запрос c параметрамиentity_class
,id
:
- получение формы текущего заказа –
get_request_bpm_backend("tasks/#{params[:id]}/form", allow_params('entity_class', 'id'))
- обновление формы текущего заказа – put запрос с параметрами
entity_class
,form_data
,id
- обновление формы текущего заказа – put запрос с параметрами
put_request_bpm_backend("tasks/#{params[:id]}/form", allow_params('entity_class', 'form_data', 'id'))
получение информации для лукапов –
GET
запрос с параметрамиentity_class
, name,q
,id
get_request_bpm_backend("tasks/#{params[:id]}/lookup", allow_params('entity_class', 'name', 'q', 'id'))
- метод для проверки прав пользователя.
get_request_bpm_backend('users/check')
Встраивание JS
Необходимо включить в HTML страницы внешней системы JS и CSS виджета:
<script type="text/javascript" src="<%= '\<\%\= hbw_assets_path \%\>' %>assets/hbw.js"></script> <link reluser_identifier="stylesheet" type="text/css" href="<%= '\<\%\= hbw_assets_path \%\>' %>assets/hbw.css">
Добавить на страницу <div> с уникальным ID, например, bpmWidgetContainer
, чтобы в нём отрендерился виджет.
render
у объекта виджета:this.widget = new (modulejs.require('HBW'))({ widgetContainer: `#${this.widgetContainerId}`, widgetPath: '/widget', entity_class: 'your_entity_class', entity_type: 'operator', entity_code: `${id}`, locale: i18n.language, payload: { token: cookies.get('token'), variables: { id: { value: `${id}`, type: 'string', }, }, }, }); this.widget.render();