...
| Блок кода | ||
|---|---|---|
| ||
return [
# Создать статью
{
method => 'POST',
path => '/portal/articles/',
# Параметры до валидатора
params => POST_PORTAL_ARTICLES,
controller => 'Portal::Api::admin::Articles',
endpoint => \&Portal::Api::admin::Articles::post_portal_articles,
credentials => [
'ADMIN', 'ADMINSID'
]
},
# Получить статьи
{
method => 'GET',
path => '/portal/articles/',
controller => 'Portal::Api::admin::Articles',
endpoint => \&Portal::Api::admin::Articles::get_portal_articles,
credentials => [
'ADMIN', 'ADMINSID'
]
},
# Получить конкретную статью
{
method => 'GET',
path => '/portal/articles/:id/',
controller => 'Portal::Api::admin::Articles',
endpoint => \&Portal::Api::admin::Articles::get_portal_articles_id,
credentials => [
'ADMIN', 'ADMINSID'
]
},
# Изменить конкретную статью
{
method => 'PUT',
path => '/portal/articles/:id/',
controller => 'Portal::Api::admin::Articles',
endpoint => \&Portal::Api::admin::Articles::put_portal_articles_id,
credentials => [
'ADMIN', 'ADMINSID'
]
},
# Удалить конкретную статью
{
method => 'DELETE',
path => '/portal/articles/:id/',
controller => 'Portal::Api::admin::Articles',
endpoint => \&Portal::Api::admin::Articles::delete_portal_articles_id,
credentials => [
'ADMIN', 'ADMINSID'
]
},
] |
...
| Блок кода | ||||
|---|---|---|---|---|
| ||||
#**********************************************************
=head2 user_routes() - Returns available USER API paths
=cut
#**********************************************************
sub user_routes {
my $self = shift;
return [
{
method => 'GET',
# Для USER API ОБЯЗАТЕЛЬНО начинаем абсолютный путь с /user/*.
path => '/user/portal/menu/',
# Подключаем "контроллер" для API /user/portal/*
controller => 'Portal::Api::user::News',
# Даём ссылку на функцию-эндпойнт контроллера
endpoint => \&Portal::Api::user::News::get_user_portal_news,
credentials => [
# Определяем нужные параметры для авторизации.
# USER - авторизация по header, полученном с /user/login
# USERSID - авторизация по cookie (в том числе для api_call)
# PUBLIC - без авторизации
# Тоесть, в данном случае путь может работать как и с авторизованными пользователями, так и нет.
# Внутри хэндлера можно определять какой пользователь, об этом ниже.
'USER', 'USERSID', 'PUBLIC'
]
},
]
} |
Создание контроллера
Контроллер для USER API совсем ничем не отличается.
| Блок кода | ||||
|---|---|---|---|---|
| ||||
package Portal::Api::user::News;
=head1 NAME
User Portal
# Рекомендуем в подах записывать к каким
# группам эндпойнтов относится данный контроллер
Endpoints:
/user/portal/news*
/user/portal/menu
=cut
use strict;
use warnings FATAL => 'all';
use Control::Errors;
# Импортируем объект Portal для работы с базой
# он должен находиться в /usr/abills/Abills/mysql/Portal.pm
use Portal;
my Portal $Portal;
my Control::Errors $Errors;
#**********************************************************
=head2 new($db, $admin, $conf)
=cut
#**********************************************************
sub new {
my ($class, $db, $admin, $conf, $attr) = @_;
my $self = {
db => $db,
admin => $admin,
conf => $conf,
attr => $attr
};
bless($self, $class);
$Portal = Portal->new($db, $admin, $conf);
# Определяем словарь ошибок, который нам пришёл выше
$Errors = $self->{attr}->{Errors};
return $self;
}
# здесь определять пути
1; |
Определение роутов
В целом, определение роутов для USER API ничем не отличается от ADMIN API, кроме одной важной детали - в $path_params при авторизации будет приходить uid.
Очень важная составляющая.
| Блок кода | ||
|---|---|---|
| ||
#********************************************************** =head2 get_user_portal_news($path_params, $query_params) Endpoint GET /user/portal/news =cut #********************************************************** sub get_user_portal_news { my $self = shift; my ($path_params, $query_params) = @_; # Не обязательно писать всю логику прямо внутри эндпоинта, как в примере с ADMIN API # Вы можете делить логику в бизнес-функции, для сокращения использования. # Но для простоты понимания, с самого начала лучше писать всё в эндпоинтах return $self->_portal_menu({ # # Если пользователь авторизован - в $path_params->{uid} будет UID пользователя. # Если нет - поле будет пустое. UID => $path_params->{uid} || '', DOMAIN_ID => $query_params->{DOMAIN_ID}, PORTAL_MENU_ID => $query_params->{PORTAL_MENU_ID}, MAIN_PAGE => $query_params->{MAIN_PAGE}, LIST => 1 }); } 1; |