Child pages
  • Туториал по написанию API для модуля

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Данная страница документация не завершена.

Актуально для версии 1.22.00.

...

Code Block
languageperl
collapsetrue
 
#**********************************************************
=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
  });
} 

Написание OpenAPI

Каждое API нужно описывать.

Поэтому, по нашему микрофреймворку над OpenAPI

  • Файл Api/swagger/(admin|user)/paths.yaml - основа
  • Папка Api/swagger/(admin|user)/paths - определения путей
  • Папка Api/swagger/(admin|user)/schemas - определения схем

Файл user/paths.yaml:

Code Block
languageyml
titleuser/paths.yaml
/user/portal/news:
  $ref: "./paths/news.yaml"

И в ./paths/news.yaml:

Code Block
languageyml
titlepaths/news.yaml
collapsetrue
get:
  tags:
    - portal
  summary: Список новостей
  responses:
    200:
      description: Успешное выполнение
      content:
        application/json:
          schema:
            $ref: "../schemas/news.yaml"
  security:
    - USERSID: [ ]

schemas/news.yaml:

Code Block
languageyml
titleschemas/news.yaml
collapsetrue
type: object
properties:
  news:
    type: array
    items:
      type: object
      properties:
        content:
          type: string
          example: При замовленні пакету «ABillS+» платіть X грн/міс замість X грн/міс. Підключайте ТВ-пакет «База+» і отримаєте в подарунок півроку користування послугою! Кожен місяць сплачуйте лише 50% вартості пакету. Абонплата складе всього X грн.
        date:
          type: string
          format: date
          example: 2023-01-23
        id:
          type: number
          example: 4
        importance:
          type: number
          example: 1
        onMainPage:
          type: number
          example: 1
        permalink:
            type: string
            example: special-promotion-50-2023
        picture:
          type: string
          example: "http://192.168.99.2:9443/images/attach/portal/9700077.png"
        shortDescription:
          type: string
          example: Тарифний план для всіх у сімї
        title:
          type: string
          example: Акціний тариф візьми поки можеш
        topicId:
          type: number
          example: 1
  topics:
    type: array
    items:
      type: object
      properties:
        id:
          type: number
          example: 1
        name:
          type: string
          example: Акції від нас
        url:
          type: string
          example: "https://demo.abills.net.ua:9443/"

И в конце запускаем misc/api/generate_docs.pl, и проверяем bundle_user.yaml.

И поздравляем, вы полностью разработали и описали USER API для модуля.

Практики

Поиск, сортировка, пагинация

...