diff --git a/app/blueprints/auth.py b/app/blueprints/auth.py index e2d83fd..8800194 100644 --- a/app/blueprints/auth.py +++ b/app/blueprints/auth.py @@ -1,9 +1,10 @@ from flask import Blueprint from controllers import AuthController +from di_container import containers # Inisialisasi blueprint auth_blueprint = Blueprint("auth", __name__) -auth_controller = AuthController() +auth_controller = AuthController(containers.user_service, containers.auth_service) # Daftarkan rute ke controller diff --git a/app/blueprints/user.py b/app/blueprints/user.py index 2a5b93f..d5b7d5e 100644 --- a/app/blueprints/user.py +++ b/app/blueprints/user.py @@ -1,10 +1,10 @@ -# /blueprints/user.py - from flask import Blueprint from controllers import UserController +from di_container import container user_blueprint = Blueprint("user", __name__) -user_controller = UserController() + +user_controller = UserController(container.user_service) @user_blueprint.route("/users", methods=["GET"]) diff --git a/app/controllers/auth_controller.py b/app/controllers/auth_controller.py index 65c1c76..4e600d0 100644 --- a/app/controllers/auth_controller.py +++ b/app/controllers/auth_controller.py @@ -1,12 +1,13 @@ from flask import jsonify, request from services import UserService from services import AuthService +import sys class AuthController: - def __init__(self): - self.user_service = UserService() - self.auth_service = AuthService() + def __init__(self, userService: UserService, authService: AuthService): + self.user_service = userService + self.auth_service = authService def login(self): data = request.get_json() diff --git a/app/controllers/user_controller.py b/app/controllers/user_controller.py index cd1935d..d642a3b 100644 --- a/app/controllers/user_controller.py +++ b/app/controllers/user_controller.py @@ -4,8 +4,8 @@ from services import UserService class UserController: - def __init__(self): - self.user_service = UserService() + def __init__(self, userService: UserService): + self.user_service = userService def get_users(self): users = self.user_service.get_all_users() diff --git a/app/database/__init__.py b/app/database/__init__.py index bf18d99..56ebea4 100644 --- a/app/database/__init__.py +++ b/app/database/__init__.py @@ -1 +1,2 @@ + from .db import init_db diff --git a/app/database/db.py b/app/database/db.py index 4f88ef3..f6e4933 100644 --- a/app/database/db.py +++ b/app/database/db.py @@ -2,10 +2,18 @@ from flask_pymongo import PyMongo from flask import Flask from configs import Config -mongo = PyMongo() +def init_db(app: Flask) -> PyMongo: + try: + mongo = PyMongo(app) # Initialize PyMongo with the app + app.config["MONGO_URI"] = Config.MONGO_URI + print(f"Connecting to MongoDB: {Config.MONGO_URI}") -def init_db(app: Flask): - app.config["MONGO_URI"] = Config.MONGO_URI - print(Config.MONGO_URI) - mongo.init_app(app) + mongo.cx.server_info() # Ping the MongoDB server + print("✅ MongoDB connection successful!") + + return mongo + + except Exception as e: + print(f"❌ MongoDB connection failed: {e}") + return None # Handle failure gracefully diff --git a/app/di_container.py b/app/di_container.py new file mode 100644 index 0000000..e7baf56 --- /dev/null +++ b/app/di_container.py @@ -0,0 +1,42 @@ +from dependency_injector import containers, providers +from flask import Flask +from flask_pymongo import PyMongo +from repositories.user_repository import UserRepository +from services.user_service import UserService +from services.auth_service import AuthService + + +class Container(containers.DeclarativeContainer): + """Dependency Injection Container""" + + # Flask App Provider + app = providers.Singleton( + Flask, + import_name=__name__, + ) + + # Configurations + config = providers.Configuration() + + # Initialize MongoDB + mongo = providers.Singleton( + PyMongo, + app, + ) + + # Initialize Repositories + user_repository = providers.Factory( + UserRepository, + db=mongo.provided.db, + ) + + # Initialize Services + auth_service = providers.Factory( + AuthService, + user_repository=user_repository, + ) + + user_service = providers.Factory( + UserService, + user_repository=user_repository, + ) diff --git a/app/main.py b/app/main.py index dce2756..aecb997 100644 --- a/app/main.py +++ b/app/main.py @@ -1,21 +1,23 @@ -from flask import Flask from blueprints import auth_blueprint, user_blueprint, default_blueprint -from database import init_db -from configs import Config # Import the config class +from di_container import Container +from configs import Config +from flask import Flask -app = Flask(__name__) -# Apply configurations environtment -app.config["FLASK_ENV"] = Config.FLASK_ENV -app.config["DEBUG"] = Config.DEBUG +def createApp() -> Flask: + container = Container() -# Initialize database -init_db(app) + app = Flask(__name__) + app.container = container + + # Register Blueprints + app.register_blueprint(default_blueprint) + # app.register_blueprint(auth_blueprint, url_prefix="/api") + # app.register_blueprint(user_blueprint, url_prefix="/api") + + return app -# Register blueprints -app.register_blueprint(default_blueprint) -app.register_blueprint(auth_blueprint, url_prefix="/api") -app.register_blueprint(user_blueprint, url_prefix="/api") if __name__ == "__main__": + app = createApp() app.run(debug=Config.DEBUG) diff --git a/app/repositories/user_repository.py b/app/repositories/user_repository.py index 8b719eb..9ced596 100644 --- a/app/repositories/user_repository.py +++ b/app/repositories/user_repository.py @@ -1,24 +1,28 @@ +import sys + + class UserRepository: - users = [ - { - "id": 1, - "name": "akhdan", - "email": "akhdanre@gmail.com", - "password": "password123", - }, - { - "id": 2, - "name": "Bob", - "email": "bob@example.com", - "password": "password123", - }, - ] + + def __init__(self, db): + self.collection = db.users def get_all_users(self): - return self.users + 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 + except Exception as e: + print(f"❌ Error fetching users: {e}", file=sys.stderr) + return [] def get_user_by_email(self, email): - for user in self.users: - if user.get("email") == email: - return user - return None + 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 + 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 f834ef4..5e2680d 100644 --- a/app/services/auth_service.py +++ b/app/services/auth_service.py @@ -2,20 +2,24 @@ from repositories import UserRepository class AuthService: - def __init__(self): - self.user_repository = UserRepository() + def __init__(self, userRepository: UserRepository): + self.user_repository = userRepository def login(self, data): - email = data.get("email") - password = data.get("password") + try: + email = data.get("email") + password = data.get("password") - user_data = self.user_repository.get_user_by_email(email) + user_data = self.user_repository.get_user_by_email(email) + + if user_data == None: + return None + + if user_data["password"] == password: + del user_data["password"] + return user_data - if user_data == None: return None - - if user_data["password"] == password: - del user_data["password"] - return user_data - - return None + except Exception as e: + print(f"the issue is {e}") + return None diff --git a/requirement.txt b/requirement.txt index 2f43e12..db31d5a 100644 --- a/requirement.txt +++ b/requirement.txt @@ -3,3 +3,5 @@ numpy==2.1.2 pymongo Flask-PyMongo python-dotenv +dependency-injector +pytest