feat: main preparation for dependencies injection
This commit is contained in:
parent
f9a4eb7bf2
commit
90ebd044e7
|
@ -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
|
||||||
|
|
|
@ -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"])
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
|
|
||||||
from .db import init_db
|
from .db import init_db
|
||||||
|
|
|
@ -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:
|
||||||
def init_db(app: Flask):
|
try:
|
||||||
|
mongo = PyMongo(app) # Initialize PyMongo with the app
|
||||||
app.config["MONGO_URI"] = Config.MONGO_URI
|
app.config["MONGO_URI"] = Config.MONGO_URI
|
||||||
print(Config.MONGO_URI)
|
print(f"Connecting to MongoDB: {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
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
28
app/main.py
28
app/main.py
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
def createApp() -> Flask:
|
||||||
|
container = Container()
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
app.container = container
|
||||||
|
|
||||||
# Apply configurations environtment
|
# Register Blueprints
|
||||||
app.config["FLASK_ENV"] = Config.FLASK_ENV
|
|
||||||
app.config["DEBUG"] = Config.DEBUG
|
|
||||||
|
|
||||||
# Initialize database
|
|
||||||
init_db(app)
|
|
||||||
|
|
||||||
# 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
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
app = createApp()
|
||||||
app.run(debug=Config.DEBUG)
|
app.run(debug=Config.DEBUG)
|
||||||
|
|
|
@ -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 user if user else None
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ Error fetching user: {e}", file=sys.stderr)
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -2,10 +2,11 @@ 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):
|
||||||
|
try:
|
||||||
email = data.get("email")
|
email = data.get("email")
|
||||||
password = data.get("password")
|
password = data.get("password")
|
||||||
|
|
||||||
|
@ -19,3 +20,6 @@ class AuthService:
|
||||||
return user_data
|
return user_data
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
print(f"the issue is {e}")
|
||||||
|
return None
|
||||||
|
|
|
@ -3,3 +3,5 @@ numpy==2.1.2
|
||||||
pymongo
|
pymongo
|
||||||
Flask-PyMongo
|
Flask-PyMongo
|
||||||
python-dotenv
|
python-dotenv
|
||||||
|
dependency-injector
|
||||||
|
pytest
|
||||||
|
|
Loading…
Reference in New Issue