---
swagger: "2.0"
info:
  title: fatcat
  description: A scalable, versioned, API-oriented catalog of bibliographic entities
    and file metadata
  version: 0.1.0
schemes: [http]
basePath: /v0
host: api.fatcat.wiki
consumes:
  - application/json
produces:
  - application/json


# Common properties across entities
x-entity-props: &ENTITYPROPS
  state:
    type: string
    enum: ["wip", "active", "redirect", "deleted"]
  ident:
    type: string
    #format: uuid
  revision:
    type: integer
  redirect:
    type: string
    #format: uuid
  editgroup:
    type: integer
x-entity-edit-props: &ENTITYEDITPROPS
  edit_id:
    type: integer
  ident:
    type: string
  revision:
    type: integer
  editgroup_id:
    type: integer


definitions:
  error_response:
    type: object
    required:
      - message
    properties:
      message:
        type: string
  success:
    type: object
    required:
      - message
    properties:
      message:
        type: string
  creator_entity:
    type: object
    required:
      - name
    properties:
      <<: *ENTITYPROPS
      name:
        type: string
      orcid:
        type: string
        #format: custom
  container_entity:
    type: object
    required:
      - name
    properties:
      <<: *ENTITYPROPS
      name:
        type: string
      parent:
        type: string
      publisher:
        type: string
      issn:
        type: string
        #format: custom
  file_entity:
    type: object
    properties:
      <<: *ENTITYPROPS
      size:
        type: integer
      sha1:
        type: string
        #format: custom
      url:
        type: string
        format: url
  release_entity:
    type: object
    required:
      - title
    properties:
      <<: *ENTITYPROPS
      work:
        type: string
      container:
        type: string
      license:
        type: string
      release_type:
        type: string
      date:
        type: date
      doi:
        type: string
        #format: custom
      volume:
        type: string
      pages:
        type: string
      issue:
        type: string
  work_entity:
    type: object
    properties:
      <<: *ENTITYPROPS
      work_type:
        type: string
  entity_edit:
    type: object
    properties:
      <<: *ENTITYEDITPROPS
  editor:
    type: object
    required:
      - username
    properties:
      username:
        type: string
  editgroup:
    type: object
    required:
      - editor_id
    properties:
      id:
        type: integer
      editor_id:
        type: integer
      # TODO: work_edits array, etc. ["edits"]["work"] or ["work_edits"]?
  changelogentry:
    type: object
    required:
      - index
    properties:
      index:
        type: integer
      editgroup_id:
        type: integer
      timestamp:
        type: string
        format: date-time

x-entity-responses: &ENTITYRESPONSES
  400:
    description: Bad Request
    schema:
      $ref: "#/definitions/error_response"
  404:
    description: Not Found
    schema:
      $ref: "#/definitions/error_response"
  default:
    description: Generic Error
    schema:
      $ref: "#/definitions/error_response"

paths:
  /creator:
    post:
      parameters:
        - name: body
          in: body
          required: true
          schema:
            $ref: "#/definitions/creator_entity"
      responses:
        201:
          description: Created Entity
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /creator/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/creator_entity"
        <<: *ENTITYRESPONSES
  /creator/lookup:
    get:
      parameters:
        - name: orcid
          in: query
          type: string
          required: true
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/creator_entity"
        <<: *ENTITYRESPONSES
  /container:
    post:
      parameters:
        - name: body
          in: body
          required: true
          schema:
            $ref: "#/definitions/container_entity"
      responses:
        201:
          description: Created Entity
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /container/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/container_entity"
        <<: *ENTITYRESPONSES
  /container/lookup:
    get:
      parameters:
        - name: issn
          in: query
          type: string
          required: true
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/container_entity"
        <<: *ENTITYRESPONSES
  /file:
    post:
      parameters:
        - name: body
          in: body
          required: true
          schema:
            $ref: "#/definitions/file_entity"
      responses:
        201:
          description: Created Entity
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /file/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/file_entity"
        <<: *ENTITYRESPONSES
  /file/lookup:
    get:
      parameters:
        - name: sha1
          in: query
          type: string
          required: true
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/file_entity"
        <<: *ENTITYRESPONSES
  /release:
    post:
      parameters:
        - name: body
          in: body
          required: true
          schema:
            $ref: "#/definitions/release_entity"
      responses:
        201:
          description: Created Entity
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /release/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/release_entity"
        <<: *ENTITYRESPONSES
  /release/lookup:
    get:
      parameters:
        - name: doi
          in: query
          type: string
          required: true
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/release_entity"
        <<: *ENTITYRESPONSES
  /work:
    post:
      parameters:
        - name: body
          in: body
          required: true
          schema:
            $ref: "#/definitions/work_entity"
      responses:
        201:
          description: Created Entity
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /work/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: Found Entity
          schema:
            $ref: "#/definitions/work_entity"
        <<: *ENTITYRESPONSES
  /editor/{username}:
    parameters:
      - name: username
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: Found Editor
          schema:
            $ref: "#/definitions/editor"
        404:
          description: Not Found
          schema:
            $ref: "#/definitions/error_response"
        default:
          description: Generic Error
          schema:
            $ref: "#/definitions/error_response"
  /editor/{username}/changelog:
    parameters:
      - name: username
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: Found Merged Changes
          schema:
            $ref: "#/definitions/changelogentry"
        404:
          description: Not Found
          schema:
            $ref: "#/definitions/error_response"
        default:
          description: Generic Error
          schema:
            $ref: "#/definitions/error_response"
  /editgroup:
    post:
      responses:
        201:
          description: Successfully Created
          schema:
            $ref: "#/definitions/editgroup"
        400:
          description: Bad Request
          schema:
            $ref: "#/definitions/error_response"
        default:
          description: Generic Error
          schema:
            $ref: "#/definitions/error_response"
  /editgroup/{id}:
    parameters:
      - name: id
        in: path
        type: integer
        required: true
    get:
      responses:
        200:
          description: Found Editgroup
          schema:
            $ref: "#/definitions/editgroup"
        404:
          description: Not Found
          schema:
            $ref: "#/definitions/error_response"
        default:
          description: Generic Error
          schema:
            $ref: "#/definitions/error_response"
  /editgroup/{id}/accept:
    parameters:
      - name: id
        in: path
        type: integer
        required: true
    post:
      responses:
        200:
          description: Merged Successfully
          schema:
            $ref: "#/definitions/success"
        400:
          description: Unmergable
          schema:
            $ref: "#/definitions/error_response"
        404:
          description: Not Found
          schema:
            $ref: "#/definitions/error_response"
        default:
          description: Generic Error
          schema:
            $ref: "#/definitions/error_response"