openapi: 3.0.1
info:
  description: >-
    This is a sample server Petstore server. For this sample, you can use the
    api key `special-key` to test the authorization filters.
  license:
    name: Apache-2.0
    url: 'https://www.apache.org/licenses/LICENSE-2.0.html'
  title: OpenAPI Petstore
  version: 1.0.0
servers:
  - url: 'http://localhost:3002'
tags:
  - description: Everything about your Pets
    name: pet
  - description: Access to Petstore orders
    name: store
  - description: Operations about user
    name: user
paths:
  /pet:
    post:
      operationId: addPet
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
          application/xml:
            schema:
              $ref: '#/components/schemas/Pet'
        description: Pet object that needs to be added to the store
        required: true
      responses:
        '405':
          content: {}
          description: Invalid input
      security:
        - petstore_auth:
            - 'write:pets'
            - 'read:pets'
      summary: Add a new pet to the store
      tags:
        - pet
      x-codegen-request-body-name: body
      x-eov-operation-handler: controllers/PetController
    put:
      operationId: updatePet
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
          application/xml:
            schema:
              $ref: '#/components/schemas/Pet'
        description: Pet object that needs to be added to the store
        required: true
      responses:
        '400':
          content: {}
          description: Invalid ID supplied
        '404':
          content: {}
          description: Pet not found
        '405':
          content: {}
          description: Validation exception
      security:
        - petstore_auth:
            - 'write:pets'
            - 'read:pets'
      summary: Update an existing pet
      tags:
        - pet
      x-codegen-request-body-name: body
      x-eov-operation-handler: controllers/PetController
  /pet/findByStatus:
    get:
      description: Multiple status values can be provided with comma separated strings
      operationId: findPetsByStatus
      parameters:
        - description: Status values that need to be considered for filter
          explode: false
          in: query
          name: status
          required: true
          schema:
            items:
              default: available
              enum:
                - available
                - pending
                - sold
              type: string
            type: array
          style: form
      responses:
        '200':
          content:
            application/xml:
              schema:
                items:
                  $ref: '#/components/schemas/Pet'
                type: array
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/Pet'
                type: array
          description: successful operation
        '400':
          content: {}
          description: Invalid status value
      security:
        - petstore_auth:
            - 'read:pets'
      summary: Finds Pets by status
      tags:
        - pet
      x-eov-operation-handler: controllers/PetController
  /pet/findByTags:
    get:
      deprecated: true
      description: >-
        Multiple tags can be provided with comma separated strings. Use tag1,
        tag2, tag3 for testing.
      operationId: findPetsByTags
      parameters:
        - description: Tags to filter by
          explode: false
          in: query
          name: tags
          required: true
          schema:
            items:
              type: string
            type: array
          style: form
      responses:
        '200':
          content:
            application/xml:
              schema:
                items:
                  $ref: '#/components/schemas/Pet'
                type: array
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/Pet'
                type: array
          description: successful operation
        '400':
          content: {}
          description: Invalid tag value
      security:
        - petstore_auth:
            - 'write:pets'
            - 'read:pets'
      summary: Finds Pets by tags
      tags:
        - pet
      x-eov-operation-handler: controllers/PetController
      x-draig-query: 'Pet.query().withGraphJoined(''tags'').whereIn(''tags.name'', tags)'
  '/pet/{petId}':
    delete:
      operationId: deletePet
      parameters:
        - in: header
          name: api_key
          schema:
            type: string
        - description: Pet id to delete
          in: path
          name: petId
          required: true
          schema:
            format: int64
            type: integer
      responses:
        '400':
          content: {}
          description: Invalid pet value
      security:
        - petstore_auth:
            - 'write:pets'
            - 'read:pets'
      summary: Deletes a pet
      tags:
        - pet
      x-eov-operation-handler: controllers/PetController
    get:
      description: Returns a single pet
      operationId: getPetById
      parameters:
        - description: ID of pet to return
          in: path
          name: petId
          required: true
          schema:
            format: int64
            type: integer
      responses:
        '200':
          content:
            application/xml:
              schema:
                $ref: '#/components/schemas/Pet'
            application/json:
              schema:
                $ref: '#/components/schemas/Pet'
          description: successful operation
        '400':
          content: {}
          description: Invalid ID supplied
        '404':
          content: {}
          description: Pet not found
      security:
        - api_key: []
      summary: Find pet by ID
      tags:
        - pet
      x-eov-operation-handler: controllers/PetController
    post:
      operationId: updatePetWithForm
      parameters:
        - description: ID of pet that needs to be updated
          in: path
          name: petId
          required: true
          schema:
            format: int64
            type: integer
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              properties:
                name:
                  description: Updated name of the pet
                  type: string
                status:
                  description: Updated status of the pet
                  type: string
      responses:
        '405':
          content: {}
          description: Invalid input
      security:
        - petstore_auth:
            - 'write:pets'
            - 'read:pets'
      summary: Updates a pet in the store with form data
      tags:
        - pet
      x-eov-operation-handler: controllers/PetController
      x-draig-put: true
  '/pet/{petId}/uploadImage':
    post:
      operationId: uploadFile
      parameters:
        - description: ID of pet to update
          in: path
          name: petId
          required: true
          schema:
            format: int64
            type: integer
      requestBody:
        content:
          multipart/form-data:
            schema:
              properties:
                additionalMetadata:
                  description: Additional data to pass to server
                  type: string
                file:
                  description: file to upload
                  format: binary
                  type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiResponse'
          description: successful operation
      security:
        - petstore_auth:
            - 'write:pets'
            - 'read:pets'
      summary: uploads an image
      tags:
        - pet
      x-eov-operation-handler: controllers/PetController
      x-draig-di-service: upload.image
  /store/inventory:
    get:
      description: Returns a map of status codes to quantities
      operationId: getInventory
      responses:
        '200':
          content:
            application/json:
              schema:
                additionalProperties:
                  format: int32
                  type: integer
                type: object
            application/xml:
              schema:
                additionalProperties:
                  format: int32
                  type: integer
                type: object
          description: successful operation
      security:
        - api_key: []
      summary: Returns pet inventories by status
      tags:
        - store
      x-eov-operation-handler: controllers/StoreController
      x-draig-query: |
        Order.query().select('status').count().groupBy('status') 
      x-draig-transform: |
        rows.reduce((i, e) => ({ ...i, [e.status]: Number(e.count) }), {})
  /store/order:
    post:
      operationId: placeOrder
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Order'
        description: order placed for purchasing the pet
        required: true
      responses:
        '200':
          content:
            application/xml:
              schema:
                $ref: '#/components/schemas/Order'
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
          description: successful operation
        '400':
          content: {}
          description: Invalid Order
      summary: Place an order for a pet
      tags:
        - store
      x-codegen-request-body-name: body
      x-eov-operation-handler: controllers/StoreController
  '/store/order/{orderId}':
    delete:
      description: >-
        For valid response try integer IDs with value < 1000. Anything above
        1000 or nonintegers will generate API errors
      operationId: deleteOrder
      parameters:
        - description: ID of the order that needs to be deleted
          in: path
          name: orderId
          required: true
          schema:
            type: string
      responses:
        '400':
          content: {}
          description: Invalid ID supplied
        '404':
          content: {}
          description: Order not found
      summary: Delete purchase order by ID
      tags:
        - store
      x-eov-operation-handler: controllers/StoreController
      x-draig-model: Order
    get:
      description: >-
        For valid response try integer IDs with value <= 5 or > 10. Other values
        will generated exceptions
      operationId: getOrderById
      parameters:
        - description: ID of pet that needs to be fetched
          in: path
          name: orderId
          required: true
          schema:
            format: int64
            maximum: 5
            minimum: 1
            type: integer
      responses:
        '200':
          content:
            application/xml:
              schema:
                $ref: '#/components/schemas/Order'
            application/json:
              schema:
                $ref: '#/components/schemas/Order'
          description: successful operation
        '400':
          content: {}
          description: Invalid ID supplied
        '404':
          content: {}
          description: Order not found
      summary: Find purchase order by ID
      tags:
        - store
      x-eov-operation-handler: controllers/StoreController
  /user:
    post:
      description: This can only be done by the logged in user.
      operationId: createUser
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
        description: Created user object
        required: true
      responses:
        default:
          content: {}
          description: successful operation
      summary: Create user
      tags:
        - user
      x-codegen-request-body-name: body
      x-eov-operation-handler: controllers/UserController
  /user/createWithArray:
    post:
      operationId: createUsersWithArrayInput
      requestBody:
        content:
          application/json:
            schema:
              items:
                $ref: '#/components/schemas/User'
              type: array
        description: List of user object
        required: true
      responses:
        default:
          content: {}
          description: successful operation
      summary: Creates list of users with given input array
      tags:
        - user
      x-codegen-request-body-name: body
      x-eov-operation-handler: controllers/UserController
  /user/createWithList:
    post:
      operationId: createUsersWithListInput
      requestBody:
        content:
          application/json:
            schema:
              items:
                $ref: '#/components/schemas/User'
              type: array
        description: List of user object
        required: true
      responses:
        default:
          content: {}
          description: successful operation
      summary: Creates list of users with given input array
      tags:
        - user
      x-codegen-request-body-name: body
      x-eov-operation-handler: controllers/UserController
  /user/login:
    get:
      operationId: loginUser
      parameters:
        - description: The user name for login
          in: query
          name: username
          required: true
          schema:
            type: string
        - description: The password for login in clear text
          in: query
          name: password
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/xml:
              schema:
                type: string
            application/json:
              schema:
                type: string
          description: successful operation
          headers:
            X-Rate-Limit:
              description: calls per hour allowed by the user
              schema:
                format: int32
                type: integer
            X-Expires-After:
              description: date in UTC when toekn expires
              schema:
                format: date-time
                type: string
        '400':
          content: {}
          description: Invalid username/password supplied
      summary: Logs user into the system
      tags:
        - user
      x-eov-operation-handler: controllers/UserController
      x-draig-model: User
  /user/logout:
    get:
      operationId: logoutUser
      responses:
        default:
          content: {}
          description: successful operation
      summary: Logs out current logged in user session
      tags:
        - user
      x-eov-operation-handler: controllers/UserController
      x-draig-di-service: logout
  '/user/{username}':
    delete:
      description: This can only be done by the logged in user.
      operationId: deleteUser
      parameters:
        - description: The name that needs to be deleted
          in: path
          name: username
          required: true
          schema:
            type: string
      responses:
        '400':
          content: {}
          description: Invalid username supplied
        '404':
          content: {}
          description: User not found
      summary: Delete user
      tags:
        - user
      x-eov-operation-handler: controllers/UserController
    get:
      operationId: getUserByName
      parameters:
        - description: The name that needs to be fetched. Use user1 for testing.
          in: path
          name: username
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/xml:
              schema:
                $ref: '#/components/schemas/User'
            application/json:
              schema:
                $ref: '#/components/schemas/User'
          description: successful operation
        '400':
          content: {}
          description: Invalid username supplied
        '404':
          content: {}
          description: User not found
      summary: Get user by user name
      tags:
        - user
      x-eov-operation-handler: controllers/UserController
    put:
      description: This can only be done by the logged in user.
      operationId: updateUser
      parameters:
        - description: username of the to be updated
          in: path
          name: username
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
        description: Updated user object
        required: true
      responses:
        '400':
          content: {}
          description: Invalid user supplied
        '404':
          content: {}
          description: User not found
      summary: Updated user
      tags:
        - user
      x-codegen-request-body-name: body
      x-eov-operation-handler: controllers/UserController
