Как добавить allof type в Open API Specification 3.0? - PullRequest
0 голосов
/ 06 июня 2019

Мы следуем первому подходу к разработке API.

Один из сценариев, где мы хотим использовать Наследование Я не могу определить спецификацию для него.

Это тип C # для него

public class PublishRequest
    {

        [JsonProperty("notificationType")]
        public string NotificationType { get; set; }

        [JsonProperty("source")]
        public string Source { get; set; }

        [JsonProperty("timestamp")]
        public string Timestamp { get; set; }

        [JsonProperty("payload")]
        public List<BaseObject> Payload { get; set; }
    }

ЭтоУ класса есть свойство для BaseObject

 public class BaseObject
    {
        [JsonProperty("Id")]
        public string Id { get; set; }
    }

Все последующие типы наследуются от этого типа, который выглядит следующим образом:

public class Accounts:BaseObject
    {
        [JsonProperty("phone")]
        public string Phone { get; set; }
        [JsonProperty("accountid")]
        public string AccountID { get; set; }
        [JsonProperty("name")]
        public string Name { get; set; }
        [JsonProperty("legalname")]
        public string LegalName { get; set; }
        [JsonProperty("website")]
        public string Website { get; set; }
        [JsonProperty("linkedin")]
        public string LinkedIn { get; set; }
        [JsonProperty("twitter")]
        public string Twitter { get; set; }
    }

Спецификация, в которой используются эти классы, такова:

/notification/publish:
    post:
      summary: publish notification
      tags:
        - Notification
      requestBody:
        description: publish request body
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublishRequest'
      responses:
        "200":
          description: success message

Проблема, с которой я сталкиваюсь, заключается в определении схемы для нее.

Схема выглядит следующим образом

PublishRequest:
      required:
        - notificationType
      properties:
        notificationType:
          type: string 
          enum: [account_created, account_updated]
        source:
          type: string 
          enum: [A, B]
        timestamp:
          type: string 
          format: date-time          
        payload: 
          $ref: "#/components/schemas/NotificationPayload"

    NotificationPayload:
      type: array
      items:
        oneOf:
          - $ref: "#/components/schemas/Account"        

    BaseObject:
      properties:
        Id:
          type: string
    Account:
     allOf:    
      $ref: '#/components/schemas/BaseObject'
      type: object
      properties:
        phone:
          type: string
        accountId:
          type: string
        name:
          type: string
        legalname:
          type: string  
        website:
          type: string
        linkedin:
          type: string
        twitter:
          type: string
        facebook:
          type: string
        defaultcurrency:
          type: string 

Я продолжаю получать эту ошибку в редакторе сваггеров

Structural error at components.schemas.Account.allOf
should be array

1 Ответ

0 голосов
/ 07 июня 2019

Правильный синтаксис для allOf следующий.allOf занимает список подсхем, поэтому каждая подсхема должна иметь префикс - в YAML.

    Account:
      allOf:
        - $ref: '#/components/schemas/BaseObject'
        - type: object
          properties:
            phone:
              type: string
            ...

Пара других вещей:

  • В NotificationPayload, items не нужно oneOf, потому что есть только одна подсхема.

        NotificationPayload:
          type: array
          items:
            $ref: "#/components/schemas/Account"
    
  • Не забудьте добавить type: object к схемам объектов,в этом примере - PublishRequest и BaseObject.Одного ключевого слова properties недостаточно для указания типа объекта, а схемы без type фактически означают «любой тип».

...