From 19b7500bb6504a03cfcf1d2dbe9e348c1241e8f9 Mon Sep 17 00:00:00 2001 From: akhdanre Date: Wed, 26 Feb 2025 12:57:47 +0700 Subject: [PATCH] feat: finish login system - adding response based model dto - adding logic for login system --- app/controllers/auth_controller.py | 11 ++++------- app/di_container.py | 2 +- app/models/__init__.py | 1 + app/models/dto/__init__.py | 1 + app/models/dto/response.py | 22 ++++++++++++++++++++++ app/repositories/user_repository.py | 17 ++++++----------- app/services/auth_service.py | 13 +++++++++---- 7 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 app/models/dto/__init__.py create mode 100644 app/models/dto/response.py diff --git a/app/controllers/auth_controller.py b/app/controllers/auth_controller.py index 791f26c..fdae935 100644 --- a/app/controllers/auth_controller.py +++ b/app/controllers/auth_controller.py @@ -11,13 +11,10 @@ class AuthController: def login(self): data = request.get_json() - users = self.auth_service.login(data) - response = { - "status": True, - "message": "success retrive data", - "data": users, - } - return jsonify(response) + response = self.auth_service.login(data) + if response.success: + return jsonify(response.to_dict()), 200 + return jsonify(response.to_dict()), 400 def register(self): return jsonify({"message": "register"}) diff --git a/app/di_container.py b/app/di_container.py index c488b80..69613f1 100644 --- a/app/di_container.py +++ b/app/di_container.py @@ -17,4 +17,4 @@ class Container(containers.DeclarativeContainer): user_service = providers.Factory(UserService, user_repository) # controllers - auth_controller = providers.Factory(AuthController, auth_service, user_service) + auth_controller = providers.Factory(AuthController, user_service, auth_service) diff --git a/app/models/__init__.py b/app/models/__init__.py index e69de29..fe3deb7 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -0,0 +1 @@ +from .dto import ApiResponse diff --git a/app/models/dto/__init__.py b/app/models/dto/__init__.py new file mode 100644 index 0000000..6c1aab3 --- /dev/null +++ b/app/models/dto/__init__.py @@ -0,0 +1 @@ +from .response import ApiResponse diff --git a/app/models/dto/response.py b/app/models/dto/response.py new file mode 100644 index 0000000..53a462f --- /dev/null +++ b/app/models/dto/response.py @@ -0,0 +1,22 @@ +from pydantic import BaseModel +from typing import Generic, TypeVar, Optional + +T = TypeVar("T") + + +class ApiResponse(BaseModel, Generic[T]): + success: bool + message: str + data: Optional[T] = None + + def to_json(self) -> str: + """ + Convert the model to a properly formatted JSON string. + """ + return self.model_dump_json(indent=4) + + def to_dict(self) -> dict: + """ + Convert the model to a dictionary with proper key-value pairs. + """ + return self.model_dump() diff --git a/app/repositories/user_repository.py b/app/repositories/user_repository.py index 9ced596..38207ae 100644 --- a/app/repositories/user_repository.py +++ b/app/repositories/user_repository.py @@ -8,21 +8,16 @@ class UserRepository: def get_all_users(self): try: - # mongo.db.command("ping") - # # Retrieve all users, excluding "_id" - # users = list(self.collection.find({}, {"_id": 0})) - # print(f"✅ All Users Data: {users}", file=sys.stderr) - return None + + users = list(self.collection.find({}, {"_id": 0})) + + return users if users else [] except Exception as e: - print(f"❌ Error fetching users: {e}", file=sys.stderr) return [] def get_user_by_email(self, email): try: - # user = mongo.db.find_one({"email": email}, {"_id": 0}) - # print(f"✅ User Data for {email}: {user}", file=sys.stderr) - # return user if user else None - return None + user = self.collection.find_one({"email": email}, {"_id": 0}) + return user if user else None except Exception as e: - print(f"❌ Error fetching user: {e}", file=sys.stderr) return None diff --git a/app/services/auth_service.py b/app/services/auth_service.py index 5e2680d..a259106 100644 --- a/app/services/auth_service.py +++ b/app/services/auth_service.py @@ -1,4 +1,5 @@ from repositories import UserRepository +from models import ApiResponse class AuthService: @@ -13,13 +14,17 @@ class AuthService: user_data = self.user_repository.get_user_by_email(email) if user_data == None: - return None + return ApiResponse(success=False, message="User not found", data=None) if user_data["password"] == password: del user_data["password"] - return user_data + return ApiResponse( + success=True, message="Login success", data=user_data + ) - return None + return ApiResponse(success=False, message="Invalid password", data=None) except Exception as e: print(f"the issue is {e}") - return None + return ApiResponse( + success=False, message="Internal server error", data=None + )