feat: main preparation for dependencies injection

This commit is contained in:
akhdanre 2025-02-18 17:32:56 +07:00
parent f9a4eb7bf2
commit 90ebd044e7
11 changed files with 123 additions and 58 deletions

View File

@ -1,9 +1,10 @@
from flask import Blueprint from flask import Blueprint
from controllers import AuthController from controllers import AuthController
from di_container import containers
# Inisialisasi blueprint # Inisialisasi blueprint
auth_blueprint = Blueprint("auth", __name__) auth_blueprint = Blueprint("auth", __name__)
auth_controller = AuthController() auth_controller = AuthController(containers.user_service, containers.auth_service)
# Daftarkan rute ke controller # Daftarkan rute ke controller

View File

@ -1,10 +1,10 @@
# /blueprints/user.py
from flask import Blueprint from flask import Blueprint
from controllers import UserController from controllers import UserController
from di_container import container
user_blueprint = Blueprint("user", __name__) user_blueprint = Blueprint("user", __name__)
user_controller = UserController()
user_controller = UserController(container.user_service)
@user_blueprint.route("/users", methods=["GET"]) @user_blueprint.route("/users", methods=["GET"])

View File

@ -1,12 +1,13 @@
from flask import jsonify, request from flask import jsonify, request
from services import UserService from services import UserService
from services import AuthService from services import AuthService
import sys
class AuthController: class AuthController:
def __init__(self): def __init__(self, userService: UserService, authService: AuthService):
self.user_service = UserService() self.user_service = userService
self.auth_service = AuthService() self.auth_service = authService
def login(self): def login(self):
data = request.get_json() data = request.get_json()

View File

@ -4,8 +4,8 @@ from services import UserService
class UserController: class UserController:
def __init__(self): def __init__(self, userService: UserService):
self.user_service = UserService() self.user_service = userService
def get_users(self): def get_users(self):
users = self.user_service.get_all_users() users = self.user_service.get_all_users()

View File

@ -1 +1,2 @@
from .db import init_db from .db import init_db

View File

@ -2,10 +2,18 @@ from flask_pymongo import PyMongo
from flask import Flask from flask import Flask
from configs import Config 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): mongo.cx.server_info() # Ping the MongoDB server
app.config["MONGO_URI"] = Config.MONGO_URI print("✅ MongoDB connection successful!")
print(Config.MONGO_URI)
mongo.init_app(app) return mongo
except Exception as e:
print(f"❌ MongoDB connection failed: {e}")
return None # Handle failure gracefully

42
app/di_container.py Normal file
View File

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

View File

@ -1,21 +1,23 @@
from flask import Flask
from blueprints import auth_blueprint, user_blueprint, default_blueprint from blueprints import auth_blueprint, user_blueprint, default_blueprint
from database import init_db from di_container import Container
from configs import Config # Import the config class from configs import Config
from flask import Flask
app = Flask(__name__)
# Apply configurations environtment def createApp() -> Flask:
app.config["FLASK_ENV"] = Config.FLASK_ENV container = Container()
app.config["DEBUG"] = Config.DEBUG
# Initialize database app = Flask(__name__)
init_db(app) 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__": if __name__ == "__main__":
app = createApp()
app.run(debug=Config.DEBUG) app.run(debug=Config.DEBUG)

View File

@ -1,24 +1,28 @@
import sys
class UserRepository: class UserRepository:
users = [
{ def __init__(self, db):
"id": 1, self.collection = db.users
"name": "akhdan",
"email": "akhdanre@gmail.com",
"password": "password123",
},
{
"id": 2,
"name": "Bob",
"email": "bob@example.com",
"password": "password123",
},
]
def get_all_users(self): 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): def get_user_by_email(self, email):
for user in self.users: try:
if user.get("email") == email: # user = mongo.db.find_one({"email": email}, {"_id": 0})
return user # print(f"✅ User Data for {email}: {user}", file=sys.stderr)
return None # return user if user else None
return None
except Exception as e:
print(f"❌ Error fetching user: {e}", file=sys.stderr)
return None

View File

@ -2,20 +2,24 @@ from repositories import UserRepository
class AuthService: class AuthService:
def __init__(self): def __init__(self, userRepository: UserRepository):
self.user_repository = UserRepository() self.user_repository = userRepository
def login(self, data): def login(self, data):
email = data.get("email") try:
password = data.get("password") 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 return None
except Exception as e:
if user_data["password"] == password: print(f"the issue is {e}")
del user_data["password"] return None
return user_data
return None

View File

@ -3,3 +3,5 @@ numpy==2.1.2
pymongo pymongo
Flask-PyMongo Flask-PyMongo
python-dotenv python-dotenv
dependency-injector
pytest