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 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

View File

@ -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"])

View File

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

View File

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

View File

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

View File

@ -2,10 +2,18 @@ from flask_pymongo import PyMongo
from flask import Flask
from configs import Config
mongo = PyMongo()
def init_db(app: Flask):
def init_db(app: Flask) -> PyMongo:
try:
mongo = PyMongo(app) # Initialize PyMongo with the app
app.config["MONGO_URI"] = Config.MONGO_URI
print(Config.MONGO_URI)
mongo.init_app(app)
print(f"Connecting to MongoDB: {Config.MONGO_URI}")
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

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 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
def createApp() -> Flask:
container = Container()
app = Flask(__name__)
app.container = container
# Apply configurations environtment
app.config["FLASK_ENV"] = Config.FLASK_ENV
app.config["DEBUG"] = Config.DEBUG
# Initialize database
init_db(app)
# Register blueprints
# Register Blueprints
app.register_blueprint(default_blueprint)
app.register_blueprint(auth_blueprint, url_prefix="/api")
app.register_blueprint(user_blueprint, url_prefix="/api")
# app.register_blueprint(auth_blueprint, url_prefix="/api")
# app.register_blueprint(user_blueprint, url_prefix="/api")
return app
if __name__ == "__main__":
app = createApp()
app.run(debug=Config.DEBUG)

View File

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

View File

@ -2,10 +2,11 @@ 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):
try:
email = data.get("email")
password = data.get("password")
@ -19,3 +20,6 @@ class AuthService:
return user_data
return None
except Exception as e:
print(f"the issue is {e}")
return None

View File

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