{
  "swagger": "2.0",
  "info": {
    "description": "API for transactions",
    "version": "1.0.0",
    "title": "Space-Market",
    "license": {
      "name": "MIT",
      "url": "https://opensource.org/licenses/MIT"
    }
  },
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "tags": [
    {
      "name": "drinks"
    },
    {
      "name": "users"
    },
    {
      "name": "audits"
    }
  ],
  "paths": {
    "/audits.json": {
      "get": {
        "tags": [
          "audits"
        ],
        "summary": "statistics about previous transactions",
        "description": "statistics about previous transactions\n",
        "parameters": [
          {
            "in": "query",
            "name": "start_date[year]",
            "required": false,
            "type": "integer"
          },
          {
            "in": "query",
            "name": "start_date[month]",
            "type": "integer",
            "minimum": 1,
            "maximum": 12
          },
          {
            "in": "query",
            "name": "start_date[day]",
            "type": "integer",
            "minimum": 1,
            "maximum": 31
          },
          {
            "in": "query",
            "name": "end_date[year]",
            "required": false,
            "type": "integer"
          },
          {
            "in": "query",
            "name": "end_date[month]",
            "type": "integer",
            "minimum": 1,
            "maximum": 12
          },
          {
            "in": "query",
            "name": "end_date[day]",
            "type": "integer",
            "minimum": 1,
            "maximum": 31
          }
        ],
        "responses": {
          "200": {
            "description": "audits",
            "schema": {
              "type": "object",
              "required": [
                "sum",
                "payments_sum",
                "deposits_sum",
                "audits"
              ],
              "properties": {
                "sum": {
                  "type": "string",
                  "pattern": "\\d+(\\.\\d*)?",
                  "format": "float"
                },
                "payments_sum": {
                  "type": "string",
                  "pattern": "\\d+(\\.\\d*)?",
                  "format": "float"
                },
                "deposits_sum": {
                  "type": "string",
                  "pattern": "\\d+(\\.\\d*)?",
                  "format": "float"
                },
                "audits": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "integer"
                      },
                      "created_at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "difference": {
                        "type": "string",
                        "pattern": "\\d+(\\.\\d*)?",
                        "format": "float"
                      },
                      "drink": {
                        "type": "integer"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/drinks.json": {
      "get": {
        "tags": [
          "drinks"
        ],
        "summary": "returns all drinks",
        "responses": {
          "200": {
            "description": "drinks",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Drink"
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "drinks"
        ],
        "summary": "creates a new drink",
        "parameters": [
          {
            "in": "body",
            "name": "drink",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Drink"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "newly created Drink",
            "schema": {
              "$ref": "#/definitions/Drink"
            }
          }
        }
      }
    },
    "/drinks/new.json": {
      "get": {
        "tags": [
          "drinks"
        ],
        "summary": "returns the defaults for creating a new drink",
        "responses": {
          "200": {
            "description": "defaults",
            "schema": {
              "$ref": "#/definitions/Drink"
            }
          }
        }
      }
    },
    "/drinks/{id}.json": {
      "get": {
        "tags": [
          "drinks"
        ],
        "summary": "returns specific drink",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "drink",
            "schema": {
              "$ref": "#/definitions/Drink"
            }
          }
        }
      },
      "patch": {
        "tags": [
          "drinks"
        ],
        "summary": "edits specific drink",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          },
          {
            "in": "body",
            "name": "drink",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Drink"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "successfully edited"
          }
        }
      },
      "delete": {
        "tags": [
          "drinks"
        ],
        "summary": "deletes specific drink",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          }
        ],
        "responses": {
          "204": {
            "description": "successfully deleted"
          }
        }
      }
    },
    "/barcodes.json": {
      "get": {
        "tags": [
          "barcodes"
        ],
        "summary": "returns all barcodes",
        "responses": {
          "200": {
            "description": "list of barcodes",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Barcode"
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "barcodes"
        ],
        "summary": "creates new Barcode",
        "parameters": [
          {
            "in": "body",
            "required": true,
            "name": "barcode",
            "schema": {
              "$ref": "#/definitions/Barcode"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "newly created Barcode",
            "schema": {
              "$ref": "#/definitions/Barcode"
            }
          }
        }
      }
    },
    "/barcodes/new.json": {
      "get": {
        "tags": [
          "barcodes"
        ],
        "summary": "returns the defaults for creating new barcodes",
        "responses": {
          "200": {
            "description": "defaults",
            "schema": {
              "$ref": "#/definitions/Barcode"
            }
          }
        }
      }
    },
    "/barcodes/{id}.json": {
      "delete": {
        "tags": [
          "barcodes"
        ],
        "summary": "deletes barcode",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "string"
          }
        ],
        "responses": {
          "204": {
            "description": "barcode successfully deleted"
          }
        }
      }
    },
    "/users.json": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "returns all users",
        "responses": {
          "200": {
            "description": "list of users",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/User"
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "users"
        ],
        "summary": "creates new User",
        "parameters": [
          {
            "in": "body",
            "required": true,
            "name": "user",
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "new user",
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        }
      }
    },
    "/users/new.json": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "returns the defaults for creating a new user",
        "responses": {
          "200": {
            "description": "defaults",
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        }
      }
    },
    "/users/{id}.json": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "returns specific user",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          }
        ],
        "responses": {
          "200": {
            "description": "user",
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        }
      },
      "patch": {
        "tags": [
          "users"
        ],
        "summary": "edits specific user",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          },
          {
            "in": "body",
            "required": true,
            "name": "user",
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "successfully edited"
          }
        }
      },
      "delete": {
        "tags": [
          "users"
        ],
        "summary": "deletes user",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          }
        ],
        "responses": {
          "204": {
            "description": "successfully deleted"
          }
        }
      }
    },
    "/users/{id}/deposit.json": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "adds amount (in €) to the balance of the user with id",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          },
          {
            "in": "query",
            "required": true,
            "name": "amount",
            "type": "number"
          }
        ],
        "responses": {
          "204": {
            "description": "success"
          }
        }
      }
    },
    "/users/{id}/payment.json": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "subtracts amount (in €) from the balance of the user with id",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          },
          {
            "in": "query",
            "required": true,
            "name": "amount",
            "type": "number"
          }
        ],
        "responses": {
          "204": {
            "description": "success"
          }
        }
      }
    },
    "/users/{id}/buy.json": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "buys drink with id drink from user with id",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          },
          {
            "in": "query",
            "required": true,
            "name": "drink",
            "type": "integer"
          }
        ],
        "responses": {
          "204": {
            "description": "success"
          }
        }
      }
    },
    "/users/{id}/buy_barcode.json": {
      "post": {
        "tags": [
          "users"
        ],
        "summary": "buys drink with barcode for user with id",
        "parameters": [
          {
            "in": "path",
            "required": true,
            "name": "id",
            "type": "integer"
          },
          {
            "in": "body",
            "required": true,
            "name": "barcode",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "success"
          }
        }
      }
    },
    "/users/stats.json": {
      "get": {
        "tags": [
          "users"
        ],
        "summary": "stats about users",
        "responses": {
          "200": {
            "description": "stats",
            "schema": {
              "type": "object",
              "properties": {
                "user_count": {
                  "type": "integer"
                },
                "balance_sum": {
                  "type": "string",
                  "pattern": "\\d+(\\.\\d*)?",
                  "format": "float"
                }
              }
            }
          }
        }
      }
    }
  },
  "definitions": {
    "Drink": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "bottle_size": {
          "type": "string",
          "default": "0.0",
          "pattern": "\\d+(\\.\\d*)?",
          "format": "float",
          "description": "in litres"
        },
        "caffeine": {
          "type": "integer",
          "description": "mg of caffeine per 100 ml"
        },
        "price": {
          "type": "string",
          "default": "1.5",
          "pattern": "\\d+(\\.\\d*)?",
          "format": "float"
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        },
        "updated_at": {
          "type": "string",
          "format": "date-time"
        },
        "logo": {
          "type": "string",
          "format": "binary",
          "description": "the image to upload as the logo"
        },
        "logo_content_type": {
          "type": "string",
          "description": "mimetype of logo"
        },
        "logo_file_name": {
          "type": "string",
          "format": "uri"
        },
        "logo_file_size": {
          "type": "integer",
          "description": "size of logo in bytes"
        },
        "logo_updated_at": {
          "type": "string",
          "format": "date-time"
        },
        "active": {
          "type": "boolean",
          "default": true
        },
        "donation_recommendation": {
          "type": "string",
          "description": "DEPRECATED: alias for price",
          "pattern": "\\d+(\\.\\d*)?",
          "format": "float"
        },
        "logo_url": {
          "type": "string",
          "format": "uri"
        }
      }
    },
    "User": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "email": {
          "type": "string",
          "format": "email"
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        },
        "updated_at": {
          "type": "string",
          "format": "date-time"
        },
        "balance": {
          "type": "string",
          "pattern": "\\d+(\\.\\d+)?",
          "format": "float"
        },
        "active": {
          "type": "boolean",
          "default": true
        },
        "audit": {
          "type": "boolean",
          "default": false
        },
        "redirect": {
          "type": "boolean"
        }
      }
    },
    "Barcode": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "the barcode"
        },
        "drink": {
          "type": "integer",
          "description": "the ID of the drink"
        }
      }
    }
  }
}
