openapi: 3.0.0
info:
  title: ows-product-review
  version: 1.1.0
  description: Approve and Reject Products
servers:
  - url: https://qa-ows-product-review.theorchard.io
  - url: https://prod-ows-product-review.theorchard.io
paths:
  /hello/:
    get:
      summary: Healthcheck
      tags: []
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                description: ""
                type: object
                properties:
                  status:
                    type: string
                    minLength: 1
                required:
                  - status
                x-examples:
                  example-1:
                    status: ok
              examples:
                example-1:
                  value:
                    status: ok
      operationId: get-hello
      description: Healthcheck
    parameters: []
  /approve/{review_id}:
    post:
      summary: Approve a product in the review queue.
      operationId: post-approve-by-id
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema:
              description: ""
              type: object
              properties:
                note:
                  type: string
            examples:
              example-1:
                value:
                  note: Approving this product for a reason.
      description: Approve a product in the review queue.
    parameters:
      - description: review ID
        name: review_id
        in: path
        required: true
        schema:
          type: integer
      - schema:
          type: string
          example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
          format: uuid
        in: header
        name: Orchard-Identity-Id
        description: An Orchard Identity Id.
        required: true
  /review-queue/{review_id}/approval:
    post:
      summary: Save an approval record and mark the review queue item as complete.
      responses:
        "200":
          description: OK
        "404":
          description: Item not found
        "400":
          description: Item already complete
      requestBody:
        content:
          application/json:
            schema:
              description: ""
              type: object
              properties:
                note:
                  type: string
            examples:
              example-1:
                value:
                  note: Approving this product for a reason.
    parameters:
      - description: review ID
        name: review_id
        in: path
        required: true
        schema:
          type: integer
      - schema:
          type: string
          example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
          format: uuid
        in: query
        name: user_id
        description: An Orchard Identity Id.
        required: true
      - description: Created Datetime
        name: created_datetime
        in: query
        required: false
        schema:
          type: string
          example: 2023-03-22T21:13:37.666367Z
          format: date-time
  /review-queue/{review_queue_id}/queue:
    patch:
      summary: Move a review queue item to a different queue.
      responses:
        "200":
          description: Review queue item moved to queue or is already in queue.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReviewQueueItem"
              examples:
                reviewQueueItemExample-new-locked:
                  $ref: "#/components/examples/reviewQueueItemExample-new-locked"
        "400":
          description: Invalid queue name or review queue item status is not "new".
        "404":
          description: Review queue item not found
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                queue_name:
                  type: string
              required:
                - queue_name
            examples:
              example-1:
                value:
                  queue_name: Name of queue review queue item should be moved to.
    parameters:
      - description: ID of review queue item.
        name: review_queue_id
        in: path
        required: true
        schema:
          type: integer
      - name: Orchard-Profile-Type
        in: header
        required: true
        description: >
          Must be set together with Orchard-Roles header.
          Acceptable combinations:
          - Orchard-Profile-Type: ContentProfile, Orchard-Roles: review_digital_audio
        schema:
          type: string
          enum:
            - ContentProfile
      - name: Orchard-Roles
        in: header
        required: true
        description: >
          Must be set together with Orchard-Profile-Type header.
          Acceptable combinations:
          - Orchard-Profile-Type: ContentProfile, Orchard-Roles: review_digital_audio
        schema:
          type: string
          enum:
            - review_digital_audio
      - description: Orchard Identity Id
        name: Orchard-Identity-Id
        in: header
        required: true
        schema:
          type: string
          format: uuid
          example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
  /review-queue/{review_queue_id}/queue/move-history:
    get:
      summary: Get the queue move history for a review queue item.
      responses:
        "200":
          description: Queue move history for the review queue item.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                    review_queue_id:
                      type: integer
                    queue_name:
                      type: string
                    moved_to_queue_by_user_id:
                      type: string
                      format: uuid
                    moved_at_datetime:
                      type: string
                      format: date-time
                  required:
                    - id
                    - review_queue_id
                    - queue_name
                    - moved_to_queue_by_user_id
                    - moved_at_datetime
              examples:
                example-1:
                  value:
                    items:
                      - id: 1
                        review_queue_id: 1
                        queue_name: under_investigation
                        moved_to_queue_by_user_id: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
                        moved_at_datetime: 2023-03-22T21:13:37.666367Z
                      - id: 2
                        review_queue_id: 1
                        queue_name: initial
                        moved_to_queue_by_user_id: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
                        moved_at_datetime: 2023-03-22T22:40:35.156468Z
    parameters:
      - description: ID of review queue item.
        name: review_queue_id
        in: path
        required: true
        schema:
          type: integer
  /review-queue/product/{product_id}/eligibility-check:
    get:
      summary: Check if a product is eligible for the review queue
      parameters:
        - description: product ID
          name: product_id
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: string
                example: eligible
  /review-queue/product/{product_id}:
    post:
      summary: Adds a product as a new review queue entry if not already added, with optional queue name argument for bulk submissions
      responses:
        "201":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReviewQueueItem"
              examples:
                reviewQueueItemExample-new-never-locked:
                  $ref: "#/components/examples/reviewQueueItemExample-new-never-locked"
      parameters:
        - description: product ID
          name: product_id
          in: path
          required: true
          schema:
            type: integer
        - description: queue name
          name: queue_name
          in: query
          schema:
            type: string
    delete:
      summary: Removes a product from the queue.
      responses:
        "204":
          description: OK
        "404":
          description: Not Found
    parameters:
      - description: product ID
        name: product_id
        in: path
        required: true
        schema:
          type: integer
  /review-queue/product/{product_id}/unsubmit:
    post:
      responses:
        "204":
          description: OK
        "404":
          description: Not Found
    parameters:
      - description: product ID
        name: product_id
        in: path
        required: true
        schema:
          type: integer
      - description: reason
        name: reason
        in: query
        required: true
        schema:
          type: string
  /reject/{review_id}:
    post:
      summary: Reject a product in the review queue.
      operationId: post-reject-by-id
      responses:
        "200":
          description: OK
      requestBody:
        content:
          application/json:
            schema:
              description: ""
              type: object
              properties:
                note:
                  type: string
              required:
                - note
            examples:
              example-1:
                value:
                  note: Advertisement in audio.
      description: Reject a product in the review queue.
    parameters:
      - description: review ID
        name: review_id
        in: path
        required: true
        schema:
          type: integer
      - schema:
          type: string
          example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
          format: uuid
        in: header
        name: Orchard-Identity-Id
        description: An Orchard Identity Id.
        required: true
  /review-queue/{review_id}/rejection:
    post:
      summary: Save a rejection record and mark the review queue item as complete.
      responses:
        "200":
          description: OK
        "404":
          description: Item not found
        "400":
          description: Item already complete
    parameters:
      - description: review ID
        name: review_id
        in: path
        required: true
        schema:
          type: integer
      - schema:
          type: string
          example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
          format: uuid
        in: query
        name: user_id
        description: An Orchard Identity Id.
        required: true
      - schema:
          type: string
        in: query
        name: note
        description: Rejection Note.
        required: true
      - description: Created Datetime
        name: created_datetime
        in: query
        required: false
        schema:
          type: string
          example: 2023-03-22T21:13:37.666367
          format: date-time
  /review-queue:
    get:
      summary: Get a list of review queue items.
      tags: []
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                description: ""
                type: object
                properties:
                  items:
                    type: array
                    uniqueItems: true
                    minItems: 1
                    items:
                      $ref: "#/components/schemas/ReviewQueueItem"
                  pagination:
                    type: object
                    properties:
                      type:
                        type: string
                        minLength: 1
                      offset: {}
                      limit: {}
                      total_records:
                        type: number
                    required:
                      - type
                      - total_records
                required:
                  - items
                  - pagination
              examples:
                example-1:
                  $ref: "#/components/examples/reviewQueueItemsExample"
      operationId: get-review-queue
      description: Get a list of review queue items.
      parameters:
        - schema:
            type: integer
          in: query
          name: page_offset
          description: Page offset.
        - schema:
            type: integer
          in: query
          name: page_limit
          description: Page limit.
        - schema:
            type: string
            enum:
              - new
              - complete
          in: query
          name: status
          description: Review queue item status to filter by.
        - schema:
            type: integer
          in: query
          name: review_queue_id
          description: Review queue item id to filter by.
        - schema:
            type: integer
          in: query
          name: product_id
          description: Product id to filter by.
  /dbsync:
    get:
      summary: Update product statuses to fix possible mismatches.
      tags:
        - qa-only
      responses:
        "200":
          description: OK
  /qa-only-reset-test-product/{product_id}:
    put:
      summary: In QA, reset db records used by tests.
      operationId: put-qa-only-reset-test-product-by-id
      tags:
        - qa-only
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                description: ""
                type: object
                properties:
                  status:
                    type: string
                    minLength: 1
                required:
                  - status
                x-examples:
                  example-1:
                    review_queue_id: 1
              examples:
                example-1:
                  value:
                    review_queue_id: 1
      parameters:
        - description: product ID
          name: product_id
          in: path
          required: true
          schema:
            type: integer
      description: In QA, reset db records used by tests.
  /review-history/{product_id}:
    get:
      summary: Gets list of completed reviews for a given product
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                description: ""
                type: object
                properties:
                  items:
                    type: array
                    uniqueItems: true
                    items:
                      required:
                        - review_queue_id
                        - product_id
                        - created_datetime
                        - status
                      properties:
                        review_queue_id:
                          type: number
                        product_id:
                          type: number
                        created_datetime:
                          type: string
                          minLength: 1
                        status:
                          type: string
                          minLength: 1
                        approval:
                          type: object
                          properties:
                            approval_id:
                              type: number
                            review_queue_id:
                              type: number
                            user_id:
                              type: string
                            created_datetime:
                              type: string
                          required:
                            - approval_id
                            - review_queue_id
                            - user_id
                            - created_datetime
                        rejection:
                          type: object
                          properties:
                            rejection_id:
                              type: number
                            review_queue_id:
                              type: number
                            user_id:
                              type: string
                            created_datetime:
                              type: string
                            note:
                              type: string
                          required:
                            - approval_id
                            - review_queue_id
                            - user_id
                            - created_datetime
                            - string
                  pagination:
                    type: object
                    properties:
                      type:
                        type: string
                        minLength: 1
                      offset: {}
                      limit: {}
                      total_records:
                        type: number
                    required:
                      - type
                      - total_records
                required:
                  - items
                  - pagination
      operationId: get-product-review-history
      description: Get a list of review history items.
      parameters:
        - description: product ID
          name: product_id
          in: path
          required: true
          schema:
            type: integer
        - schema:
            type: integer
          in: query
          name: page_offset
          description: Page offset.
        - schema:
            type: integer
          in: query
          name: page_limit
          description: Page limit.
  /review/{review_id}/email-notification:
    post:
      summary: send email notifications for a review
      responses:
        "201":
          description: OK
      parameters:
        - description: review ID
          name: review_id
          in: path
          required: true
          schema:
            type: integer
        - schema:
            type: string
            example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
            format: uuid
          in: header
          name: Orchard-Identity-Id
          description: An Orchard Identity Id.
          required: true
        - schema:
            type: string
            example: LabelProfile
          in: header
          name: Orchard-Profile-Type
          description: An Orchard Profile Type.
        - schema:
            type: string
            example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
            format: uuid
          in: header
          name: Orchard-Profile-Id
          description: An Orchard Profile Id.
  /reject/{product_id}:
    get:
      summary: Get rejection notes for the given product id.
      tags:
        - workstation-support
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                description: ""
                type: object
                properties:
                  items:
                    type: array
                    uniqueItems: true
                    items:
                      required:
                        - rejection_id
                        - table_name
                        - field_name
                        - comments
                        - corrected
                        - key_id
                      properties:
                        rejection_id:
                          type: number
                        table_name:
                          type: string
                        field_name:
                          type: string
                        comments:
                          type: string
                        corrected:
                          type: string
                        key_id:
                          type: number
                required:
                  - items
                x-examples:
                  example-1:
                    items:
                      - rejection_id: 876
                        table_name: releases
                        field_name: general_comments
                        comments: Test Rejection Comment
                        corrected: N
                        key_id: 0
      parameters:
        - description: product ID
          name: product_id
          in: path
          required: true
          schema:
            type: integer
  /status/{product_id}:
    get:
      summary: Get the current state for the given product id.
      tags:
        - workstation-support
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                description: ""
                type: object
                properties:
                  id:
                    type: number
                  ec_and_ar:
                    type: boolean
                  release_status:
                    type: string
                  release_approval_status:
                    type: string
                  note:
                    type: string
                required:
                  - id
                  - ec_and_ar
                  - release_status
                  - release_approval_status
                  - note
      parameters:
        - description: product ID
          name: product_id
          in: path
          required: true
          schema:
            type: integer
  /review-queue/{review_id}/lock:
    patch:
      summary: Lock a review for a user.
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReviewQueueItem"
              examples:
                reviewQueueItemExample-new-locked:
                  $ref: "#/components/examples/reviewQueueItemExample-new-locked"
      description: Lock a review for a user.
    parameters:
      - description: review ID
        name: review_id
        in: path
        required: true
        schema:
          type: integer
      - schema:
          type: string
          example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
          format: uuid
        in: header
        name: Orchard-Identity-Id
        description: An Orchard Identity Id.
        required: true
  /review-queue/{review_id}/unlock:
    patch:
      summary: Unlock a review.
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReviewQueueItem"
              examples:
                reviewQueueItemExample-new-locked:
                  $ref: "#/components/examples/reviewQueueItemExample-new-locked"
      description: Unlock a review for a user.
    parameters:
      - description: review ID
        name: review_id
        in: path
        required: true
        schema:
          type: integer
      - schema:
          type: string
          example: 4fa71ad4-f02c-4191-8b78-9ffa88b57686
          format: uuid
        in: header
        name: Orchard-Identity-Id
        description: An Orchard Identity Id.
        required: true
  /review-queue/dataloader:
    post:
      summary: Retrieve review queue items by id passed in json body.
      responses:
        "200":
          description: OK
    parameters:
      - description: List of review queue IDs
        name: review_queue_ids
        in: query
        required: true
        schema:
          type: array
          items:
              type: string
  /review-queue/target-group/dataloader:
    post:
      summary: Retrieve target group id off of review queue item by id passed in json body.
      responses:
        "200":
          description: OK
    parameters:
      - description: List of review queue IDs
        name: review_queue_ids
        in: query
        required: true
        schema:
          type: array
          items:
              type: string
