domain_templates.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. """Management API for generic governance domain templates."""
  2. from __future__ import annotations
  3. from flask import g, jsonify, request
  4. from app import db
  5. from app.api.meta_data import bp
  6. from app.core.governance.domain_template_repository import (
  7. SqlAlchemyDomainTemplateRepository,
  8. )
  9. from app.core.governance.domain_templates import (
  10. DomainTemplateNotFound,
  11. DomainTemplateService,
  12. DomainTemplateValidationError,
  13. )
  14. from app.models.result import failed, success
  15. def _service():
  16. return DomainTemplateService(SqlAlchemyDomainTemplateRepository(db.session))
  17. @bp.route("/domain-templates", methods=["GET"])
  18. def list_domain_templates():
  19. return jsonify(success(_service().list_templates()))
  20. @bp.route("/domain-templates/<template_code>", methods=["GET"])
  21. def get_domain_template(template_code):
  22. try:
  23. return jsonify(success(_service().get_template(template_code)))
  24. except DomainTemplateNotFound as exc:
  25. return jsonify(failed(str(exc), code=404)), 404
  26. except DomainTemplateValidationError as exc:
  27. return jsonify(failed(str(exc), code=400)), 400
  28. @bp.route("/domain-templates/<template_code>/imports", methods=["GET"])
  29. def list_domain_template_imports(template_code):
  30. try:
  31. return jsonify(success(_service().list_imports(template_code)))
  32. except DomainTemplateValidationError as exc:
  33. return jsonify(failed(str(exc), code=400)), 400
  34. @bp.route("/domain-templates/dry-run", methods=["POST"])
  35. def dry_run_domain_template():
  36. try:
  37. return jsonify(success(_service().dry_run(request.get_json(silent=True))))
  38. except DomainTemplateValidationError as exc:
  39. return jsonify(failed(str(exc), code=400)), 400
  40. @bp.route("/domain-templates/import", methods=["POST"])
  41. def import_domain_template():
  42. try:
  43. result = _service().import_template(
  44. request.get_json(silent=True),
  45. actor_uid=g.current_user["id"],
  46. )
  47. db.session.commit()
  48. return jsonify(success(result, "领域模板已导入"))
  49. except DomainTemplateValidationError as exc:
  50. db.session.rollback()
  51. return jsonify(failed(str(exc), code=400)), 400
  52. except Exception:
  53. db.session.rollback()
  54. raise
  55. @bp.route("/domain-templates/<template_code>/rollback", methods=["POST"])
  56. def rollback_domain_template(template_code):
  57. try:
  58. body = request.get_json(silent=True) or {}
  59. target_version = body.get("target_version")
  60. if isinstance(target_version, bool):
  61. target_version = None
  62. if isinstance(target_version, str) and target_version.isdigit():
  63. target_version = int(target_version)
  64. result = _service().rollback(
  65. template_code,
  66. target_version=target_version,
  67. actor_uid=g.current_user["id"],
  68. )
  69. db.session.commit()
  70. return jsonify(success(result, "领域模板已回滚为新版本"))
  71. except DomainTemplateNotFound as exc:
  72. db.session.rollback()
  73. return jsonify(failed(str(exc), code=404)), 404
  74. except DomainTemplateValidationError as exc:
  75. db.session.rollback()
  76. return jsonify(failed(str(exc), code=400)), 400
  77. except Exception:
  78. db.session.rollback()
  79. raise