---
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
    example: "f1f046a3-45c9-4b99-adce-000000000001"
  revision:
    type: integer
    example: 42
  redirect:
    type: string
    #format: uuid
    example: "f1f046a3-45c9-4b99-adce-000000000002"
  editgroup_id:
    type: integer
    example: 16
x-entity-edit-props: &ENTITYEDITPROPS
  edit_id:
    type: integer
    example: 847
  ident:
    type: string
    example: "f1f046a3-45c9-4b99-adce-000000000001"
  revision:
    type: integer
    example: 42
  editgroup_id:
    type: integer
    example: 16


definitions:
  error_response:
    type: object
    required:
      - message
    properties:
      message:
        type: string
        example: "A really confusing, totally unexpected thing happened"
  success:
    type: object
    required:
      - message
    properties:
      message:
        type: string
        example: "The computers did the thing successfully!"
  creator_entity:
    type: object
    required:
      - name
    properties:
      <<: *ENTITYPROPS
      name:
        type: string
        example: "Grace Hopper"
      orcid:
        type: string
        #format: custom
        example: "0000-0002-1825-0097"
  container_entity:
    type: object
    required:
      - name
    properties:
      <<: *ENTITYPROPS
      name:
        type: string
        example: "Journal of Important Results"
      publisher:
        type: string
        example: "Society of Curious Students"
      issn:
        type: string
        #format: custom
        example: "1234-5678"
  file_entity:
    type: object
    properties:
      <<: *ENTITYPROPS
      size:
        type: integer
        example: 1048576
      sha1:
        type: string
        #format: custom
        example: "f013d66c7f6817d08b7eb2a93e6d0440c1f3e7f8"
      url:
        type: string
        format: url
        example: "https://example.edu/~frau/prcding.pdf"
  release_entity:
    type: object
    required:
      - title
      - work_id
    properties:
      <<: *ENTITYPROPS
      title:
        type: string
      work_id:
        type: string
        example: "f1f046a3-45c9-4b99-adce-000000000001"
      container_id:
        type: string
        example: "f1f046a3-45c9-4b99-adce-000000000001"
      release_type:
        type: string
        example: "preprint"
      date:
        type: date
      doi:
        type: string
        #format: custom
        example: "10.1234/abcde.789"
      volume:
        type: string
      pages:
        type: string
      issue:
        type: string
        example: "12"
  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
        example: "zerocool93"
  editgroup:
    type: object
    required:
      - editor_id
    properties:
      id:
        type: integer
      editor_id:
        type: integer
      description:
        type: string
      # TODO: work_edits array, etc. ["edits"]["work"] or ["work_edits"]?
  changelogentries:
    type: array
    items:
      type: object
      required:
        - index
        - editgroup_id
        - timestamp
      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/changelogentries"
        404:
          description: Not Found
          schema:
            $ref: "#/definitions/error_response"
        default:
          description: Generic Error
          schema:
            $ref: "#/definitions/error_response"
  /editgroup:
    post:
      parameters:
        - name: body
          in: body
          required: true
          schema:
            $ref: "#/definitions/editgroup"
      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 Entity
          schema:
            $ref: "#/definitions/editgroup"
        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"
  /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"