Преглед на файлове

feat: added audit logging for warehouse actions

unknown преди 21 часа
родител
ревизия
e55027c277
променени са 1 файла, в които са добавени 42 реда и са изтрити 1 реда
  1. 42 1
      backend/routers/warehouse.py

+ 42 - 1
backend/routers/warehouse.py

@@ -1,9 +1,10 @@
-from fastapi import APIRouter, Depends, HTTPException, Query
+from fastapi import APIRouter, Depends, HTTPException, Query, Request
 from typing import List, Optional
 import db
 import schemas
 from dependencies import require_admin
 import services.event_hooks as event_hooks
+from services.audit_service import audit_service
 
 router = APIRouter(prefix="/admin/warehouse", tags=["warehouse"])
 
@@ -48,6 +49,7 @@ async def get_warehouse_stock(
 
 @router.post("/stock", response_model=dict)
 async def add_stock_item(
+    request: Request,
     data: schemas.WarehouseItemCreate,
     admin: dict = Depends(require_admin)
 ):
@@ -61,12 +63,27 @@ async def add_stock_item(
     
     if not item_id:
         raise HTTPException(status_code=500, detail="Failed to add stock item")
+    
+    await audit_service.log(
+        user_id=admin['id'],
+        action="warehouse_add_item",
+        target_type="warehouse_stock",
+        target_id=item_id,
+        details={
+            "material_id": data.material_id,
+            "color": data.color_name,
+            "quantity": data.quantity,
+            "units_count": data.units_count
+        },
+        request=request
+    )
         
     return {"id": item_id, "message": "Stock item added successfully"}
 
 @router.patch("/stock/{item_id}", response_model=dict)
 async def update_stock_item(
     item_id: int,
+    request: Request,
     data: schemas.WarehouseItemUpdate,
     admin: dict = Depends(require_admin)
 ):
@@ -100,14 +117,38 @@ async def update_stock_item(
     params.append(item_id)
     
     db.execute_commit(query, tuple(params))
+
+    await audit_service.log(
+        user_id=admin['id'],
+        action="warehouse_update_item",
+        target_type="warehouse_stock",
+        target_id=item_id,
+        details=data.model_dump(exclude_unset=True),
+        request=request
+    )
     
     return {"message": "Stock item updated successfully"}
 
 @router.delete("/stock/{item_id}", response_model=dict)
 async def delete_stock_item(
     item_id: int,
+    request: Request,
     admin: dict = Depends(require_admin)
 ):
+    # Fetch item before deleting for logs
+    item = db.execute_query("SELECT material_id, color_name FROM warehouse_stock WHERE id = %s", (item_id,))
+    
     query = "DELETE FROM warehouse_stock WHERE id = %s"
     db.execute_commit(query, (item_id,))
+
+    if item:
+        await audit_service.log(
+            user_id=admin['id'],
+            action="warehouse_delete_item",
+            target_type="warehouse_stock",
+            target_id=item_id,
+            details=item[0],
+            request=request
+        )
+
     return {"message": "Stock item deleted successfully"}