fridges-api/app.py
2022-03-08 01:10:30 -05:00

208 lines
5.8 KiB
Python

from flask import Flask, render_template, jsonify, request
"""
FRIDGE API
fridge is an object that stores food:
- List of foods
- Name
- Price
food is an object with certain properties:
- Quantity
- Color
- Shape
- Name
[=SAMPLES=]
Sample fridge:
{
"name": "Samsung Smart Fridge",
"price": "10000.0",
"food": []
}
Sample food:
{
"name": "banana",
"quantity": 3,
"color": "yellow",
"shape": "crescent",
"group": "fruit"
}
[=ENDPOINTS=]
GET /fridge
- Return a list of all fridges we own
GET /fridge/<name>
- Returns a fridge with the given name
GET /fridge/<name>/food
- Returns a list of food that fridge <name> stores
PUT /fridge/<name>/eat
- data:{fname:"fname", quantity:"q"}
- Remove "q" amount of food "fname" from fridge "name"
POST /fridge/<name>/add
- data:{fname:"fname", (details...), quantity:"q"}
- Add new type of food to fridge
GET /fridge/<name>/food/<fname>/quantity
- Returns the quantity of food "fname" in fridge "name"
GET /fridge/<name>/food/<fname>/shape
- Returns the shape of food "fname" in fridge "name"
"""
# Initial data
fridges = [
{
"name": "Samsung Smart Fridge",
"price": "10000.0",
"food": [
{
"name": "banana",
"quantity": 3,
"color": "yellow",
"shape": "crescent",
"group": "fruit"
},
{
"name": "apple",
"quantity": 2,
"color": "red",
"shape": "round",
"group": "fruit"
},
{
"name": "milk",
"quantity": 1,
"color": "white",
"shape": "round",
"group": "drink"
}
]
},
{
"name": "LG Smart Fridge",
"price": "5000.0",
"food": [
{
"name": "banana",
"quantity": 2,
"color": "yellow",
"shape": "crescent",
"group": "fruit"
},
{
"name": "watermelon",
"quantity": 1,
"color": "green",
"shape": "round",
"group": "fruit"
},
{
"name": "water",
"quantity": 1,
"color": "blue",
"shape": "round",
"group": "drink"
}
]
}
]
app = Flask(__name__)
@app.route("/")
def home():
return render_template("index.html")
# GET /fridge
# - Return a list of all fridges we own
@app.route("/fridge", methods=["GET"])
def get_fridges():
return jsonify({ "fridges": fridges })
# GET /fridge/<name>
# - Returns a fridge with the given name
@app.route("/fridge/<string:name>", methods=["GET"])
def get_fridge(name):
for fridge in fridges:
if fridge["name"] == name:
return jsonify(fridge)
return jsonify({ "message": "Fridge not found" })
# GET /fridge/<string:name>/food
# - Returns a list of food that fridge <name> stores
@app.route("/fridge/<string:name>/food", methods=["GET"])
def get_fridge_food_list(name):
for fridge in fridges:
if fridge["name"] == name:
return jsonify({ "food": fridge["food"] })
return jsonify({ "message": "Fridge not found" })
# PUT /fridge/<string:name>/eat
# - data:{fname:"fname", quantity:"q"}
# - Remove "q" amount of food "fname" from fridge "name"
@app.route("/fridge/<string:name>/eat", methods=["PUT"])
def eat_food_from_fridge(name):
request_data = request.get_json()
for fridge in fridges:
if fridge["name"] == name:
for food in fridge["food"]:
if food["name"] == request_data["fname"]:
food["quantity"] = food["quantity"] - 1
return jsonify({ "message": "Successfully removed food" })
return jsonify({ "message": "Fridge not found" })
# POST /fridge/<string:name>/add
# - data:{fname:"fname", (details...), quantity:"q"}
# - Add new type of food to fridge
@app.route("/fridge/<string:name>/add", methods=["POST"])
def add_item_to_fridge(name):
request_data = request.get_json()
for fridge in fridges:
if fridge["name"] == name:
if request_data["name"] in [food["name"] for food in fridge["food"]]:
return jsonify({ "message": "Food already in fridge" })
new_food = {
"name": request_data["name"],
"quantity": request_data["quantity"],
"color": request_data["color"],
"shape": request_data["shape"],
"group": request_data["group"]
}
fridge["food"].append(new_food)
return jsonify({ "message": "Food added to fridge" })
return jsonify({ "message": "Fridge not found" })
# GET /fridge/<string:name>/food/<string:fname>/quantity
# - Returns the quantity of food "fname" in fridge "name"
@app.route("/fridge/<string:name>/food/<string:fname>/quantity", methods=["GET"])
def get_food_quantity(name, fname):
for fridge in fridges:
if fridge["name"] == name:
for food in fridge["food"]:
if food["name"] == fname:
return jsonify({ "quantity": food["quantity"] })
return jsonify({ "message": "Fridge not found" })
# GET /fridge/<string:name>/food/<string:fname>/shape
# - Returns the shape of food "fname" in fridge "name"
@app.route("/fridge/<string:name>/food/<string:fname>/shape", methods=["GET"])
def get_food_shape(name, fname):
for fridge in fridges:
if fridge["name"] == name:
for food in fridge["food"]:
if food["name"] == fname:
return jsonify({ "shape": food["shape"] })
return jsonify({ "message": "Fridge not found" })
if __name__ == "__main__":
app.run(debug=True, port=5000)