import logging from fastapi import FastAPI, HTTPException from pymongo import MongoClient from bson import ObjectId from pydantic import BaseModel, Field from typing import List, Optional # Configure logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) app = FastAPI() logger.debug("FastAPI application initialized") # MongoDB connection client = MongoClient("mongodb://localhost:27017") db = client["pos_system"] logger.debug("MongoDB connection established") # -----========= # Models # ---------====== class Item(BaseModel): name: str price: float quantity: int unit: str related_items: List[str] = [] class Deal(BaseModel): name: str items: List[str] discount: float class Order(BaseModel): customer_name: str items: List[str] total_amount: float payment_method: str date: str voucher: Optional[str] = None logger.debug("Data models defined") # -----========= # API ROUTES # ---------====== @app.post("/items/") async def create_item(item: Item): logger.debug(f"Received request to create item: {item}") result = db.items.insert_one(item.dict()) logger.debug(f"Item created with ID: {result.inserted_id}") return {"id": str(result.inserted_id)} @app.get("/items/") async def read_items(): logger.debug("Received request to read all items") items = list(db.items.find()) logger.debug(f"Retrieved {len(items)} items") return items @app.get("/items/{item_id}") async def read_item(item_id: str): logger.debug(f"Received request to read item with ID: {item_id}") item = db.items.find_one({"_id": ObjectId(item_id)}) if item: logger.debug(f"Item found: {item}") return item logger.warning(f"Item with ID {item_id} not found") raise HTTPException(status_code=404, detail="Item not found") @app.put("/items/{item_id}") async def update_item(item_id: str, item: Item): logger.debug(f"Received request to update item with ID: {item_id}") result = db.items.update_one( {"_id": ObjectId(item_id)}, {"$set": item.dict()}) if result.modified_count: logger.debug(f"Item with ID {item_id} updated successfully") return {"message": "Item updated successfully"} logger.warning(f"Item with ID {item_id} not found for update") raise HTTPException(status_code=404, detail="Item not found") @app.delete("/items/{item_id}") async def delete_item(item_id: str): logger.debug(f"Received request to delete item with ID: {item_id}") result = db.items.delete_one({"_id": ObjectId(item_id)}) if result.deleted_count: logger.debug(f"Item with ID {item_id} deleted successfully") return {"message": "Item deleted successfully"} logger.warning(f"Item with ID {item_id} not found for deletion") raise HTTPException(status_code=404, detail="Item not found") @app.get("/inventory/") async def get_inventory(): logger.debug("Received request to get inventory") inventory = list(db.items.find({}, {"name": 1, "quantity": 1})) logger.debug(f"Retrieved inventory with {len(inventory)} items") return inventory @app.get("/sales/") async def get_sales_data(): # Implement aggregation for sales data # This could include total sales, popular items, etc. pass if __name__ == "__main__": logger.info("Starting the FastAPI application") import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)