Доступно с 1.20.00
В связи с переходом на полную API-фикацию функций биллинга, и избежания двойных имплементаций в системе существует интерфейс прямого вызова API, будто это происходит с отдельного приложения.
Система даёт интерфейс максимально похожим на любой другой внешний вызов, с почти полной изоляцией.
Имеет почти полную совместимость з вызовами в базу данных с search_former
use Abills::Api::Handle; # Создаём объект работы с API my $Api = Abills::Api::Handle->new($db, $admin, \%conf, { html => $html, lang => \%lang, cookies => \%COOKIES, direct => 1 }); # GET my $uid = 147; my ($response, $status, $content_type) = $Api->call_api({ METHOD => "GET", PATH => "/users/$uid", }); # GET with query params my $uid = 147; my ($response, $status, $content_type) = $Api->call_api({ METHOD => "GET", PATH => "/users/$uid", PARAMS => \%FORM }); # POST with body my ($response, $status, $content_type) = $Api->call_api({ METHOD => "POST", PATH => "/portal/newsletter", PARAMS => \%FORM }); |
Функция принимает одну хэшмапу, с аргументами:
Функция возвращает кортеж:
Данная функция была создана для унификации вызовов системы с нашим API и его полной изоляции.
Если ваша функция на получение данных из базы и вашего API основана на search_former, миграция должна быть простой:
# Код до my $payments_list_old = $Docs->invoices_list({ %LIST_PARAMS, %FORM, UNINVOICED => 1, COLS_NAME => 1, }); # Код после my ($payments_list_new) = $Api->api_call({ # Можно не указывать метод если это GET METHOD => 'GET', PATH => '/docs/invoices/', PARAMS => { %LIST_PARAMS, %FORM, UNINVOICED => 1, COLS_NAME => 1, } }); |
Но, имейте ввиду - поля приходят исключительно в lower_snake_case.
Любая функция на добавление должна мигрироваться ещё прощё:
# Код до $Portal->portal_newsletter_add({ PORTAL_ARTICLE_ID => $last_news_id, SEND_METHOD => $method_id, }); # Код после my ($newsletter_res) = $Api->api_call({ METHOD => 'POST', PATH => '/portal/newsletter', PARAMS => { PORTAL_ARTICLE_ID => $last_news_id, SEND_METHOD => $method_id, } }); |
На изменение требует некоторой модификации:
$Portal->portal_menu_change({ ID => $FORM{id}, %FORM }); my ($res) = $Api->api_call({ METHOD => 'PUT', # REST API предполагает использование идентификаторов прямо в path params PATH => "/portal/menus/$FORM{id}", PARAMS => \%FORM }); |
Если вы используете result_former, то его поддержка, на момент версии 1.20.00, неполная.
Вы можете спокойно им пользоваться, кроме резиновых полей.
Если вам нужны резиновые поля - рекомендуем пока этого не делать.
Пример миграции result_former БЕЗ резиновых полей:
# Код до result_former({ INPUT_DATA => $Portal, FUNCTION => 'attachment_list', DEFAULT_FIELDS => 'ID,FILENAME,FILE_TYPE,FILE_SIZE,UPLOADED_AT,SRC', SKIP_USER_TITLE => 1, FUNCTION_FIELDS => 'del', EXT_TITLES => { id => 'ID', filename => $lang{NAME}, file_type => $lang{TYPE}, file_size => $lang{SIZE}, uploaded_at => $lang{ADDED}, src => $lang{LINK} }, TABLE => { width => '100%', caption => "$lang{PORTAL_ATTACHMENTS}", qs => $pages_qs, ID => 'PORTAL_ATTACHMENTS', EXPORT => 1, MENU => [ $add_button ] }, MAKE_ROWS => 1, TOTAL => 1 }); # Код после my ($attachments) = $Api->api_call({ PATH => '/portal/attachment', PARAMS => { %FORM, %LIST_PARAMS } }); result_former({ # Список должен быть отдельным параметром хэшмапы. DATAHASH => $attachments->{list}, # Обязательно для правильной работы пагинаций DATATOTAL => $attachments->{total}, # Обязательно указывайте нужные вам параметры и его порядок DEFAULT_FIELDS => 'id,filename,file_type,file_size,uploaded_at,src', SKIP_USER_TITLE => 1, FUNCTION_FIELDS => 'del', EXT_TITLES => { id => 'ID', filename => $lang{NAME}, file_type => $lang{TYPE}, file_size => $lang{SIZE}, uploaded_at => $lang{ADDED}, src => $lang{LINK} }, TABLE => { width => '100%', caption => $lang{PORTAL_ATTACHMENTS}, qs => $pages_qs, ID => 'PORTAL_ATTACHMENTS', EXPORT => 1, MENU => [ $add_button ], # Отключите резиновые поля SHOW_COLS => 0, }, MAKE_ROWS => 1, TOTAL => 1, }); |