From aae53cccce562ba8b294b46bd447a1693128b61a Mon Sep 17 00:00:00 2001 From: akhdanre Date: Thu, 15 May 2025 23:45:41 +0700 Subject: [PATCH] feat: adding user login schema response --- app/controllers/auth_controller.py | 28 +++------------------ app/mapper/user_mapper.py | 18 ++++++------- app/schemas/response/__init__.py | 2 ++ app/schemas/response/auth/login_response.py | 14 +++++++++++ app/services/auth_service.py | 19 +++++++++----- 5 files changed, 42 insertions(+), 39 deletions(-) create mode 100644 app/schemas/response/auth/login_response.py diff --git a/app/controllers/auth_controller.py b/app/controllers/auth_controller.py index 3e76fe6..19ed49a 100644 --- a/app/controllers/auth_controller.py +++ b/app/controllers/auth_controller.py @@ -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}") diff --git a/app/mapper/user_mapper.py b/app/mapper/user_mapper.py index 378bc34..d0d352c 100644 --- a/app/mapper/user_mapper.py +++ b/app/mapper/user_mapper.py @@ -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, ) diff --git a/app/schemas/response/__init__.py b/app/schemas/response/__init__.py index c921368..5ffa92b 100644 --- a/app/schemas/response/__init__.py +++ b/app/schemas/response/__init__.py @@ -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", ] diff --git a/app/schemas/response/auth/login_response.py b/app/schemas/response/auth/login_response.py new file mode 100644 index 0000000..8c634a0 --- /dev/null +++ b/app/schemas/response/auth/login_response.py @@ -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 diff --git a/app/services/auth_service.py b/app/services/auth_service.py index f32ebe0..d0ff3ff 100644 --- a/app/services/auth_service.py +++ b/app/services/auth_service.py @@ -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)