---
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
  id:
    type: integer
  ident:
    type: string
  revision:
    type: integer
  editgroup_id:
    type: integer


definitions:
  error:
    type: object
    required:
      - message
    properties:
      message:
        type: string
  success:
    type: object
    required:
      - message
    properties:
      message:
        type: string
  creator_entity:
    type: object
    properties:
      <<: *ENTITYPROPS
      name:
        type: string
      orcid:
        type: string
        #format: custom
  container_entity:
    type: object
    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
    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
      title:
        type: string
      work_type:
        type: string
  entity_edit:
    type: object
    properties:
      <<: *ENTITYEDITPROPS
  editor:
    type: object
    required:
      - username
    properties:
      username:
        type: string
  editgroup:
    type: object
    required:
      - id
      - editor_id
    properties:
      id:
        type: integer
      editor_id:
        type: integer
  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"
  default:
    description: generic error response
    schema:
      $ref: "#/definitions/error"

paths:
  /creator:
    post:
      parameters:
        - name: body
          in: body
          schema:
            $ref: "#/definitions/creator_entity"
      responses:
        201:
          description: created
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /creator/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: fetch a single creator by id
          schema:
            $ref: "#/definitions/creator_entity"
        <<: *ENTITYRESPONSES
  /creator/lookup:
    get:
      parameters:
        - name: orcid
          in: query
          type: string
          required: true
      responses:
        200:
          description: find a single creator by external identifer
          schema:
            $ref: "#/definitions/creator_entity"
        404:
          description: no such creator
          schema:
            $ref: "#/definitions/error"
        <<: *ENTITYRESPONSES
  /container:
    post:
      parameters:
        - name: body
          in: body
          schema:
            $ref: "#/definitions/container_entity"
      responses:
        201:
          description: created
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /container/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: fetch a single container by id
          schema:
            $ref: "#/definitions/container_entity"
        <<: *ENTITYRESPONSES
  /container/lookup:
    get:
      parameters:
        - name: issn
          in: query
          type: string
          required: true
      responses:
        200:
          description: find a single container by external identifer
          schema:
            $ref: "#/definitions/container_entity"
        404:
          description: no such container
          schema:
            $ref: "#/definitions/error"
        <<: *ENTITYRESPONSES
  /file:
    post:
      parameters:
        - name: body
          in: body
          schema:
            $ref: "#/definitions/file_entity"
      responses:
        201:
          description: created
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /file/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: fetch a single file by id
          schema:
            $ref: "#/definitions/file_entity"
        <<: *ENTITYRESPONSES
  /file/lookup:
    get:
      parameters:
        - name: sha1
          in: query
          type: string
          required: true
      responses:
        200:
          description: find a single file by external identifer
          schema:
            $ref: "#/definitions/file_entity"
        404:
          description: no such file
          schema:
            $ref: "#/definitions/error"
        <<: *ENTITYRESPONSES
  /release:
    post:
      parameters:
        - name: body
          in: body
          schema:
            $ref: "#/definitions/release_entity"
      responses:
        201:
          description: created
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /release/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: fetch a single release by id
          schema:
            $ref: "#/definitions/release_entity"
        <<: *ENTITYRESPONSES
  /release/lookup:
    get:
      parameters:
        - name: doi
          in: query
          type: string
          required: true
      responses:
        200:
          description: find a single release by external identifer
          schema:
            $ref: "#/definitions/release_entity"
        404:
          description: no such release
          schema:
            $ref: "#/definitions/error"
        <<: *ENTITYRESPONSES
  /work:
    post:
      parameters:
        - name: body
          in: body
          schema:
            $ref: "#/definitions/work_entity"
      responses:
        201:
          description: created
          schema:
            $ref: "#/definitions/entity_edit"
        <<: *ENTITYRESPONSES
  /work/{id}:
    parameters:
      - name: id
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: fetch a single work by id
          schema:
            $ref: "#/definitions/work_entity"
        <<: *ENTITYRESPONSES
  /editor/{username}:
    parameters:
      - name: username
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: fetch generic information about an editor
          schema:
            $ref: "#/definitions/editor"
        404:
          description: username not found
          schema:
            $ref: "#/definitions/error"
        default:
          description: generic error response
          schema:
            $ref: "#/definitions/error"
  /editor/{username}/changelog:
    parameters:
      - name: username
        in: path
        type: string
        required: true
    get:
      responses:
        200:
          description: find changes (editgroups) by this editor which have been merged
          schema:
            $ref: "#/definitions/changelogentry"
        404:
          description: username not found
          schema:
            $ref: "#/definitions/error"
        default:
          description: generic error response
          schema:
            $ref: "#/definitions/error"
  /editgroup:
    post:
      responses:
        201:
          description: successfully created
          schema:
            $ref: "#/definitions/editgroup"
        400:
          description: invalid request parameters
          schema:
            $ref: "#/definitions/error"
        default:
          description: generic error response
          schema:
            $ref: "#/definitions/error"
  /editgroup/{id}:
    parameters:
      - name: id
        in: path
        type: integer
        required: true
    get:
      responses:
        200:
          description: fetch editgroup by identifier
          schema:
            $ref: "#/definitions/editgroup"
        404:
          description: no such editgroup
          schema:
            $ref: "#/definitions/error"
        default:
          description: generic error response
          schema:
            $ref: "#/definitions/error"
  /editgroup/{id}/accept:
    parameters:
      - name: id
        in: path
        type: integer
        required: true
    post:
      responses:
        200:
          description: merged editgroup successfully ("live")
          schema:
            $ref: "#/definitions/success"
        400:
          description: editgroup is in an unmergable state
          schema:
            $ref: "#/definitions/error"
        404:
          description: no such editgroup
          schema:
            $ref: "#/definitions/error"
        default:
          description: generic error response
          schema:
            $ref: "#/definitions/error"