task_controller.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from flask import request
  2. from flask_restx import Resource, Namespace, fields
  3. from app.service.task_service import TaskService
  4. from app.utils.jwt_utils import token_required
  5. from app.utils.logger import Logger, log_request_info
  6. from app import db # 从 app/__init__.py 导入 db
  7. # 1. 创建 API 命名空间,用于组织相关的路由
  8. api = Namespace('tasks', description='Task related operations')
  9. # 2. 定义 DTO (Data Transfer Objects) / API Models
  10. # 用于请求体解析和响应体序列化
  11. task_model = api.model('Task', {
  12. 'id': fields.Integer(readOnly=True, description='The task unique identifier'),
  13. 'title': fields.String(required=True, description='The task title'),
  14. 'description': fields.String(description='The task description'),
  15. 'done': fields.Boolean(description='The task status', default=False)
  16. })
  17. task_input_model = api.model('TaskInput', {
  18. 'title': fields.String(required=True, description='The task title'),
  19. 'description': fields.String(description='The task description'),
  20. })
  21. # 3. 创建资源类,每个类对应一个资源,并绑定 HTTP 方法
  22. @api.route('/')
  23. class TaskListResource(Resource):
  24. @token_required
  25. @api.marshal_list_with(task_model) # 定义响应的 Swagger 文档
  26. @log_request_info
  27. def get(self):
  28. """获取所有任务列表"""
  29. Logger.info("获取任务列表")
  30. service = TaskService(db.session)
  31. tasks = service.get_all_tasks()
  32. Logger.info("任务列表获取成功", {
  33. 'task_count': len(tasks)
  34. })
  35. return [task.to_dict() for task in tasks]
  36. @token_required
  37. @api.expect(task_input_model, validate=True) # 定义请求体的 Swagger 文档并验证
  38. @api.marshal_with(task_model, code=201) # 定义成功响应的 Swagger 文档
  39. @log_request_info
  40. def post(self):
  41. """创建一个新任务"""
  42. data = request.get_json()
  43. service = TaskService(db.session)
  44. Logger.info("创建新任务", {
  45. 'title': data.get('title'),
  46. 'description': data.get('description')
  47. })
  48. try:
  49. new_task = service.create_new_task(title=data['title'], description=data.get('description'))
  50. Logger.info("任务创建成功", {
  51. 'task_id': new_task.id,
  52. 'title': new_task.title
  53. })
  54. return new_task.to_dict(), 201
  55. except ValueError as e:
  56. Logger.warning("任务创建失败", {
  57. 'title': data.get('title'),
  58. 'error': str(e)
  59. })
  60. api.abort(400, str(e))
  61. @api.route('/<int:task_id>')
  62. class TaskResource(Resource):
  63. @token_required
  64. @api.marshal_with(task_model)
  65. @api.response(404, 'Task not found')
  66. def get(self, task_id):
  67. """根据 ID 获取单个任务"""
  68. service = TaskService(db.session)
  69. try:
  70. task = service.get_task_by_id(task_id)
  71. return task.to_dict()
  72. except ValueError as e:
  73. api.abort(404, str(e))
  74. @token_required
  75. @api.expect(task_input_model)
  76. @api.marshal_with(task_model)
  77. @api.response(404, 'Task not found')
  78. def put(self, task_id):
  79. """根据 ID 更新一个已存在的任务"""
  80. data = request.get_json()
  81. service = TaskService(db.session)
  82. try:
  83. updated_task = service.update_existing_task(
  84. task_id=task_id,
  85. title=data.get('title'),
  86. description=data.get('description'),
  87. done=data.get('done')
  88. )
  89. return updated_task.to_dict()
  90. except ValueError as e:
  91. api.abort(404, str(e))
  92. @token_required
  93. @api.response(204, 'Task deleted')
  94. @api.response(404, 'Task not found')
  95. def delete(self, task_id):
  96. """根据 ID 删除一个任务"""
  97. service = TaskService(db.session)
  98. try:
  99. service.delete_task(task_id)
  100. return '', 204
  101. except ValueError as e:
  102. api.abort(404, str(e))