---
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
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
  release_entity:
    type: object
    required:
      - ident
      - state
    properties:
      <<: *ENTITYPROPS
      name:
        type: string
      orcid:
        type: string
        #format: custom
  creator_entity:
    type: object
    properties:
      <<: *ENTITYPROPS
      name:
        type: string
      orcid:
        type: string
        #format: custom
  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

paths:
  /creator:
    post:
      parameters:
        - name: body
          in: body
          schema:
            $ref: "#/definitions/creator_entity"
       #- name: editgroup
       #  in: body
       #  type: string
      responses:
        201:
          description: created
          schema:
            $ref: "#/definitions/entity_edit"
        400:
          description: bad request
          schema:
            $ref: "#/definitions/error"
        default:
          description: generic error response
          schema:
            $ref: "#/definitions/error"
  /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"
        404:
          description: no such creator
          schema:
            $ref: "#/definitions/error"
        default:
          description: generic error response
          schema:
            $ref: "#/definitions/error"
  /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"
        default:
          description: generic error response
          schema:
            $ref: "#/definitions/error"
  /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"