quality_routes.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. """HTTP boundary for generic, deterministic quality operations."""
  2. from __future__ import annotations
  3. from flask import g, jsonify, request
  4. from app import db
  5. from app.api.data_rules import bp
  6. from app.models.result import failed, success
  7. def get_quality_operations_service():
  8. from app.core.data_rules.quality_operations import QualityOperationsService
  9. from app.core.data_rules.quality_repository import (
  10. SqlAlchemyQualityOperationsRepository,
  11. )
  12. return QualityOperationsService(
  13. SqlAlchemyQualityOperationsRepository(db.session),
  14. publish_authorizer=lambda _actor_uid: None,
  15. commit=db.session.commit,
  16. rollback=db.session.rollback,
  17. )
  18. def _actor_uid():
  19. identity = getattr(g, "current_user", {}) or {}
  20. return identity.get("id") or identity.get("sub")
  21. def _payload():
  22. value = request.get_json(silent=True)
  23. if not isinstance(value, dict):
  24. raise ValueError("request body must be an object")
  25. return value
  26. def _error(error):
  27. db.session.rollback()
  28. if isinstance(error, LookupError):
  29. return jsonify(failed(str(error), code=404)), 404
  30. if isinstance(error, ValueError):
  31. return jsonify(failed(str(error), code=400)), 400
  32. if isinstance(error, RuntimeError):
  33. return jsonify(failed(str(error), code=409)), 409
  34. return jsonify(failed("通用质量运营请求处理失败", code=500)), 500
  35. @bp.get("/quality-operations/templates")
  36. def list_quality_templates():
  37. try:
  38. return jsonify(
  39. success(get_quality_operations_service().list_templates())
  40. ), 200
  41. except Exception as error:
  42. return _error(error)
  43. @bp.post("/quality-operations/templates")
  44. def create_quality_template():
  45. try:
  46. record = get_quality_operations_service().create_template(
  47. _payload(),
  48. actor_uid=_actor_uid(),
  49. )
  50. return jsonify(success(record)), 201
  51. except Exception as error:
  52. return _error(error)
  53. @bp.post("/quality-operations/templates/<template_uid>/revisions")
  54. def revise_quality_template(template_uid):
  55. try:
  56. payload = _payload()
  57. record = get_quality_operations_service().revise_template(
  58. template_uid,
  59. payload.get("definition"),
  60. expected_version=int(payload.get("expected_version")),
  61. actor_uid=_actor_uid(),
  62. )
  63. return jsonify(success(record)), 201
  64. except Exception as error:
  65. return _error(error)
  66. @bp.post("/quality-operations/templates/<template_uid>/publish")
  67. def publish_quality_template(template_uid):
  68. try:
  69. payload = _payload()
  70. record = get_quality_operations_service().publish_template(
  71. template_uid,
  72. expected_version=int(payload.get("expected_version")),
  73. actor_uid=_actor_uid(),
  74. )
  75. return jsonify(success(record)), 200
  76. except Exception as error:
  77. return _error(error)
  78. @bp.post("/quality-operations/execute")
  79. def execute_quality_profile():
  80. try:
  81. record = get_quality_operations_service().execute(
  82. _payload(),
  83. actor_uid=_actor_uid(),
  84. )
  85. return jsonify(success(record)), 201
  86. except Exception as error:
  87. return _error(error)
  88. @bp.get("/quality-operations/runs")
  89. def list_quality_runs():
  90. try:
  91. records = get_quality_operations_service().list_runs(
  92. request.args.get("asset_uid")
  93. )
  94. return jsonify(success(records)), 200
  95. except Exception as error:
  96. return _error(error)
  97. @bp.get("/quality-operations/runs/<run_uid>")
  98. def get_quality_run(run_uid):
  99. try:
  100. return jsonify(
  101. success(get_quality_operations_service().get_run(run_uid))
  102. ), 200
  103. except Exception as error:
  104. return _error(error)
  105. @bp.get("/quality-operations/assets/<asset_uid>/trend")
  106. def get_quality_trend(asset_uid):
  107. try:
  108. return jsonify(
  109. success(get_quality_operations_service().trend(asset_uid))
  110. ), 200
  111. except Exception as error:
  112. return _error(error)