from flask import jsonify, request, current_app from pydantic import ValidationError from schemas.basic_response_schema import ResponseSchema from schemas.google_login_schema import GoogleLoginSchema from schemas import LoginSchema from services import UserService, AuthService from exception import AuthException class AuthController: def __init__(self, userService: UserService, authService: AuthService): self.user_service = userService self.auth_service = authService def login(self): try: data = request.get_json() dataSchema = LoginSchema(**data) response = self.auth_service.login(dataSchema) return ( jsonify( ResponseSchema( message="Register success", data=response ).model_dump() ), 200, ) except ValidationError as e: current_app.logger.error(f"Validation error: {e}") response = ResponseSchema(message="Invalid input", data=None, meta=None) return jsonify(response.model_dump()), 400 except Exception as e: current_app.logger.error( f"Error during Google login: {str(e)}", exc_info=True ) response = ResponseSchema( message="Internal server error", data=None, meta=None ) return jsonify(response.model_dump()), 500 def google_login(self): """Handles Google Login via ID Token verification""" try: data = request.get_json() # Validasi data dengan Pydantic validated_data = GoogleLoginSchema(**data) id_token = validated_data.token_id # Verifikasi ID Token ke layanan AuthService user_info = self.auth_service.verify_google_id_token(id_token) if not user_info: current_app.logger.error("Invalid Google ID Token") response = ResponseSchema( message="Invalid Google ID Token", data=None, meta=None ) return jsonify(response.model_dump()), 401 response = ResponseSchema( message="Login successful", data=user_info, meta=None, ) return jsonify(response.model_dump()), 200 except ValidationError as e: current_app.logger.error(f"Validation error: {e}") response = ResponseSchema(message="Invalid input", data=None, meta=None) return jsonify(response.model_dump()), 400 except AuthException as e: current_app.logger.error(f"Auth error: {e}") response = ResponseSchema(message=e, data=None, meta=None) return jsonify(response.model_dump()), 400 except Exception as e: current_app.logger.error( f"Error during Google login: {str(e)}", exc_info=True ) response = ResponseSchema( message="Internal server error", data=None, meta=None ) return jsonify(response.model_dump()), 500 def logout(self): return jsonify({"message": "logout"}), 200