openapi: 3.0.0
info:
  title: 'Link Example'
  version: 1.0.0
paths:
  '/2.0/repositories/{username}':
    get:
      operationId: getRepositoriesByOwner
      parameters:
        -
          name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'repositories owned by the supplied user'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/repository'
          links:
            userRepository:
              $ref: '#/components/links/UserRepository'
  '/2.0/repositories/{username}/{slug}':
    get:
      operationId: getRepository
      parameters:
        -
          name: username
          in: path
          required: true
          schema:
            type: string
        -
          name: slug
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'The repository'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/repository'
          links:
            repositoryPullRequests:
              $ref: '#/components/links/RepositoryPullRequests'
  '/2.0/repositories/{username}/{slug}/pullrequests':
    get:
      operationId: getPullRequestsByRepository
      parameters:
        -
          name: username
          in: path
          required: true
          schema:
            type: string
        -
          name: slug
          in: path
          required: true
          schema:
            type: string
        -
          name: state
          in: query
          schema:
            type: string
            enum:
              - open
              - merged
              - declined
      responses:
        '200':
          description: 'an array of pull request objects'
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/pullrequest'
  '/2.0/repositories/{username}/{slug}/pullrequests/{pid}':
    get:
      operationId: getPullRequestsById
      parameters:
        -
          name: username
          in: path
          required: true
          schema:
            type: string
        -
          name: slug
          in: path
          required: true
          schema:
            type: string
        -
          name: pid
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'a pull request object'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/pullrequest'
          links:
            pullRequestMerge:
              $ref: '#/components/links/PullRequestMerge'
  '/2.0/repositories/{username}/{slug}/pullrequests/{pid}/merge':
    post:
      operationId: mergePullRequest
      parameters:
        -
          name: username
          in: path
          required: true
          schema:
            type: string
        -
          name: slug
          in: path
          required: true
          schema:
            type: string
        -
          name: pid
          in: path
          required: true
          schema:
            type: string
      responses:
        '204':
          description: 'the PR was successfully merged'
  '/2.0/users/{username}':
    get:
      operationId: getUserByName
      parameters:
        -
          name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: 'The User'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/user'
          links:
            userRepositories:
              $ref: '#/components/links/UserRepositories'
components:
  schemas:
    pullrequest:
      properties:
        id:
          type: integer
        title:
          type: string
        repository:
          $ref: '#/components/schemas/repository'
        author:
          $ref: '#/components/schemas/user'
      type: object
    repository:
      properties:
        slug:
          type: string
        owner:
          $ref: '#/components/schemas/user'
      type: object
    user:
      properties:
        username:
          type: string
        uuid:
          type: string
      type: object
  links:
    UserRepositories:
      operationId: getRepositoriesByOwner
      parameters:
        username: '$response.body#/username'
    UserRepository:
      operationId: getRepository
      parameters:
        username: '$response.body#/owner/username'
        slug: '$response.body#/slug'
    RepositoryPullRequests:
      operationId: getPullRequestsByRepository
      parameters:
        username: '$response.body#/owner/username'
        slug: '$response.body#/slug'
    PullRequestMerge:
      operationId: mergePullRequest
      parameters:
        username: '$response.body#/author/username'
        slug: '$response.body#/repository/slug'
        pid: '$response.body#/id'