Child pages
  • Программный интерфейс API
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

С 1.22.00.

В данной статье описано программный интерфейс всего API, как и со стороны модуля так и ядра.


Объект пути

    {
      # HTTP метод, GET, POST, PUT, PATCH, DELETE
      method      => 'POST',
      # Абсолютный путь, за которым можно будет достучаться, например billing.url/api.cgi/portal/articles
      # для USER API обязательно должно начинаться с /user/* 
      # В пути определяются основные параметры, по типу :id, :uid, которое отобразятся в пути
      path        => '/portal/articles/',
      # "Контроллер" для API /portal/articles/*
      controller  => 'Portal::Api::admin::Articles',
      # Ссылка на функцию-эндпойнт контроллера
      endpoint    => \&Portal::Api::admin::Articles::post_portal_articles,
      credentials => [
        # Параметры авторизации ADMIN API
        # ADMIN    - API_KEY
        # ADMINSID - admin_sid по cookie (в том числе для api_call)
        'ADMIN', 'ADMINSID'

        # Параметры авторизации USER API
        # USER    - через header, полученном с /user/login
        # USERSID - через cookie (в том числе для api_call)
        # PUBLIC  - без авторизации 
        # Тоесть, в данном случае путь может работать как и с авторизованными пользователями, так и нет.
        # Внутри хэндлера можно определять какой пользователь.
      ]
    },


Контроллер

# Пэкэдэ <Module>::Api::(admin | user)::<Controller>
package Portal::Api::admin::Articles;

=head1 NAME

  Portal articles manage

  Endpoints:
    /portal/articles/*

=cut

use strict;
use warnings FATAL => 'all';

# Словарь ошибок
use Control::Errors;

# Грузим нужные депенденси для этого контроллера
use Portal;

# Создаём объект словаря ошибок
my Control::Errors $Errors;

# Создаём объект(ы) депенденси
my Portal $Portal;

# Дополнительно: определяем permissions
my %permissions = ();

# TODO: make this centralized and more maintainable
my @allowed_methods = (5, 6, 10);

#**********************************************************
=head2 new($db, $admin, $conf)

=cut
#**********************************************************
sub new {
  my ($class, $db, $admin, $conf, $attr) = @_;

  my $self = {
    db    => $db,
    admin => $admin,
    conf  => $conf,
    attr  => $attr
  };

  %permissions = %{$attr->{permissions} || {}};

  bless($self, $class);

  # Определяем депенденси
  $Portal = Portal->new($db, $admin, $conf);

  $Errors = $self->{attr}->{Errors};

  return $self;
}

# И дальше пишем пути #

1;


Определение пути

#**********************************************************
=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) = @_;
  # В $path_params находятся переменные которые определены путём
  # Например, /portal/articles/:id/ будет иметь параметр $path_params->{id}

  # в $query_params находятся параметры которые пришли с query
  # например: /portal/articles/?title=test
  # или c json/form body
  # например: POST /portal/articles { "title": "test" }

  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});
  }

  # Стандартный результат при удалении, должен быть описан в Swagger 
  return $result;
}


  • No labels