TIF_E41211115_Genso_quiz_ba.../app/controllers/auth_controller.py

76 lines
2.7 KiB
Python

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 core import AuthException
class AuthController:
def __init__(self, userService: UserService, authService: AuthService):
self.user_service = userService
self.auth_service = authService
def login(self):
data = request.get_json()
dataSchema = LoginSchema(**data)
response = self.auth_service.login(dataSchema)
if response.success:
return jsonify(response.to_dict()), 200
return jsonify(response.to_dict()), 400
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 register(self):
return jsonify({"message": "register"}), 200
def logout(self):
return jsonify({"message": "logout"}), 200
def test(self):
return "test"