swagger: "2.0"

info:
  version: 1.0.0
  title: API Specifications

schemes:
  - https
host: qa-ows-vectororder.theorchard.io
paths:
  /hello/:
    get:
      summary: "Check the health of the application."
      responses:
        200:
          description: "200 OK"
          examples:
            application/json: { "status": "ok" }
  /priorities:
    get:
      summary: "Get possible priorities for a Vector order: ID and title."
      responses:
        200:
          description: "200 OK"
          examples:
            application/json: {
              "items": [
                {"priority_id": 3, "title": "Low"},
                {"priority_id": 2, "title": "Normal"},
                {"priority_id": 1, "title": "High"},
              ]
            }
  /statuses:
    get:
      summary: "Get possible Vector order statuses by category."
      responses:
        200:
          description: "200 OK"
          examples:
            application/json: {
              "wait": {
                "title": "Waiting",
                "statuses": [
                  "new"
                ]
              },
              "error": {
                "title": "Error",
                "statuses": [
                  "failed_validation",
                  "metadata_missing"
                ]
              }
            }
  /encoders:
    get:
      summary: "Get possible encoders for Vector orders: ID and title."
      responses:
        200:
          description: "200 OK"
          examples:
            application/json: {
              "items": [
                {"encoder_id": 10, "title": "Vector 1"},
                {"encoder_id": 17, "title": "Video Encoder"},
                {"encoder_id": 18, "title": "Vector 2.5"},
                {"encoder_id": 19, "title": "Vector 2.5 Hard Drive"},
                {"encoder_id": 23, "title": "Vector Bulk Feeds"},
              ]
            }
  /encoding-statuses:
    get:
      summary: "Get possible encoders statuses."
      responses:
        200:
          description: "200 OK"
          examples:
            application/json: {
              "N": "No",
              "Y": "Yes",
              "S": "Suspended"
            }
  /delivery-statuses:
    get:
      summary: "Get possible delivery statuses."
      responses:
        200:
          description: "200 OK"
          examples:
            application/json: {
              "N": "No",
              "Y": "Yes",
              "S": "Suspended"
            }
  /jobs/status:
    put:
      summary: "Perform Vector order queue action."
      parameters:
        - in: body
          name: body
          schema:
            $ref: '#/definitions/PutJobsStatusRequest'
      responses:
        '204':
          description: "Action succeeded."
        '500':
          description: "500 Internal server error"
          schema:
            properties:
              code:
                type: string
              message:
                type: string
            required:
              - message
              - code
            type: object
            example:
              {
                "code": "server_error",
                "message": "Unhandled exception"
              }
  /jobs/<int:job_id>/eligibility:
    get:
      summary: "Get the eligibility of a Vector job."
      parameters:
        - in: path
          name: job_id
          type: integer
          required: true
      responses:
        '200':
          description: "Eligibility assessment completed successfully."
          schema:
            properties:
              is_eligible:
                type: boolean
              reason:
                type: string
                description: "When not eligible, the reason why, otherwise null."
                nullable: true
            required:
              - is_eligible
              - reason
            type: object
            example:
              {
                "is_eligible": true,
                "reason": null
              }
  /jobs/<int:job_id>/delivery-file-download:
    get:
      summary: "Get a delivery XML of a Vector job."
      parameters:
        - in: path
          name: job_id
          type: integer
          required: true
      responses:
        '200':
          description: "Delivery XML file found and retrievable"
          schema:
            properties:
              presigned_link:
                type: string
                description: "S3 presigned link to delivery XML file"
            required:
              - presigned_link
            type: object
            example:
              {
                "presigned_link": "https://my-bucket.s3.amazonaws.com/test/file.jpg"
              }
        '404':
          description: 404 Job or file not found or non-retrievable
          schema:
            properties:
              code:
                type: string
              message:
                type: string
            required:
              - message
              - code
            type: object
            example:
              {
                "code": "not_found_error",
                "message": "Job with id 1 not found"
              }
        '500':
          description: 500 Internal server error
          schema:
            properties:
              code:
                type: string
              message:
                type: string
            required:
              - message
              - code
            type: object
            example:
              {
                "code": "server_error",
                "message": "Unhandled exception"
              }
  /orders/{order_id}:
    get:
      summary: "Get vector order general information. Use 'GET /orders/<order_id>/products' to get details."
      parameters:
        - in: path
          name: order_id
          type: integer
          required: true
        - in: query
          name: stores
          type: boolean
          required: false
      responses:
        '200':
          description: 200 OK
          schema:
            $ref: '#/definitions/VectorOrderResponse'
            example:
              {
                "order_id": "101",
                "user_id": 123,
                "created_at": "2016-04-21T17:36:16",
                "priority": 2,
                "encoder_id": 2,
                "meta_update": true,
                "stores": [1, 286]
              }
        '404':
          description: 404 Order not found
          schema:
            properties:
              code:
                type: string
              message:
                type: string
            required:
              - message
              - code
            type: object
            example:
              {
                "code": "not_found_error",
                "message": "Order not found for provided order id"
              }
        '500':
          description: 500 Internal server error
          schema:
            properties:
              code:
                type: string
              message:
                type: string
            required:
              - message
              - code
            type: object
            example:
              {
                "code": "server_error",
                "message": "Unhandled exception"
              }
  /orders:
    get:
      summary: "Get general information for multiple Vector orders."
      parameters:
        - in: query
          name: stores
          type: boolean
          required: false
        - in: query
          name: order_id
          type: string
          required: true
      responses:
        '200':
          description: 200 OK
          schema:
            type: object
            properties:
              items:
                type: array
                description: "A list of Vector orders."
                items:
                  $ref: '#/definitions/VectorOrderResponse'
            example:
              {
                "items": [
                  {
                    "order_id": "101",
                    "user_id": 123,
                    "created_at": "2016-04-21T17:36:16",
                    "priority": 2,
                    "encoder_id": 2,
                    "meta_update": true,
                    "stores": [1, 286]
                  }
                ]
              }
        '500':
          description: 500 Internal server error
          schema:
            properties:
              code:
                type: string
              message:
                type: string
            required:
              - message
              - code
            type: object
            example:
              {
                "code": "server_error",
                "message": "Unhandled exception"
              }
  /jobs/search:
    post:
      summary: "Perform search requests to ES, look for jobs (vector order details)."
      parameters:
        - in: query
          name: request_id
          type: string
          description: One of the previous request IDs to execute
          required: false
        - in: query
          name: page_offset
          type: integer
          description: Row index page starts from
          required: false
        - in: query
          name: page_limit
          type: integer
          description: Rows count per page
          required: false
        - in: query
          name: order_by
          type: string
          pattern: ^\w+(?:,\w+)*$
          description: Comma-delimited set of sort order fields
          required: false
          items:
            type: string
            example:
              - order_id
              - status
        - in: body
          name: body
          schema:
            $ref: '#/definitions/PostJobsSearchRequest'
      responses:
        '200':
          description: 200 OK
          schema:
            $ref: '#/definitions/PostJobsSearchResponse'