components:
  schemas:
    Order:
      x-draig-tableName: orders
      description: An order for a pets from the pet store
      example:
        pet_id: 6
        quantity: 1
        id: 0
        shipDate: 2000-01-23T04:56:07.000Z
        complete: false
        status: placed
      properties:
        id:
          format: int64
          type: integer
        pet:
          $ref: '#/components/schemas/Pet'
        quantity:
          format: int32
          type: integer
        shipDate:
          format: date-time
          type: string
        status:
          description: Order Status
          enum:
            - placed
            - approved
            - delivered
          type: string
        complete:
          default: false
          type: boolean
      title: Pet Order
      type: object
      xml:
        name: Order
    Category:
      x-draig-tableName: categories
      description: A category for a pet
      example:
        name: name
        id: 6
      properties:
        id:
          format: int64
          type: integer
        name:
          type: string
      title: Pet category
      type: object
      xml:
        name: Category
    User:
      x-draig-tableName: users
      description: A User who is purchasing from the pet store
      example:
        firstName: firstName
        lastName: lastName
        password: password
        userStatus: 6
        phone: phone
        id: 0
        email: email
        username: username
      properties:
        id:
          format: int64
          type: integer
        username:
          type: string
          x-draig-sch-unique: true
        firstName:
          type: string
        lastName:
          type: string
        email:
          type: string
        password:
          type: string
        phone:
          type: string
        userStatus:
          description: User Status
          format: int32
          type: integer
      title: a User
      type: object
      xml:
        name: User
    Tag:
      x-draig-tableName: tags
      description: A tag for a pet
      example:
        name: name
        id: 1
      properties:
        id:
          format: int64
          type: integer
        name:
          type: string
      title: Pet Tag
      type: object
      xml:
        name: Tag
    Pet:
      x-draig-tableName: pets
      description: A pet for sale in the pet store
      example:
        photoUrls:
          - photoUrls
          - photoUrls
        name: doggie
        id: 0
        category:
          name: name
          id: 6
        tags:
          - name: name
            id: 1
          - name: name
            id: 1
        status: available
      properties:
        id:
          format: int64
          type: integer
        category:
          $ref: '#/components/schemas/Category'
        name:
          example: doggie
          type: string
        photoUrls:
          items:
            type: string
          type: array
          xml:
            name: photoUrl
            wrapped: true
        tags:
          items:
            $ref: '#/components/schemas/Tag'
          type: array
          xml:
            name: tag
            wrapped: true
        status:
          description: pet status in the store
          enum:
            - available
            - pending
            - sold
          type: string
      required:
        - name
        - photoUrls
      title: a Pet
      type: object
      xml:
        name: Pet
    ApiResponse:
      description: Describes the result of uploading an image resource
      example:
        code: 0
        type: type
        message: message
      properties:
        code:
          format: int32
          type: integer
        type:
          type: string
        message:
          type: string
      title: An uploaded response
      type: object
  securitySchemes:
    petstore_auth:
      type: oauth2
      x-draig-auth-usermodel: User
      flows:
        authorizationCode:
          #NodeJS Oauth server
          #authorizationUrl: 'http://localhost:3000/oauth/authenticate'
          #tokenUrl: 'http://localhost:3000/oauth/access_token'
          #SpringBoot Oauth server: supports implicit flow
          #authorizationUrl: 'http://localhost:8080/api/oauth/dialog'
          #Own oauth server: supports only authorization code grant
          authorizationUrl: '/oauth/authorize'
          tokenUrl: '/oauth/token'
          #TBD
          #oauth2orize: supports authorization code grant adding cors module
          #authorizationUrl: 'http://localhost:3000/dialog/authorize'
          #tokenUrl: 'http://localhost:3000/oauth/token'
          #Oauth-example: support authorization code grant
          #authorizationUrl: 'http://localhost:3030/oauth'
          #tokenUrl: 'http://localhost:3030/oauth/token'
          scopes:
            'write:pets': modify pets in your account
            'read:pets': read your pets
    api_key:
      in: header
      name: api_key
      type: apiKey
      x-draig-auth-handler: AuthHandler
