feat: adding user login schema response

This commit is contained in:
akhdanre 2025-05-15 23:45:41 +07:00
parent 596f498674
commit aae53cccce
5 changed files with 42 additions and 39 deletions

View File

@ -1,13 +1,12 @@
from flask import jsonify, request, current_app
from pydantic import ValidationError
from app.models.login.login_response import UserResponseModel
from app.schemas.basic_response_schema import ResponseSchema
from app.schemas.google_login_schema import GoogleLoginSchema
from app.schemas import LoginSchema
from app.services import UserService, AuthService
from app.exception import AuthException
from app.mapper import UserMapper
from app.helpers import make_response
from app.helpers import make_response, make_error_response
import logging
logging = logging.getLogger(__name__)
@ -26,15 +25,7 @@ class AuthController:
if response is None:
return make_response(message="User is not registered", status_code=401)
return (
jsonify(
ResponseSchema(
message="Register success",
data=UserMapper.user_entity_to_response(response),
).model_dump()
),
200,
)
return make_response(message="Login success", data=response)
except ValidationError as e:
current_app.logger.error(f"Validation error: {e}")
response = ResponseSchema(message="Invalid input", data=None, meta=None)
@ -54,25 +45,14 @@ class AuthController:
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
return make_response(message="Invalid Google ID Token", data=user_info)
response = ResponseSchema(
message="Login successful",
data=UserMapper.user_entity_to_response(user_info),
meta=None,
)
return jsonify(response.model_dump()), 200
return make_response(message="Login Success", data=user_info)
except ValidationError as e:
current_app.logger.error(f"Validation error: {e}")

View File

@ -1,7 +1,9 @@
from datetime import datetime
from typing import Dict, Optional
from app.models import UserEntity, UserResponseModel
from app.models import UserEntity
from app.schemas import RegisterSchema
from app.schemas.response import LoginResponseSchema
from app.helpers import DatetimeUtil
class UserMapper:
@ -41,17 +43,15 @@ class UserMapper:
)
@staticmethod
def user_entity_to_response(user: UserEntity) -> UserResponseModel:
print(str(user.id))
return UserResponseModel(
_id=str(user.id) if user.id else None,
google_id=user.google_id,
def user_entity_to_response(user: UserEntity) -> LoginResponseSchema:
return LoginResponseSchema(
id=str(user.id) if user.id else None,
email=user.email,
name=user.name,
birth_date=user.birth_date,
birth_date=(
DatetimeUtil.to_string(user.birth_date) if user.birth_date else None
),
pic_url=user.pic_url,
phone=user.phone,
locale=user.locale,
# created_at=user.created_at,
# updated_at=user.updated_at,
)

View File

@ -6,6 +6,7 @@ from .history.history_response import HistoryResultSchema
from .history.detail_history_response import QuizHistoryResponse, QuestionResult
from .recomendation.recomendation_response_schema import ListingQuizResponse
from .subject.get_subject_schema import GetSubjectResponse
from .auth.login_response import LoginResponseSchema
__all__ = [
"QuizCreationResponse",
@ -17,4 +18,5 @@ __all__ = [
"QuestionResult",
"ListingQuizResponse",
"GetSubjectResponse",
"LoginResponseSchema",
]

View File

@ -0,0 +1,14 @@
from pydantic import BaseModel, EmailStr, field_serializer
from app.models import UserEntity
from typing import Optional
from datetime import datetime
class LoginResponseSchema(BaseModel):
id: str
email: EmailStr
name: str
birth_date: Optional[str] = None
pic_url: Optional[str] = None
phone: Optional[str] = None
locale: Optional[str] = None

View File

@ -1,4 +1,5 @@
from app.schemas import LoginSchema
from app.schemas.response import LoginResponseSchema
from app.repositories import UserRepository
from app.mapper import UserMapper
from google.oauth2 import id_token
@ -6,6 +7,8 @@ from google.auth.transport import requests
from app.configs import Config
from app.exception import AuthException
from werkzeug.security import check_password_hash
from app.helpers import DatetimeUtil
from app.mapper import UserMapper
class AuthService:
@ -23,14 +26,17 @@ class AuthService:
existing_user = self.user_repository.get_by_google_id(google_id)
if existing_user:
if existing_user.email == email:
return existing_user
return UserMapper.user_entity_to_response(existing_user)
raise AuthException("Email not match")
new_user = UserMapper.from_google_payload(google_id, email, payload)
user_id = self.user_repository.insert_user(user_data=new_user)
return self.user_repository.get_user_by_id(user_id=user_id)
user_data = self.user_repository.get_user_by_id(user_id=user_id)
return UserMapper.user_entity_to_response(user_data)
def login(self, data: LoginSchema):
user_data = self.user_repository.get_user_by_email(data.email)
@ -38,7 +44,8 @@ class AuthService:
if user_data is None:
return None
if check_password_hash(user_data.password, data.password):
user_data.password = None
return user_data
return None
if not check_password_hash(user_data.password, data.password):
return None
user_data.password = None
return UserMapper.user_entity_to_response(user_data)