Gaurav Jeswani
Gaurav Jeswani

Reputation: 4582

How to re-use pattern in Swagger

In my Swagger documentation, I have to use same pattern multiple time. Currently, it is placed duplicated.

One thing I improved is that making common parameter (by declaring it inside components). But couldn't find anything to avoid this duplicate pattern between parameters and schemas.

Is there any way, I can use declare this pattern once and re-use it wherever it's needed?

My Swagger looks something like:

openapi: 3.0.3
info:
  title: My System
  description: Self contained system
  version: 1.0.0
servers:
  - url: /a/{aId}/
    description: Contains the partition
security:
  - bearerAuth: []
paths:
  
  "/x/{xId}/y/{yId}/z/{zId}":
    get:
      x-horizon-permission: "geo.floorplan.read"
      tags:
        - myTag
      operationId: getValue
      description: Get Value
      parameters:
        - name: xId
          in: path
          required: true
          schema:
            type: string
            pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
        - name: yId
          in: path
          required: true
          schema:
            type: string
            pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
        - name: zId
          in: path
          required: true
          schema:
            type: string
            pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
      responses:
        "200":
          description: OK
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/Response'
    patch:
      tags:
        - myTag
      operationId: Update
      description: Update Data
      parameters:
        - name: xId
          in: path
          required: true
          schema:
            type: string
            pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
        - name: yId
          in: path
          required: true
          schema:
            type: string
            pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
        - name: zId
          in: path
          required: true
          schema:
            type: string
            pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
      requestBody:
        required: true
        content:
          application/vnd.api+json:
            schema:
              $ref: '#/components/schemas/Request'
      responses:
        "200":
          description: OK
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/Response'

  
components:
  schemas:
    Request:
      type: object
      properties:
        data:
          type: object
          properties:
            type:
              type: string
            id:
              type: string
              pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
    
    Response:
      type: object
      properties:
        links:
          type: object
          properties:
            self:
              type: string
        data:
          $ref: '#/components/schemas/Data'
    
    Data:
      type: object
      properties:
        type:
          type: string
        id:
          type: string
          pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
          
    GeometryError:
      type: object
      required:
        - code
        - status
        - title
      properties:
        id:
          type: string
          pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
        status:
          type: string
          example: 400
        title:
          type: string
        detail:
          type: string
        meta:
          type: object      
  
  
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

Upvotes: 1

Views: 626

Answers (1)

Helen
Helen

Reputation: 97590

Define a schema with this pattern:

components:
  schema:
    UUID:
      type: string
      format: uuid  # for tools/codegens that have built-in support for UUIDs
      pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'

Then you can reference this schema from other schemas and parameter definitions:

      parameters:
        - name: xId
          in: path
          required: true
          schema:
            $ref: '#/components/schemas/UUID'   # <-----
        - name: yId
          in: path
          required: true
          schema:
            $ref: '#/components/schemas/UUID'   # <-----
...

  schemas:
    Request:
      type: object
      properties:
        data:
          type: object
          properties:
            type:
              type: string
            id:
              $ref: '#/components/schemas/UUID'   # <-----

Upvotes: 2

Related Questions