<!-- json
{
  "sourceId": "core-openapi-spec-pipeline",
  "repositoryId": "travetto",
  "filePath": "openapi.yml",
  "capabilityTags": ["openapi", "pipeline", "ci"],
  "operationIds": ["openapi-spec-pipeline"],
  "applicability": ["framework-native"],
  "notes": [
    "Generate OpenAPI specs in CI and publish them as artifacts for downstream consumption."
  ]
}
-->

# core-openapi-spec-pipeline

- Source: `openapi.yml`
- Capability tags: openapi, pipeline, ci
- Applicability: framework-native
- Notes:
  - Generate OpenAPI specs in CI and publish them as artifacts for downstream consumption.

## Reference Code

```yaml
openapi: 3.1.0
info:
  title: "@travetto/mono-repo"
  version: 0.0.0
tags:
  - name: Auth
    description: Auth API
  - name: Todo
paths:
  /auth/login:
    post:
      tags:
        - Auth
      responses:
        "201":
          content: {}
          description: ""
      operationId: AuthController_login
      parameters: []
  /auth/logout:
    get:
      tags:
        - Auth
      responses:
        "201":
          content: {}
          description: ""
      operationId: AuthController_logout
      parameters: []
  /auth/self:
    get:
      tags:
        - Auth
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PrincipalSchema"
          description: ""
      operationId: AuthController_getSelf
      parameters: []
  /todo:
    delete:
      tags:
        - Todo
      responses:
        "201":
          content: {}
          description: ""
      summary: Delete all todos
      description: Delete all todos
      operationId: TodoController_deleteAllCompleted
      parameters: []
    get:
      tags:
        - Todo
      responses:
        "200":
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Todo"
          description: ""
      summary: Get all todos
      description: Get all todos
      operationId: TodoController_getAll
      parameters:
        - name: q
          schema:
            type: string
          required: false
          in: query
        - name: offset
          schema:
            type: number
          required: false
          in: query
        - name: limit
          schema:
            type: number
          required: false
          in: query
    post:
      tags:
        - Todo
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Todo"
          description: ""
      summary: Create a todo
      description: Create a todo
      operationId: TodoController_create
      parameters: []
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TodoRequest__51797"
        description: Todo request
  /todo/{id}:
    delete:
      tags:
        - Todo
      responses:
        "201":
          content: {}
          description: ""
      summary: Delete a todo
      description: Delete a todo
      operationId: TodoController_remove
      parameters:
        - in: path
          name: id
          description: Todo id
          required: true
          schema:
            type: string
    get:
      tags:
        - Todo
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Todo"
          description: ""
      summary: Get Todo by id
      description: Get Todo by id
      operationId: TodoController_getById
      parameters:
        - in: path
          name: id
          description: Todo id
          required: true
          schema:
            type: string
    put:
      tags:
        - Todo
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Todo"
          description: ""
      summary: Update a todo
      description: Update a todo
      operationId: TodoController_update
      parameters:
        - in: path
          name: id
          description: Todo id
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TodoRequest__51797"
        description: Todo request
  /todo/{id}/complete:
    put:
      tags:
        - Todo
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Todo"
          description: ""
      summary: Complete a todo
      description: Complete a todo
      operationId: TodoController_complete
      parameters:
        - in: path
          name: id
          description: Todo id
          required: true
          schema:
            type: string
        - in: query
          name: completed
          required: false
          schema:
            type: boolean
components:
  schemas:
    PrincipalSchema:
      properties:
        id:
          type: string
        details:
          type: object
        expiresAt:
          format: date-time
          type: string
        issuedAt:
          format: date-time
          type: string
        issuer:
          type: string
        sessionId:
          type: string
        permissions:
          type: array
          items:
            type: string
      required:
        - id
        - details
    Todo:
      properties:
        id:
          type: string
        text:
          type: string
        created:
          format: date-time
          type: string
        completed:
          type: boolean
        priority:
          type: number
        who:
          type: string
        color:
          type: string
      required:
        - text
    TodoRequest__51797:
      description: Todo request
      examples: []
      properties:
        text:
          type: string
        created:
          format: date-time
          type: string
        completed:
          type: boolean
        priority:
          type: number
        who:
          type: string
        color:
          type: string
      required:
        - text
```
