feat: finish login system

- adding response based model dto
- adding logic for login system
This commit is contained in:
akhdanre 2025-02-26 12:57:47 +07:00
parent 06ae096c20
commit 19b7500bb6
7 changed files with 44 additions and 23 deletions

View File

@ -11,13 +11,10 @@ class AuthController:
def login(self): def login(self):
data = request.get_json() data = request.get_json()
users = self.auth_service.login(data) response = self.auth_service.login(data)
response = { if response.success:
"status": True, return jsonify(response.to_dict()), 200
"message": "success retrive data", return jsonify(response.to_dict()), 400
"data": users,
}
return jsonify(response)
def register(self): def register(self):
return jsonify({"message": "register"}) return jsonify({"message": "register"})

View File

@ -17,4 +17,4 @@ class Container(containers.DeclarativeContainer):
user_service = providers.Factory(UserService, user_repository) user_service = providers.Factory(UserService, user_repository)
# controllers # controllers
auth_controller = providers.Factory(AuthController, auth_service, user_service) auth_controller = providers.Factory(AuthController, user_service, auth_service)

View File

@ -0,0 +1 @@
from .dto import ApiResponse

View File

@ -0,0 +1 @@
from .response import ApiResponse

View File

@ -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()

View File

@ -8,21 +8,16 @@ class UserRepository:
def get_all_users(self): def get_all_users(self):
try: try:
# mongo.db.command("ping")
# # Retrieve all users, excluding "_id" users = list(self.collection.find({}, {"_id": 0}))
# users = list(self.collection.find({}, {"_id": 0}))
# print(f"✅ All Users Data: {users}", file=sys.stderr) return users if users else []
return None
except Exception as e: except Exception as e:
print(f"❌ Error fetching users: {e}", file=sys.stderr)
return [] return []
def get_user_by_email(self, email): def get_user_by_email(self, email):
try: try:
# user = mongo.db.find_one({"email": email}, {"_id": 0}) user = self.collection.find_one({"email": email}, {"_id": 0})
# print(f"✅ User Data for {email}: {user}", file=sys.stderr) return user if user else None
# return user if user else None
return None
except Exception as e: except Exception as e:
print(f"❌ Error fetching user: {e}", file=sys.stderr)
return None return None

View File

@ -1,4 +1,5 @@
from repositories import UserRepository from repositories import UserRepository
from models import ApiResponse
class AuthService: class AuthService:
@ -13,13 +14,17 @@ class AuthService:
user_data = self.user_repository.get_user_by_email(email) user_data = self.user_repository.get_user_by_email(email)
if user_data == None: if user_data == None:
return None return ApiResponse(success=False, message="User not found", data=None)
if user_data["password"] == password: if user_data["password"] == password:
del user_data["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: except Exception as e:
print(f"the issue is {e}") print(f"the issue is {e}")
return None return ApiResponse(
success=False, message="Internal server error", data=None
)