activate.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import datetime
  2. from flask import request
  3. from flask_restful import Resource, reqparse
  4. from constants.languages import supported_language
  5. from controllers.console import api
  6. from controllers.console.error import AlreadyActivateError
  7. from extensions.ext_database import db
  8. from libs.helper import StrLen, email, extract_remote_ip, timezone
  9. from models.account import AccountStatus, Tenant
  10. from services.account_service import AccountService, RegisterService
  11. class ActivateCheckApi(Resource):
  12. def get(self):
  13. parser = reqparse.RequestParser()
  14. parser.add_argument("workspace_id", type=str, required=False, nullable=True, location="args")
  15. parser.add_argument("email", type=email, required=False, nullable=True, location="args")
  16. parser.add_argument("token", type=str, required=True, nullable=False, location="args")
  17. args = parser.parse_args()
  18. workspaceId = args["workspace_id"]
  19. reg_email = args["email"]
  20. token = args["token"]
  21. invitation = RegisterService.get_invitation_if_token_valid(workspaceId, reg_email, token)
  22. if invitation:
  23. data = invitation.get("data", {})
  24. tenant: Tenant = invitation.get("tenant", None)
  25. workspace_name = tenant.name if tenant else None
  26. workspace_id = tenant.id if tenant else None
  27. invitee_email = data.get("email") if data else None
  28. return {
  29. "is_valid": invitation is not None,
  30. "data": {"workspace_name": workspace_name, "workspace_id": workspace_id, "email": invitee_email},
  31. }
  32. else:
  33. return {"is_valid": False}
  34. class ActivateApi(Resource):
  35. def post(self):
  36. parser = reqparse.RequestParser()
  37. parser.add_argument("workspace_id", type=str, required=False, nullable=True, location="json")
  38. parser.add_argument("email", type=email, required=False, nullable=True, location="json")
  39. parser.add_argument("token", type=str, required=True, nullable=False, location="json")
  40. parser.add_argument("name", type=StrLen(30), required=True, nullable=False, location="json")
  41. parser.add_argument(
  42. "interface_language", type=supported_language, required=True, nullable=False, location="json"
  43. )
  44. parser.add_argument("timezone", type=timezone, required=True, nullable=False, location="json")
  45. args = parser.parse_args()
  46. invitation = RegisterService.get_invitation_if_token_valid(args["workspace_id"], args["email"], args["token"])
  47. if invitation is None:
  48. raise AlreadyActivateError()
  49. RegisterService.revoke_token(args["workspace_id"], args["email"], args["token"])
  50. account = invitation["account"]
  51. account.name = args["name"]
  52. account.interface_language = args["interface_language"]
  53. account.timezone = args["timezone"]
  54. account.interface_theme = "light"
  55. account.status = AccountStatus.ACTIVE.value
  56. account.initialized_at = datetime.datetime.now(datetime.timezone.utc).replace(tzinfo=None)
  57. db.session.commit()
  58. token_pair = AccountService.login(account, ip_address=extract_remote_ip(request))
  59. return {"result": "success", "data": token_pair.model_dump()}
  60. api.add_resource(ActivateCheckApi, "/activate/check")
  61. api.add_resource(ActivateApi, "/activate")