categories.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. """方案分类 HTTP 接口。"""
  2. from __future__ import annotations
  3. from flask import request
  4. from dms.api.v1.blueprint import api_v1
  5. from dms.common.errors import InvalidArgumentError
  6. from dms.common.response import success_response
  7. from dms.security.decorators import admin_required, bearer_auth_required
  8. from dms.services.category_service import (
  9. category_tree,
  10. create_category,
  11. delete_category,
  12. parse_category_id,
  13. parse_delete_row_version,
  14. reorder_categories,
  15. update_category,
  16. )
  17. def _json_body():
  18. if not request.is_json:
  19. raise InvalidArgumentError("请求体必须是JSON对象")
  20. body = request.get_json(silent=True)
  21. if not isinstance(body, dict):
  22. raise InvalidArgumentError("请求体必须是JSON对象")
  23. return body
  24. @api_v1.get("/categories/tree")
  25. @bearer_auth_required
  26. def categories_tree():
  27. return success_response(
  28. category_tree(
  29. keyword=request.args.get("keyword"),
  30. status=request.args.get("status"),
  31. )
  32. )
  33. @api_v1.post("/categories")
  34. @bearer_auth_required
  35. @admin_required
  36. def create_category_route():
  37. return success_response(create_category(_json_body()), status=201)
  38. @api_v1.put("/categories/reorder")
  39. @bearer_auth_required
  40. @admin_required
  41. def categories_reorder_route():
  42. """管理员拖动重排分类(顶级页签或同一父分类下的同级节点)。"""
  43. return success_response(reorder_categories(_json_body()))
  44. @api_v1.put("/categories/<id>")
  45. @bearer_auth_required
  46. @admin_required
  47. def update_category_route(id: str):
  48. return success_response(
  49. update_category(parse_category_id(id), _json_body())
  50. )
  51. @api_v1.delete("/categories/<id>")
  52. @bearer_auth_required
  53. @admin_required
  54. def delete_category_route(id: str):
  55. return success_response(
  56. delete_category(
  57. parse_category_id(id),
  58. parse_delete_row_version(request.args.get("rowVersion")),
  59. )
  60. )