feat: dependencies injection

This commit is contained in:
akhdanre 2025-02-19 08:49:18 +07:00
parent 90ebd044e7
commit c46a43160c
5 changed files with 34 additions and 38 deletions

View File

@ -1,3 +1,5 @@
from .default import default_blueprint from .default import default_blueprint
from .auth import auth_blueprint from .auth import auth_blueprint
from .user import user_blueprint
# from .user import user_blueprint

View File

@ -1,23 +1,25 @@
from flask import Blueprint from flask import Blueprint
from controllers import AuthController from controllers import AuthController
from di_container import containers from di_container import Container
from dependency_injector.wiring import inject, Provide
# Inisialisasi blueprint
auth_blueprint = Blueprint("auth", __name__) auth_blueprint = Blueprint("auth", __name__)
auth_controller = AuthController(containers.user_service, containers.auth_service)
# Daftarkan rute ke controller
@auth_blueprint.route("/register", methods=["POST"]) @auth_blueprint.route("/register", methods=["POST"])
def register(): @inject
def register(auth_controller: AuthController = Provide[Container.auth_controller]):
return auth_controller.register() return auth_controller.register()
@auth_blueprint.route("/login", methods=["POST"]) @auth_blueprint.route("/login", methods=["POST"])
def login(): @inject
def login(auth_controller: AuthController = Provide[Container.auth_controller]):
return auth_controller.login() return auth_controller.login()
@auth_blueprint.route("/logout", methods=["DELETE"]) @auth_blueprint.route("/logout", methods=["DELETE"])
def logout(): @inject
def logout(auth_controller: AuthController = Provide[Container.auth_controller]):
return auth_controller.logout() return auth_controller.logout()

View File

@ -1,17 +1,21 @@
from flask_pymongo import PyMongo from flask_pymongo import PyMongo
from flask import Flask from flask import Flask
from configs import Config from configs import Config
from di_container import Container # Import your container
def init_db(app: Flask) -> PyMongo: def init_db(app: Flask, container: Container) -> PyMongo:
try: try:
mongo = PyMongo(app) # Initialize PyMongo with the app
app.config["MONGO_URI"] = Config.MONGO_URI app.config["MONGO_URI"] = Config.MONGO_URI
mongo = PyMongo(app) # Initialize PyMongo with the app
print(f"Connecting to MongoDB: {Config.MONGO_URI}") print(f"Connecting to MongoDB: {Config.MONGO_URI}")
mongo.cx.server_info() # Ping the MongoDB server mongo.cx.server_info() # Ping the MongoDB server
print("✅ MongoDB connection successful!") print("✅ MongoDB connection successful!")
# Store the MongoDB instance in the container
container.mongo.override(mongo)
return mongo return mongo
except Exception as e: except Exception as e:

View File

@ -1,42 +1,25 @@
from dependency_injector import containers, providers from dependency_injector import containers, providers
from flask import Flask
from flask_pymongo import PyMongo
from repositories.user_repository import UserRepository from repositories.user_repository import UserRepository
from services.user_service import UserService from services import UserService, AuthService
from services.auth_service import AuthService from controllers import AuthController
class Container(containers.DeclarativeContainer): class Container(containers.DeclarativeContainer):
"""Dependency Injection Container""" """Dependency Injection Container"""
# Flask App Provider mongo = providers.Singleton(lambda: None)
app = providers.Singleton(
Flask,
import_name=__name__,
)
# Configurations
config = providers.Configuration()
# Initialize MongoDB
mongo = providers.Singleton(
PyMongo,
app,
)
# Initialize Repositories
user_repository = providers.Factory( user_repository = providers.Factory(
UserRepository, UserRepository,
db=mongo.provided.db, mongo.db,
) )
# Initialize Services
auth_service = providers.Factory( auth_service = providers.Factory(
AuthService, AuthService,
user_repository=user_repository, user_repository,
) )
user_service = providers.Factory( auth_controller = providers.Factory(
UserService, AuthController,
user_repository=user_repository, AuthService,
) )

View File

@ -1,18 +1,23 @@
from blueprints import auth_blueprint, user_blueprint, default_blueprint from blueprints import default_blueprint
from di_container import Container from di_container import Container
from configs import Config from configs import Config
from flask import Flask from flask import Flask
from blueprints import auth_blueprint
from database import init_db
def createApp() -> Flask: def createApp() -> Flask:
container = Container()
app = Flask(__name__) app = Flask(__name__)
container = Container()
init_db(app, container)
app.container = container app.container = container
# Register Blueprints # Register Blueprints
app.register_blueprint(default_blueprint) app.register_blueprint(default_blueprint)
# app.register_blueprint(auth_blueprint, url_prefix="/api") app.register_blueprint(auth_blueprint, url_prefix="/api")
# app.register_blueprint(user_blueprint, url_prefix="/api") # app.register_blueprint(user_blueprint, url_prefix="/api")
return app return app