diff --git a/backend/.env b/backend/.env index b686fce..7841a24 100644 --- a/backend/.env +++ b/backend/.env @@ -1 +1,4 @@ -DATABASE_URL=sqlite:///./wheel.db \ No newline at end of file +DATABASE_URL=sqlite:///./wheel.db + +LOG_ENABLED=true +LOG_LEVEL=DEBUG \ No newline at end of file diff --git a/backend/api/admin.py b/backend/api/admin.py index afc31ed..1677316 100644 --- a/backend/api/admin.py +++ b/backend/api/admin.py @@ -7,11 +7,11 @@ from sqlalchemy.orm import Session import schemas from schemas import ItemResponse from services import crud - from app.db.session import SessionLocal - +from core.logger import get_logger router = APIRouter() +logger = get_logger('admin') def get_db(): @@ -25,7 +25,13 @@ def get_db(): # GET ALL ITEMS @router.get("/items", response_model=list[ItemResponse]) def get_items(db: Session = Depends(get_db)): - return crud.get_items(db) + try: + items = crud.get_items(db) + logger.info(f"Items fetched: {len(items)} items") + return items + except Exception as e: + logger.error(f"Error fetching items: {e}") + raise # CREATE ITEM @@ -34,7 +40,13 @@ def create_item( item: schemas.ItemCreate, db: Session = Depends(get_db) ): - return crud.create_item(db, item.title) + try: + result = crud.create_item(db, item.title) + logger.info(f"Item created: {item.title}") + return result + except Exception as e: + logger.error(f"Error creating item: {e}") + raise # DELETE ITEM @@ -43,7 +55,15 @@ def delete_item( item_id: int, db: Session = Depends(get_db) ): - item = crud.delete_item(db, item_id) - if not item: - raise HTTPException(status_code=404, detail="Item not found") - return {"message": "Item deleted"} \ No newline at end of file + try: + item = crud.delete_item(db, item_id) + if not item: + logger.warning(f"Item not found: {item_id}") + raise HTTPException(status_code=404, detail="Item not found") + logger.info(f"Item deleted: {item_id}") + return {"message": "Item deleted"} + except HTTPException: + raise + except Exception as e: + logger.error(f"Error deleting item: {e}") + raise \ No newline at end of file diff --git a/backend/api/user.py b/backend/api/user.py index 9861a42..a93d67b 100644 --- a/backend/api/user.py +++ b/backend/api/user.py @@ -6,54 +6,36 @@ from sqlalchemy.orm import Session import schemas from services import crud - from app.db.session import SessionLocal - +from core.logger import get_logger router = APIRouter() +logger = get_logger('user') def get_db(): - db = SessionLocal() - try: yield db - finally: db.close() # GET ITEMS -@router.get( - "/items", - response_model=list[schemas.ItemResponse] -) -def get_items( - db: Session = Depends(get_db) -): - - return crud.get_items(db) +@router.get("/items", response_model=list[schemas.ItemResponse]) +def get_items(db: Session = Depends(get_db)): + try: + items = crud.get_items(db) + logger.info(f"User fetched items: {len(items)} items") + return items + except Exception as e: + logger.error(f"Error fetching items: {e}") + raise # SPIN @router.post("/spin") -def spin( - db: Session = Depends(get_db) -): - - winner = crud.spin_wheel(db) - - if not winner: - - raise HTTPException( - status_code=400, - detail="No items available" - ) - - return { - "winner": { - "id": winner.id, - "title": winner.title - } - } \ No newline at end of file +def spin(db: Session = Depends(get_db)): + try: + winner = crud.spin_wheel(db) + if not winner: \ No newline at end of file diff --git a/backend/core/__init__.py b/backend/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/core/__pycache__/__init__.cpython-313.pyc b/backend/core/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..9d3ec59 Binary files /dev/null and b/backend/core/__pycache__/__init__.cpython-313.pyc differ diff --git a/backend/core/__pycache__/logger.cpython-313.pyc b/backend/core/__pycache__/logger.cpython-313.pyc new file mode 100644 index 0000000..92185cb Binary files /dev/null and b/backend/core/__pycache__/logger.cpython-313.pyc differ diff --git a/backend/core/logger.py b/backend/core/logger.py new file mode 100644 index 0000000..c3e59d9 --- /dev/null +++ b/backend/core/logger.py @@ -0,0 +1,50 @@ +import logging +import os +from logging.handlers import RotatingFileHandler +from dotenv import load_dotenv + +load_dotenv() + +LOG_ENABLED = os.getenv('LOG_ENABLED', 'true').lower() == 'true' +LOG_LEVEL = getattr(logging, os.getenv('LOG_LEVEL', 'DEBUG').upper(), logging.DEBUG) + +os.makedirs('logs', exist_ok=True) + +FORMATTER = logging.Formatter( + '%(asctime)s | %(levelname)s | %(name)s | %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' +) + +def _file_handler(filename: str, level: int) -> RotatingFileHandler: + handler = RotatingFileHandler( + f'logs/{filename}', + maxBytes=5 * 1024 * 1024, + backupCount=3, + encoding='utf-8' + ) + handler.setLevel(level) + handler.setFormatter(FORMATTER) + return handler + +def _console_handler() -> logging.StreamHandler: + handler = logging.StreamHandler() + handler.setLevel(logging.INFO) + handler.setFormatter(FORMATTER) + return handler + +def get_logger(name: str) -> logging.Logger: + logger = logging.getLogger(name) + + if logger.handlers: + return logger + + if not LOG_ENABLED: + logger.addHandler(logging.NullHandler()) + return logger + + logger.setLevel(LOG_LEVEL) + logger.addHandler(_file_handler('app.log', LOG_LEVEL)) + logger.addHandler(_file_handler('error.log', logging.ERROR)) + logger.addHandler(_console_handler()) + + return logger \ No newline at end of file diff --git a/backend/logs/app.log b/backend/logs/app.log new file mode 100644 index 0000000..78e4cd8 --- /dev/null +++ b/backend/logs/app.log @@ -0,0 +1 @@ +2026-05-24 09:52:10 | INFO | test | test diff --git a/backend/logs/error.log b/backend/logs/error.log new file mode 100644 index 0000000..e69de29 diff --git a/backend/wheel.db b/backend/wheel.db index 36027c6..61ec360 100644 Binary files a/backend/wheel.db and b/backend/wheel.db differ