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