app_import.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from typing import cast
  2. from flask_login import current_user # type: ignore
  3. from flask_restful import Resource, marshal_with, reqparse # type: ignore
  4. from sqlalchemy.orm import Session
  5. from werkzeug.exceptions import Forbidden
  6. from controllers.console.wraps import (
  7. account_initialization_required,
  8. setup_required,
  9. )
  10. from extensions.ext_database import db
  11. from fields.app_fields import app_import_fields
  12. from libs.login import login_required
  13. from models import Account
  14. from services.app_dsl_service import AppDslService, ImportStatus
  15. class AppImportApi(Resource):
  16. @setup_required
  17. @login_required
  18. @account_initialization_required
  19. @marshal_with(app_import_fields)
  20. def post(self):
  21. # Check user role first
  22. if not current_user.is_editor:
  23. raise Forbidden()
  24. parser = reqparse.RequestParser()
  25. parser.add_argument("mode", type=str, required=True, location="json")
  26. parser.add_argument("yaml_content", type=str, location="json")
  27. parser.add_argument("yaml_url", type=str, location="json")
  28. parser.add_argument("name", type=str, location="json")
  29. parser.add_argument("description", type=str, location="json")
  30. parser.add_argument("icon_type", type=str, location="json")
  31. parser.add_argument("icon", type=str, location="json")
  32. parser.add_argument("icon_background", type=str, location="json")
  33. parser.add_argument("app_id", type=str, location="json")
  34. args = parser.parse_args()
  35. # Create service with session
  36. with Session(db.engine) as session:
  37. import_service = AppDslService(session)
  38. # Import app
  39. account = cast(Account, current_user)
  40. result = import_service.import_app(
  41. account=account,
  42. import_mode=args["mode"],
  43. yaml_content=args.get("yaml_content"),
  44. yaml_url=args.get("yaml_url"),
  45. name=args.get("name"),
  46. description=args.get("description"),
  47. icon_type=args.get("icon_type"),
  48. icon=args.get("icon"),
  49. icon_background=args.get("icon_background"),
  50. app_id=args.get("app_id"),
  51. )
  52. session.commit()
  53. # Return appropriate status code based on result
  54. status = result.status
  55. if status == ImportStatus.FAILED.value:
  56. return result.model_dump(mode="json"), 400
  57. elif status == ImportStatus.PENDING.value:
  58. return result.model_dump(mode="json"), 202
  59. return result.model_dump(mode="json"), 200
  60. class AppImportConfirmApi(Resource):
  61. @setup_required
  62. @login_required
  63. @account_initialization_required
  64. @marshal_with(app_import_fields)
  65. def post(self, import_id):
  66. # Check user role first
  67. if not current_user.is_editor:
  68. raise Forbidden()
  69. # Create service with session
  70. with Session(db.engine) as session:
  71. import_service = AppDslService(session)
  72. # Confirm import
  73. account = cast(Account, current_user)
  74. result = import_service.confirm_import(import_id=import_id, account=account)
  75. session.commit()
  76. # Return appropriate status code based on result
  77. if result.status == ImportStatus.FAILED.value:
  78. return result.model_dump(mode="json"), 400
  79. return result.model_dump(mode="json"), 200