swagger: "2.0"
info: { version: "", title: "" }

paths:
  /jobs:
    get:
      tags: [ "jobs" ]
      summary: "List jobs"
      operationId: "listJobs"
      responses:
        "200":
          description: "successful operation"
          schema: { type: array, items: { $ref: "#/definitions/JobResponse" } }
          examples:
            test:
              - id: "b81c2366-ea37-43d2-b61b-03afdc21d985"
                automation: "hash.sha1"
                payload: "test"
                status: "created"
      security: [ { roles: [ "job:read" ] } ]
    post:
      tags: [ "jobs" ]
      summary: "Start a new job"
      operationId: "runJob"
      parameters:
        - { name: "job", in: "body", description: "New job", required: true, schema: { $ref: "#/definitions/JobForm" }, x-example: { automation: "hash.sha1", payload: "test" } }
      responses:
        "200":
          description: "successful operation"
          schema: { $ref: "#/definitions/JobResponse" }
          examples:
            test: { id: "87390749-2125-4a87-91c5-da7e3f9bebf1", automation: "hash.sha1", payload: "test", status: "created" }
      security: [ { roles: [ "job:write" ] } ]

  /jobs/{id}:
    get:
      tags: [ "jobs" ]
      summary: "Get a single job"
      operationId: "getJob"
      parameters:
        - { name: "id", in: "path", description: "Job ID", required: true, type: string, x-example: "b81c2366-ea37-43d2-b61b-03afdc21d985" }
      responses:
        "200":
          description: "successful operation"
          schema: { $ref: "#/definitions/JobResponse" }
          examples:
            test: { id: "b81c2366-ea37-43d2-b61b-03afdc21d985", automation: "hash.sha1", payload: "test", status: "created" }
      security: [ { roles: [ "job:read" ] } ]
    put:
      tags: [ "jobs" ]
      summary: "Update an existing job"
      operationId: "updateJob"
      parameters:
        - { name: "id", in: "path", description: "Job ID", required: true, type: string, x-example: "b81c2366-ea37-43d2-b61b-03afdc21d985" }
        - { name: "job", in: "body", description: "Job object that needs to be added", required: true, schema: { $ref: "#/definitions/JobUpdate" }, x-example: { status: "failed", running: false } }
      responses:
        "200":
          description: "successful operation"
          schema: { $ref: "#/definitions/JobResponse" }
          examples:
            test: { id: "b81c2366-ea37-43d2-b61b-03afdc21d985", automation: "hash.sha1", payload: "test", status: "failed" }

      security: [ { roles: [ "job:write" ] } ]

definitions:
  Message:
    type: object
    properties:
      payload: { }
      secrets: { type: object, additionalProperties: { type: string } }
      context: { $ref: "#/definitions/Context" }

  Context:
    type: object
    properties:
      artifact: { $ref: "#/definitions/Artifact" }
      playbook: { $ref: "#/definitions/PlaybookResponse" }
      task: { $ref: "#/definitions/TaskResponse" }
      ticket: { $ref: "#/definitions/TicketResponse" }

  Origin:
    type: object
    properties:
      task_origin: { $ref: "#/definitions/TaskOrigin" }
      artifact_origin: { $ref: "#/definitions/ArtifactOrigin" }

  TaskOrigin:
    type: object
    required: [ ticket_id, playbook_id, task_id ]
    properties:
      ticket_id: { type: integer, format: int64 }
      playbook_id: { type: string }
      task_id: { type: string }

  ArtifactOrigin:
    type: object
    required: [ ticket_id, artifact ]
    properties:
      ticket_id: { type: integer, format: int64 }
      artifact: { type: string }

  JobForm:
    type: object
    required: [ automation ]
    properties:
      automation: { type: string }
      payload: { }
      origin: { $ref: "#/definitions/Origin" }

  JobUpdate:
    type: object
    required: [ running, status ]
    properties:
      container: { type: string }
      running: { type: boolean }
      status: { type: string }
      log: { type: string }
      output: { type: object }

  Job:
    type: object
    required: [ automation, running, status ]
    properties:
      automation: { type: string }
      container: { type: string }
      payload: { }
      running: { type: boolean }
      status: { type: string }
      log: { type: string }
      output: { type: object }
      origin: { $ref: "#/definitions/Origin" }

  JobResponse:
    type: object
    required: [ id, automation, status ]
    properties:
      id: { type: string }
      automation: { type: string }
      container: { type: string }
      status: { type: string }
      payload: { }
      log: { type: string }
      output: { type: object }
      origin: { $ref: "#/definitions/Origin" }
