forked from AdaGold/task-list-api
-
Notifications
You must be signed in to change notification settings - Fork 146
/
Copy pathtask_routes.py
101 lines (75 loc) · 3.13 KB
/
task_routes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from flask import Blueprint, jsonify, abort, make_response, request
from app import db
from app.models.task import Task
from app.models.goal import Goal
from datetime import datetime
import requests
import os
tasks_bp = Blueprint("tasks", __name__, url_prefix="/tasks")
def validate_model(cls, model_id):
try:
model_id = int(model_id)
except:
abort(make_response({"message":f"{cls.__name__} {model_id} invalid"}, 400))
model = cls.query.get(model_id)
if not model:
abort(make_response({"message":f"{cls.__name__} {model_id} not found"}, 404))
return model
@tasks_bp.route("", methods=["POST"])
def create_task():
request_body = request.get_json()
if (("title") not in request_body
or ("description") not in request_body):
return make_response({"details": "Invalid data"}, 400)
new_task = Task.from_dict(request_body)
db.session.add(new_task)
db.session.commit()
task_response = Task.query.get(1)
return make_response({"task": task_response.to_dict()}, 201)
@tasks_bp.route("", methods=["GET"])
def get_all_tasks():
sort_query = request.args.get("sort")
if sort_query == "asc":
tasks = Task.query.order_by(Task.title)
elif sort_query == "desc":
tasks = Task.query.order_by(Task.title.desc()) #ColumnElement.desc() method produces a descending ORDER BY clause element
else:
tasks = Task.query.all()
tasks_response = []
for task in tasks:
tasks_response.append(task.to_dict())
return jsonify(tasks_response)
@tasks_bp.route("/<task_id>", methods=["GET"])
def read_one_task(task_id):
task = validate_model(Task, task_id)
return make_response({"task": task.to_dict()}, 200)
@tasks_bp.route("/<task_id>", methods=["PUT"])
def update_task(task_id):
task = validate_model(Task, task_id)
request_body = request.get_json()
task.title = request_body["title"]
task.description = request_body["description"]
db.session.commit()
return make_response({"task": task.to_dict()}, 200)
@tasks_bp.route("/<task_id>", methods=["DELETE"])
def delete_task(task_id):
task = validate_model(Task, task_id)
db.session.delete(task)
db.session.commit()
return make_response({"details": f"Task {task.id} \"{task.title}\" successfully deleted"}, 200)
@tasks_bp.route("/<task_id>/mark_complete", methods=["PATCH"])
def mark_complete_task(task_id):
task = validate_model(Task, task_id)
task.completed_at = datetime.utcnow()
db.session.commit()
#send notif to Slack API
params = {"channel": "task-notifications", "text": f"Someone just completed the task {task.title}"}
header = {"Authorization": f"Bearer {os.environ.get('SLACKBOT_AUTH_TOKEN')}"}
requests.post("https://slack.com/api/chat.postMessage", params=params, headers=header)
return make_response({"task": task.to_dict()}, 200)
@tasks_bp.route("/<task_id>/mark_incomplete", methods=["PATCH"])
def mark_incomplete_task(task_id):
task = validate_model(Task, task_id)
task.completed_at = None
db.session.commit()
return make_response({"task": task.to_dict()}, 200)