104 lines
2.4 KiB
Python
104 lines
2.4 KiB
Python
from flask import Flask
|
|
from flask_restx import Api, Resource, fields
|
|
from werkzeug.middleware.proxy_fix import ProxyFix
|
|
|
|
app = Flask(__name__)
|
|
app.wsgi_app = ProxyFix(app.wsgi_app)
|
|
api = Api(
|
|
app,
|
|
version="1.0",
|
|
title="TodoMVC API",
|
|
description="A simple TodoMVC API",
|
|
)
|
|
|
|
ns = api.namespace("todos", description="TODO operations")
|
|
|
|
todo = api.model(
|
|
"Todo",
|
|
{
|
|
"id": fields.Integer(readonly=True, description="The task unique identifier"),
|
|
"task": fields.String(required=True, description="The task details"),
|
|
},
|
|
)
|
|
|
|
|
|
class TodoDAO(object):
|
|
def __init__(self):
|
|
self.counter = 0
|
|
self.todos = []
|
|
|
|
def get(self, id):
|
|
for todo in self.todos:
|
|
if todo["id"] == id:
|
|
return todo
|
|
api.abort(404, "Todo {} doesn't exist".format(id))
|
|
|
|
def create(self, data):
|
|
todo = data
|
|
todo["id"] = self.counter = self.counter + 1
|
|
self.todos.append(todo)
|
|
return todo
|
|
|
|
def update(self, id, data):
|
|
todo = self.get(id)
|
|
todo.update(data)
|
|
return todo
|
|
|
|
def delete(self, id):
|
|
todo = self.get(id)
|
|
self.todos.remove(todo)
|
|
|
|
|
|
todo_dao = TodoDAO()
|
|
todo_dao.create({"task": "Build an API"})
|
|
todo_dao.create({"task": "?????"})
|
|
todo_dao.create({"task": "profit!"})
|
|
|
|
|
|
@ns.route("/")
|
|
class TodoList(Resource):
|
|
"""Shows a list of all todos, and lets you POST to add new tasks"""
|
|
|
|
@ns.doc("list_todos")
|
|
@ns.marshal_list_with(todo)
|
|
def get(self):
|
|
"""List all tasks"""
|
|
return todo_dao.todos
|
|
|
|
@ns.doc("create_todo")
|
|
@ns.expect(todo)
|
|
@ns.marshal_with(todo, code=201)
|
|
def post(self):
|
|
"""Create a new task"""
|
|
return todo_dao.create(api.payload), 201
|
|
|
|
|
|
@ns.route("/<int:id>")
|
|
@ns.response(404, "Todo not found")
|
|
@ns.param("id", "The task identifier")
|
|
class Todo(Resource):
|
|
"""Show a single todo item and lets you delete them"""
|
|
|
|
@ns.doc("get_todo")
|
|
@ns.marshal_with(todo)
|
|
def get(self, id):
|
|
"""Fetch a given resource"""
|
|
return todo_dao.get(id)
|
|
|
|
@ns.doc("delete_todo")
|
|
@ns.response(204, "Todo deleted")
|
|
def delete(self, id):
|
|
"""Delete a task given its identifier"""
|
|
todo_dao.delete(id)
|
|
return "", 204
|
|
|
|
@ns.expect(todo)
|
|
@ns.marshal_with(todo)
|
|
def put(self, id):
|
|
"""Update a task given its identifier"""
|
|
return todo_dao.update(id, api.payload)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app.run(debug=True)
|