definitions:
  VectorOrderResponse:
    type: object
    properties:
      order_id:
        type: string
        description: Order ID.
      user_id:
        type: integer
        description: Order created by (user ID).
      created_at:
        type: string
        description: Order create date.
      priority:
        type: integer
        description: Order priority.
      encoder_id:
        type: integer
        description: Order encoder ID.
      meta_update:
        type: boolean
        description: Metadata update flag.
      stores:
        type: array
        description: List of store ID.
        items:
          type: integer
    required:
      - order_id
      - user_id
      - created_at
      - priority
      - encoder_id
      - meta_update
  PutJobsStatusRequest:
    type: object
    properties:
      job_ids:
        description: "Vector order job IDs."
        type: array
        items:
          type: integer
        example:
          - 123
          - 456
      action:
        description: "Action to perform on Vector order jobs."
        type: string
        example: "cancel"
    required:
     - job_ids
     - action
  PostJobsSearchRequest:
    type: object
    properties:
      types:
        description: Metadata update order or not.
        type: array
        items:
          type: string
        example:
          - delivery
          - meta_update
      priorities:
        description: Order priorities (1/2/3).
        type: array
        items:
          type: integer
        example:
          - 1
          - 2
      display_upcs:
        description: Order detail (job) display UPCs.
        type: array
        items:
          type: string
      product_ids:
        description: Order detail (job) product IDs.
        type: array
        items:
          type: integer
      order_ids:
        description: Order IDs.
        type: array
        items:
          type: integer
      statuses:
        description: Order detail (job) statuses.
        type: array
        items:
          type: string
        example:
          - new
          - cancelled
      error_log:
        description: Order detail (job) error log.
        type: string
      user_ids:
        description: User who created the order.
        type: array
        items:
          type: integer
      created_at_from:
        description: Order creation date interval - start
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
      created_at_to:
        description: Order creation date interval - end.
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
      encoder_ids:
        description: Order encoder IDs.
        type: array
        items:
          type: integer
      encoding:
        description: Store encoding statuses.
        type: array
        items:
          type: string
        example:
          - Y
          - N
      delivery:
        description: Store delivery statuses.
        type: array
        items:
          type: string
        example:
          - Y
          - S
      store_ids:
        description: Stores which have order detail (job).
        type: array
        items:
          type: integer
      encoding_start_from:
        description: Order detail (job) encoding start date interval - start.
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
      encoding_start_to:
        description: Order detail (job) encoding start date interval - end.
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
      encoding_end_from:
        description: Order detail (job) encoding complete date interval - start.
        type: string
        format: date
        example: "2018-01-02T15:00:01"
      encoding_end_to:
        description: Order detail (job) encoding complete date interval - end.
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
      delivery_start_from:
        description: Order detail (job) delivery start date interval - start.
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
      delivery_start_to:
        description: Order detail (job) delivery start date interval - end.
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
      delivery_end_from:
        description: Order detail (job) delivery complete date interval - start.
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
      delivery_end_to:
        description: Order detail (job) delivery complete date interval - end.
        type: string
        format: date-time
        example: "2018-01-02T15:00:01"
    example: {
      "order_ids": [10000, 10001],
      "types": ["delivery"],
      "priorities": [1, 2],
      "store_ids": [1, 2, 3]
    }
  PostJobsSearchResponse:
    type: object
    properties:
      pagination:
        type: object
        properties:
          type:
            description: Pagination type.
            type: string
            example: "standart"
          page_offset:
            description: The current page offset.
            type: integer
          page_limit:
            description: The current page max records.
            type: integer
          total_records:
            description: The current search results count.
            type: integer
        required:
          - type
          - page_offset
          - page_limit
          - total_records
      items:
        type: array
        items:
          type: object
          properties:
            upc:
              description: Order detail (job) UPC.
              type: integer
            display_upc:
              description: Order detail (job) display UPC.
              type: string
            product_id:
              description: Order detail (job) product (release) ID.
              type: integer
            encoding_queue_detail_id:
              description: Order detail (job) ID in DD DB.
              type: integer
            encoding_queue_id:
              description: Encoding queue ID in DD DB.
              type: integer
            delivery:
              description: Delivery can be "Y", "N", "S".
              type: string
            encoding:
              description: Encoding can be "Y", "N", "S".
              type: string
            meta_update:
              description: Was it a metadata update?
              type: boolean
            store_id:
              description: Order detail (job) store ID.
              type: integer
            order_id:
              description: Order ID.
              type: integer
            order_type:
              description: Order type, can be "release" or "harddrive".
              type: string
            status:
              description: Order detail (job) status.
              type: string
            error_log:
              description: Order detail (job) error log.
              type: string
            priority:
              description: Order priority.
              type: integer
            created_at:
              description: Order creation date.
              type: string
              format: date-time
              example: "2018-01-02T15:00:01"
            user_id:
              description: User who created the order.
              type: integer
            encoding_started:
              description: Order detail (job) encoding start date.
              type: string
              format: date-time
              example: "2018-01-02T15:00:01"
            encoding_ended:
              description: Order detail (job) encoding complete date.
              type: string
              format: date-time
              example: "2018-01-02T15:00:01"
            delivery_started:
              description: Order detail (job) delivery start date.
              type: string
              format: date-time
              example: "2018-01-02T15:00:01"
            delivery_ended:
              description: Order detail (job) delivery complete date.
              type: string
              format: date-time
              example: "2018-01-02T15:00:01"
            is_duplicate:
              description: Order detail (job) exists more than once (the same release ID and store ID).
              type: boolean
            required:
              - upc
              - display_upc
              - product_id
              - store_id
              - order_id
              - status
              - priority
              - created_at
              - user_id
    example: {
      "items": [
        {
          "created_at": "2018-01-01T00:00:00",
          "delivery": "Y",
          "delivery_ended": "2018-01-05T05:00:00",
          "delivery_started": "2018-01-04T04:00:00",
          "display_upc": "0123456789006",
          "encoder_id": 23,
          "encoding": "S",
          "encoding_ended": "2018-01-03T03:00:00",
          "encoding_queue_detail_id": 106,
          "encoding_queue_id": 6,
          "encoding_started": "2018-01-02T02:00:00",
          "error_log": "Some error",
          "is_duplicate": false,
          "meta_update": false,
          "order_id": 106,
          "order_type": "track",
          "priority": 3,
          "product_id": 6,
          "status": "delivered",
          "store_id": 286,
          "upc": 123456789006,
          "user_id": 658
        }
    ],
      "pagination": {
        "type": "standard",
        "page_offset": 0,
        "page_limit": 50,
        "total_records": 1
      },
      "request_id": "325a3c263c5840beb7d5d0629073f44c"
    }
