Forum Discussion

peat-psuwit's avatar
peat-psuwit
New Member
6 years ago

How to make an "all optional" schema from a schema in OpenAPI 3

Suppose I have an OpenAPI 3.0 schema like this:

components:
  schemas:
    Device:
      type: object
      properties:
        id:
          type: string
          readOnly: true
        name:
          type: string
        owner:
          type: string
      required:
        - id
        - name
        - owner

This works fine for a POST request's body. However, if I want to use this schema for a PATCH request's body, it wouldn't make sense as now the request body is required to have all properties in it. So, my question is, is it possible to make a schema that inherits from this schema, but with all required properties optional?

  • HKosova's avatar
    HKosova
    5 years ago

    Required properties of a base schema cannot be made optional. In other words, you can only add constraints but not remove them.

     

    You need to do it the other way round - define a base schema with optional properties, then "inherit" from that schema and mark the properties in question as required.

    components:
      schemas:
        # Schema for PATCH
        BaseDevice:
          type: object
          properties:
            id:
              type: string
              readOnly: true
            name:
              type: string
            owner:
              type: string
    
        # Schema for POST
        Device:
          allOf:
            - $ref: '#/components/schemas/BaseDevice'
          required:
            - id
            - name
            - owner
  • GeoExplorer's avatar
    GeoExplorer
    New Contributor

    While looking for same answer I've found your post. Did you fond an answer what's the best practice to define PATCH?

    • HKosova's avatar
      HKosova
      SmartBear Alumni (Retired)

      Required properties of a base schema cannot be made optional. In other words, you can only add constraints but not remove them.

       

      You need to do it the other way round - define a base schema with optional properties, then "inherit" from that schema and mark the properties in question as required.

      components:
        schemas:
          # Schema for PATCH
          BaseDevice:
            type: object
            properties:
              id:
                type: string
                readOnly: true
              name:
                type: string
              owner:
                type: string
      
          # Schema for POST
          Device:
            allOf:
              - $ref: '#/components/schemas/BaseDevice'
            required:
              - id
              - name
              - owner