components:
  schemas:
    ReviewQueueItem:
      type: object
      required:
        - review_queue_id
        - product_id
        - created_datetime
        - status
      properties:
        review_queue_id:
          type: integer
        product_id:
          type: integer
        created_datetime:
          type: string
          format: date-time
        status:
          type: string
          enum:
            - new
            - complete
        queue_name:
          type: string
        moved_to_queue_by_user_id:
          type: string
          format: uuid
        locked_by_user_id:
          type: string
          format: uuid
        locked_at_datetime:
          type: string
          format: date-time
        locked_until_datetime:
          type: string
          format: date-time
  examples:
    reviewQueueItemExample-new-never-locked:
      value:
        review_queue_id: 45222
        product_id: 4245678
        status: "new"
        queue_name: "initial"
        moved_to_queue_by_user_id: null
        created_datetime: "2023-05-15T21:34:40.526674Z"
        locked_by_user_id: null
        locked_at_datetime: null
        locked_until_datetime: null
    reviewQueueItemExample-new-locked:
      value:
        review_queue_id: 45221
        product_id: 4245677
        status: "new"
        queue_name: "initial"
        moved_to_queue_by_user_id: null
        created_datetime: "2023-05-15T20:34:40.526674Z"
        locked_by_user_id: "d0699f98-6e7c-4131-b96c-673be146e24e"
        locked_at_datetime: "2023-05-15T20:57:50.502609Z"
        locked_until_datetime: "2023-05-15T20:57:54.562628Z"
    reviewQueueItemsExample:
      value:
        items:
          - review_queue_id: 45222
            product_id: 4245678
            status: "new"
            queue_name: "initial"
            moved_to_queue_by_user_id: null
            created_datetime: "2023-05-15T21:34:40.526674Z"
            locked_by_user_id: "e0699f98-6e7c-4131-b96c-673be146e24e"
            locked_at_datetime: "2023-05-15T21:57:50.502609Z"
            locked_until_datetime: "2023-05-15T21:57:54.562628Z"
          - review_queue_id: 45221
            product_id: 4245674
            status: "complete"
            queue_name: "under_investigation"
            moved_to_queue_by_user_id: "d0699f98-6e7c-4131-b96c-673be146e24e"
            created_datetime: "2023-05-15T21:34:40.526674Z"
            locked_by_user_id: "e0699f98-6e7c-4131-b96c-673be146e24e"
            locked_at_datetime: "2023-05-15T21:57:50.502609Z"
            locked_until_datetime: "2023-05-15T21:57:54.562628Z"
        pagination:
          type: standard
          offset: 0
          limit: 50
          total_records: 2
