Search code examples
swaggerswagger-2.0swagger-editor

How to specify subset of model properties in swagger API route documentation


Working on writing an API spec for my service with swagger. I'm using a model definition ('#/definitions/prototype') as the body parameter of both the POST /prototypes and PATCH /prototypes/:id routes.

How do you specify that the PATCH route only accepts a subset of the properties in the body of the request that the POST route does? For example, I want the PATCH /instances/:id route to only allow modification of the mobileDeviceId prototypes property.

swagger: "2.0"
info:
  title: ""
  description: ""
  version: "1.0.0"
host: foo.example.com
schemes:
  - https
basePath: /v1
produces:
  - application/json
consumes:
  - application/json
paths:
  /prototypes:
    post:
      summary: Create new prototype
      parameters:
        - name: prototype
          in: body
          description: Prototype object
          required: true
          schema:
            $ref: "#/definitions/Prototype"
      responses:
        201:
          description: Success
          schema:
            $ref: "#/definitions/SuccessCreated"
        403:
          description: Prototype limit exceeded error
          schema:
            $ref: "#/definitions/Error"
        default:
          description: Unexpected error
          schema:
            $ref: "#/definitions/Error"
  /prototypes/{id}:
    patch:
      summary: Update an existing prototype's properties
      parameters:
        - name: id
          in: path
          type: number
          description: ID property of a prototype
          required: true
        - name: prototype
          in: body
          description: Prototype object
          required: true
          schema:
            $ref: "#/definitions/Prototype"
      responses:
        200:
          description: Success
definitions:
  Prototype:
    type: object
    properties:
      id:
        type: integer
        format: int64
      name:
        type: string
      mobileDeviceId:
        type: number
  SuccessCreated:
    type: object
    description: Returned as response to successful resource create request
    properties:
      code:
        type: number
        default: 201
      message:
        type: string
  Error:
    type: object
    properties:
      code:
        type: integer
        format: int32
      message:
        type: string
      fields:
        type: string

Solution

  • Swagger uses json-schema: http://json-schema.org $refs provide you w/ a way to repeat existing json-schema at a new path. Notice that you are using a $ref for patch/parameters/-name:prototype/schema. You can create a new definition just for patch in the definitions section and reference it instead

    swagger: "2.0"
    info:
      title: ""
      description: ""
      version: "1.0.0"
    host: foo.example.com
    schemes:
      - https
    basePath: /v1
    produces:
      - application/json
    consumes:
      - application/json
    paths:
      /prototypes:
        post:
          summary: Create new prototype
          parameters:
            - name: prototype
              in: body
              description: Prototype object
              required: true
              schema:
                $ref: "#/definitions/Prototype"
          responses:
            201:
              description: Success
              schema:
                $ref: "#/definitions/SuccessCreated"
            403:
              description: Prototype limit exceeded error
              schema:
                $ref: "#/definitions/Error"
            default:
              description: Unexpected error
              schema:
                $ref: "#/definitions/Error"
      /prototypes/{id}:
        patch:
          summary: Update an existing prototype's properties
          parameters:
            - name: id
              in: path
              type: number
              description: ID property of a prototype
              required: true
            - name: prototype
              in: body
              description: Prototype object
              required: true
              schema:
                $ref: "#/definitions/PatchPrototype"
          responses:
            200:
              description: Success
    definitions:
      Prototype:
        type: object
        properties:
          id:
            type: integer
            format: int64
          name:
            type: string
          mobileDeviceId:
            type: number
      PatchPrototype:
        type: object
        properties:
          mobileDeviceId:
            type: number
      SuccessCreated:
        type: object
        description: Returned as response to successful resource create request
        properties:
          code:
            type: number
            default: 201
          message:
            type: string
      Error:
        type: object
        properties:
          code:
            type: integer
            format: int32
          message:
            type: string
          fields:
            type: string