diff --git a/app/__init__.py b/app/__init__.py index 2764c4cc8..fa960acf6 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -4,16 +4,13 @@ import os from dotenv import load_dotenv - db = SQLAlchemy() migrate = Migrate() load_dotenv() - def create_app(test_config=None): app = Flask(__name__) app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False - if test_config is None: app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get( "SQLALCHEMY_DATABASE_URI") @@ -21,14 +18,15 @@ def create_app(test_config=None): app.config["TESTING"] = True app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get( "SQLALCHEMY_TEST_DATABASE_URI") - # Import models here for Alembic setup + from app.models.task import Task from app.models.goal import Goal db.init_app(app) migrate.init_app(app, db) + from app.models.task import Task + from .routes import tasks_bp + app.register_blueprint(tasks_bp) - # Register Blueprints here - - return app + return app \ No newline at end of file diff --git a/app/models/task.py b/app/models/task.py index 39c89cd16..73dfebda0 100644 --- a/app/models/task.py +++ b/app/models/task.py @@ -3,4 +3,7 @@ class Task(db.Model): - task_id = db.Column(db.Integer, primary_key=True) + task_id = db.Column(db.Integer, primary_key=True, autoincrement=True) + title = db.Column(db.String) + description = db.Column(db.String) + completed_at = db.Column(db.DateTime, nullable=True, default=None) \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index 8e9dfe684..4e5f099b7 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,2 +1,72 @@ from flask import Blueprint +from app.models.task import Task +from app import db +from flask import request, Blueprint, make_response, jsonify +tasks_bp = Blueprint("tasks", __name__, url_prefix="/tasks") + + +@tasks_bp.route("", methods=["POST","GET"]) +def handle_tasks(): + if request.method == "POST": + request_body = request.get_json() + if "title" not in request_body or "description" not in request_body or "completed_at" not in request_body: + return {"details": f"Invalid data"}, 400 + + new_task = Task( + id=request_body["id"], + title=request_body["title"], + description=request_body["description"], + completed_at=request_body["completed_at"] + ) + + db.session.add(new_task) + db.session.commit() + + if new_task.completed_at == None: + new_task.completed_at = False + else: + new_task.completed_at = True + return jsonify(new_task), 200 + + elif request.method == "GET": + tasks = Task.query.all() + tasks_response = [] + for task in tasks: + tasks_response.append({ + "id": task.task_id, + "title": task.title, + "description": task.description, + "completed_at": bool(task.completed_at) + }) + return jsonify(tasks), 200 + + +@tasks_bp.route("/", methods=["GET", "PUT", "DELETE"]) +def handle_task(task_id): + task = Task.query.get(task_id) + + if task is None: + return make_response("", 404) + + if request.method == "GET": + return { "task":{ + "id": task.task_id, + "title": task.title, + "description": task.description, + "is_complete": bool(task.completed_at) + } + }, 200 + + elif request.method == "PUT": + form_data = request.get_json() + task.title = form_data["title"] + task.description = form_data["description"] + db.session.commit() + return make_response(f"Task #{task.task_id} has been updated.", 201) + + elif request.method == "DELETE": + db.session.delete(task) + db.session.commit() + + return {"details":f"Task {task.task_id} \"{task.title}\" successfully deleted"} \ No newline at end of file