...
Code Block |
---|
language | perl |
---|
title | контроллер Portal::Api::admin::Attachment |
---|
|
package Portal::Api::admin::Articles;
=head1 NAME
Portal articles manage
# Рекомендуем в подах записывать к каким
# группам эндпойнтов относится данный контроллер
Endpoints:
/portal/articles/*
=cut
use strict;
use warnings FATAL => 'all';
use Control::Errors;
# Импортируем объект Portal для работы с базой
# он должен находиться в /usr/abills/Abills/mysql/Portal.pm
use Portal;
my Control::Errors $Errors;
my Portal $Portal;
my Portal::Misc::Attachments $Attachments;
#**********************************************************
=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);
$Attachments = Portal::Misc::Attachments->new($self->{db}, $self->{admin}, $self->{conf});
# Определяем словарь ошибок, который нам пришёл выше
$Errors = $self->{attr}->{Errors};
return $self;
}
# определяем здесь пути
1;
|
Определение роутов
Именно здесь вы можете определять базовую бизнес-логику.
Create
Code Block |
---|
|
#**********************************************************
=head2 getpost_portal_articles($path_params, $query_params)
# Всегда пишите в подах Endpoint *METHOD* *path*
# Это позволит легче искать путь во время разработки.
Endpoint GETPOST /portal/articles
=cut
#**********************************************************
sub getpost_portal_articles {
my $self = shift;
my ($path_params, $query_params) = @_;
# Определяем системные параметры, сортировки, пагинации
my %PARAMS = (
COLS_NAME => 1,if ($query_params->{PICTURE}) {
PAGEmy $picture_ROWSname => $Attachments->save_picture($query_params->{PAGE_ROWS} ?PICTURE});
$query_params->{PAGE_ROWSPICTURE} : 25,= $picture_name;
}
SORTmy $permalink => $query_params->{SORTPERMALINK} ? || _portal_generate_permalink($query_params->{SORT} : 1,TITLE});
PG => $query_params->{PG} ? $query_params->{PG} : 0,
DESC => $query_params->{DESC},
);
# Даём возможность сортировки с помощью ?filename&file_size&file_type
foreach my $param (keys %{$query_params}) {
$query_params->{$param} = ($query_params->{$param} || "$query_params->{$param}" eq '0')
? $query_params->{$param}
: '_SHOW';
}
# Вызываем функцию для извлечения списка из базы, с нашими параметрами и которые определены вызовом
# которые будут внутри обрабатываться search_former my $list = $Portal->portal_articles_list({ %$query_params, %PARAMS });
my @result = map {
my $article_sublink = $_->{permalink} || $_->{id};
my $picture_link = $_->{picture} ? $self->_portal_picture_link($_->{picture}) : '';
$_->{url} = $self->_portal_news_link($article_sublink);
$_->{picture} = $picture_link;
$_
} @$list; # Рекомендация: когда вы создаёте путь, который возвращает массив, то возвращайте
# его с объектом с ключём list, а в total возвращайте общее число айтемов - это позволит работать пагинации
return {
list => \@result,
total => $Portal->{TOTAL}
};
}
return $Portal->portal_article_add({ %$query_params, PERMALINK => $permalink });;
} |
Read
Code Block |
---|
|
#**********************************************************
=head2 get_portal_articles($path_params, $query_params)
# Всегда пишите в подах Endpoint *METHOD* *path*
# Это позволит легче искать путь во время разработки.
Endpoint GET /portal/articles
=cut
#**********************************************************
sub get_portal_articles {
my $self = shift;
my ($path_params, $query_params) = @_;
# Определяем системные параметры, сортировки, пагинации
my %PARAMS = (
COLS_NAME => 1,
PAGE_ROWS => $query_params->{PAGE_ROWS} ? $query_params->{PAGE_ROWS} : 25,
SORT => $query_params->{SORT} ? $query_params->{SORT} : 1,
PG => $query_params->{PG} ? $query_params->{PG} : 0,
DESC => $query_params->{DESC},
);
# Даём возможность сортировки с помощью ?filename&file_size&file_type
foreach my $param (keys %{$query_params}) {
$query_params->{$param} = ($query_params->{$param} || "$query_params->{$param}" eq '0')
? $query_params->{$param}
: '_SHOW';
}
# Вызываем функцию для извлечения списка из базы, с нашими параметрами и которые определены вызовом
# которые будут внутри обрабатываться search_former
my $list = $Portal->portal_articles_list({ %$query_params, %PARAMS });
my @result = map {
my $article_sublink = $_->{permalink} || $_->{id};
my $picture_link = $_->{picture} ? $self->_portal_picture_link($_->{picture}) : '';
$_->{url} = $self->_portal_news_link($article_sublink);
$_->{picture} = $picture_link;
$_
} @$list;
# Настоятельная рекомендация: когда вы создаёте путь, который возвращает массив, то возвращайте
# его с объектом с ключём list, а в total возвращайте общее число айтемов - это позволит работать пагинации
# и опеределять дополнительные параметры. Будет легче поддерживать.
return {
list => \@result,
total => $Portal->{TOTAL}
};
}
#**********************************************************
=head2 get_portal_articles_id($path_params, $query_params)
Endpoint GET /portal/articles/:id/
=cut
#**********************************************************
sub get_portal_articles_id {
my $self = shift;
my ($path_params, $query_params) = @_;
foreach my $param (keys %{$query_params}) {
$query_params->{$param} = ($query_params->{$param} || "$query_params->{$param}" eq '0')
? $query_params->{$param}
: '_SHOW';
}
$query_params->{COLS_NAME} = 1;
my $list = $Portal->portal_articles_list({ ID => $path_params->{id}, %$query_params });
my @result = map {
my $article_sublink = $_->{permalink} || $_->{id};
my $picture_link = $_->{picture} ? $self->_portal_picture_link($_->{picture}) : '';
$_->{url} = $self->_portal_news_link($article_sublink);
$_->{picture} = $picture_link;
$_
} @$list;
return $result[0] || {};
}
|
Update
Code Block |
---|
|
#**********************************************************
=head2 put_portal_articles_id($path_params, $query_params)
PUT /portal/articles/:id
=cut
#**********************************************************
sub put_portal_articles_id {
my $self = shift;
my ($path_params, $query_params) = @_;
if ($query_params->{PICTURE}) {
my $picture_name = $Attachments->save_picture($query_params->{PICTURE}, $path_params->{id});
$query_params->{PICTURE} = $picture_name;
}
my $permalink = $query_params->{PERMALINK} || _portal_generate_permalink($query_params->{TITLE});
return $Portal->portal_article_change({ %$query_params, PERMALINK => $permalink });
} |
Delete
Code Block |
---|
|
#**********************************************************
=head2 delete_portal_articles_id($path_params, $query_params)
Endpoint DELETE /portal/articles/:id/
=cut
#**********************************************************
sub delete_portal_articles_id {
my $self = shift;
my ($path_params, $query_params) = @_;
my $list = $Portal->portal_articles_list({ ID => $path_params->{id}, COLS_NAME => 1 });
if (!($list && scalar(@$list))) {
return $Errors->throw_error(1440002, { lang_vars => { ID => $path_params->{id} }});
}
my $result = $Portal->portal_article_del({ ID => $path_params->{id} });
if (!$Portal->{errno}) {
$Attachments->delete_attachment($path_params->{id});
}
return $result;
} |
USER API
Создание роутов
Если нужно USER API, заполняем и это:
...