С 1.22.00.
За основу туториал по написанию API для модуля, здесь могут написаны только дополнительные подробности.
Местонахождение /lib/Abills/Api
Мы стараемся делить функционал ядра на микромодули, чтобы это было удобно логически делить, поддерживать.
Список микромодулей определено в функции _extra_api_modules в пэкэдже Paths.pm
А сами микромодули, находятся в Paths/.
Здесь собрано и ADMIN API так и USER API.
Название модуля обязательно определяется за префиксом, например /districts - файл должен называться Districts.pm, и соответственно создавать
пэкэдж Districts.
Исключение составляет User_core.pm.
За пример возьмём Fees.pm
Создание микромодуля
# Обязательно Abills::Api::Paths::<module>
package Abills::Api::Paths::Fees;
=head NAME
Fees api functions
=cut
use strict;
use warnings FATAL => 'all';
use Abills::Base qw(in_array);
# Конструктор микророутера
#**********************************************************
=head2 new($db, $conf, $admin, $lang)
=cut
#**********************************************************
sub new {
my ($class, $db, $admin, $conf, $lang, $debug, $type) = @_;
my $self = {
db => $db,
admin => $admin,
conf => $conf,
lang => $lang,
debug => $debug
};
bless($self, $class);
$self->{routes_list} = ();
if ($type eq 'admin') {
$self->{routes_list} = $self->admins_routes();
}
elsif ($type eq 'user') {
$self->{routes_list} = $self->user_routes();
}
return $self;
}
#**********************************************************
=head2 admin_routes() - Returns available ADMIN API paths
=cut
#**********************************************************
sub admin_routes {
# Здесь нужно возвращать специальный массив ADMIN API
return [];
}
#**********************************************************
=head2 user_routes() - Returns available USER API paths
=cut
#**********************************************************
sub user_routes {
# Здесь нужно возвращать специальный массив USER API
return [];
}
Словарь ошибок
В разработке.
Валидатор
Про валидацию
Микромодуль называется Fees, то нужно создавать Validations/Fees.pm.
Общие валидации находятся в Validations.pm, там могут быть кастомные, нужные вам валидации.
ADMIN API
Создание роутов и определение
{
# HTTP метод
method => 'DELETE',
# Путь, обязательно начинается с имени микромодуля
# определяем path_params
path => '/fees/users/:uid/:id/',
# Определение эндпоинта
handler => sub {
my ($path_params, $query_params, $module_obj) = @_;
# ...
},
# Загружаемый модуль.
# Исторически функционал API делится по принципу Abills/mysql, так что мы можем немного сократить код.
# Мы не особенно рекомендуем использовать эту опцию в будущем, но ознакомиться считаем нужно.
module => 'Fees',
# Определяем нужные параметры для авторизации.
# ADMIN - API_KEY
# ADMINSID - admin_sid по cookie (в том числе для api_call)
credentials => [
'ADMIN', 'ADMINSID'
]
}
Написание OpenAPI
Про OpenAPI в ABillS
OpenAPI для ядра находится в корне misc/api/(admin|user)/[module]
Так что для работы нам нужно:
- создать папку misc/api/user/fees
- создать файл misc/api/user/fees/paths.yaml
- создать папку misc/api/user/fees/paths
- создать папку misc/api/user/fees/schemas
В остальном ничем не отличается от функционала в модулях.
Запускаем misc/api/generate_docs.pl и проверяйте bundle_admin.yaml
Поздравляем!
USER API
Создание роутов и определение
{
# HTTP метод
method => 'GET',
# Путь, начинается в /user/ и названием микромодуля
path => '/user/fees/',
# Определение эндпоинта
handler => sub {
my ($path_params, $query_params, $module_obj) = @_;
# ...
},
# Загружаемый модуль.
# Исторически функционал API делится по принципу Abills/mysql, так что мы можем немного сократить код.
# Мы не особенно рекомендуем использовать эту опцию в будущем, но ознакомиться считаем нужно.
module => 'Fees',
# Определяем нужные параметры для авторизации.
# USER - авторизация по header, полученном с /user/login
# USERSID - авторизация по cookie (в том числе для api_call)
# USERBOT - авторизация через наше API Bots
# PUBLIC - без авторизации
# Тоесть, в данном случае путь может работать как и с авторизованными пользователями, так и нет.
# Внутри хэндлера можно определять какой пользователь.
credentials => [
'USER', 'USERBOT'
]
},
Написание OpenAPI
Про OpenAPI в ABillS
OpenAPI для ядра находится в корне misc/api/(admin|user)/[module]
Так что для работы нам нужно:
- создать папку misc/api/user/fees
- создать файл misc/api/user/fees/paths.yaml
- создать папку misc/api/user/fees/paths
- создать папку misc/api/user/fees/schemas
В остальном ничем не отличается от функционала в модулях.
Запускаем misc/api/generate_docs.pl и проверяйте bundle_user.yaml
Поздравляем!
Практики
Повторяет с модулями.
Но ещё другие рекомендации относительно ядра
Разделение описания пути и реализации
На данный момент пока что не существует решения.
Использование пропса module
Поскольку API ядра делится практически за тем же принципом что и файлы Abills/mysql, то можно при создании роута и его определении сократить код с
my $Fees = Fees->new($self->{db}, $self->{admin}, $self->{conf});
# ...
до: