tofu-api/tofu_api/api/tasks/task_views.py

90 lines
2.3 KiB
Python

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()