Implement task API with input validation; implement error handling; refactoring
This commit is contained in:
parent
19d264a03b
commit
50aff05614
24 changed files with 612 additions and 131 deletions
89
tofu_api/api/tasks/task_views.py
Normal file
89
tofu_api/api/tasks/task_views.py
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
from flask import jsonify
|
||||
from validataclass.validators import DataclassValidator
|
||||
|
||||
from tofu_api.common.rest import BaseMethodView
|
||||
from .task_handler import TaskHandler
|
||||
from .validators import TaskCreateData, TaskUpdateData
|
||||
|
||||
|
||||
class TaskBaseView(BaseMethodView):
|
||||
"""
|
||||
Base class for view classes for the `/tasks` endpoint.
|
||||
"""
|
||||
|
||||
task_handler: TaskHandler
|
||||
|
||||
def __init__(self, *, task_handler: TaskHandler):
|
||||
self.task_handler = task_handler
|
||||
|
||||
|
||||
class TaskCollectionView(TaskBaseView):
|
||||
"""
|
||||
View class for `/api/tasks` endpoint.
|
||||
"""
|
||||
|
||||
# Validators
|
||||
task_create_validator = DataclassValidator(TaskCreateData)
|
||||
|
||||
def get(self):
|
||||
"""
|
||||
Get list of all tasks.
|
||||
"""
|
||||
task_list = self.task_handler.fetch_all_tasks()
|
||||
return jsonify({
|
||||
'items': [task.to_dict() for task in task_list],
|
||||
'total_count': len(task_list),
|
||||
}), 200
|
||||
|
||||
def post(self):
|
||||
"""
|
||||
Create a new task.
|
||||
"""
|
||||
# Parse request data
|
||||
create_data: TaskCreateData = self.validate_request_data(self.task_create_validator)
|
||||
|
||||
# Create new task
|
||||
new_task = self.task_handler.create_task(create_data)
|
||||
|
||||
# Return new task as JSON
|
||||
return jsonify(new_task.to_dict()), 201
|
||||
|
||||
|
||||
class TaskItemView(TaskBaseView):
|
||||
"""
|
||||
View class for `/api/tasks/<int:task_id>` endpoint.
|
||||
"""
|
||||
|
||||
# Validators
|
||||
task_update_validator = DataclassValidator(TaskUpdateData)
|
||||
|
||||
def get(self, task_id: int):
|
||||
"""
|
||||
Get a single task by ID.
|
||||
"""
|
||||
task = self.task_handler.fetch_task(task_id)
|
||||
return jsonify(task.to_dict()), 200
|
||||
|
||||
def patch(self, task_id: int):
|
||||
"""
|
||||
Update a single task by ID.
|
||||
"""
|
||||
# Parse request data
|
||||
update_data: TaskUpdateData = self.validate_request_data(self.task_update_validator)
|
||||
|
||||
# Fetch task and update
|
||||
task = self.task_handler.fetch_task(task_id)
|
||||
task = self.task_handler.update_task(task, update_data)
|
||||
|
||||
# Return updated task as JSON
|
||||
return jsonify(task.to_dict()), 200
|
||||
|
||||
def delete(self, task_id: int):
|
||||
"""
|
||||
Delete a single task by ID.
|
||||
"""
|
||||
# Fetch task and delete
|
||||
task = self.task_handler.fetch_task(task_id)
|
||||
self.task_handler.delete_task(task)
|
||||
|
||||
return self.empty_response()
|
||||
Loading…
Add table
Add a link
Reference in a new issue