from fastapi import APIRouter, Depends, HTTPException from sqlmodel import Session, select from datetime import datetime from backend.models.models import Order, OrderItem from backend.schemas.order import OrderRead, OrderCreate, OrderUpdate, OrderList, OrderWithItems from backend.database import get_session router = APIRouter() @router.post("/", response_model=OrderRead) def create_order(order: OrderCreate, session: Session = Depends(get_session)): new_order = Order( user_id=1, # Cần cập nhật logic lấy user từ authentication shop_id=order.shop_id, total_price=order.total_price, status="pending", created_at=datetime.utcnow(), ) session.add(new_order) session.commit() session.refresh(new_order) return new_order @router.get("/{order_id}", response_model=OrderWithItems) def read_order(order_id: int, session: Session = Depends(get_session)): order = session.get(Order, order_id) if not order: raise HTTPException(status_code=404, detail="Order not found") return order @router.get("/user/{user_id}", response_model=OrderList) def list_user_orders(user_id: int, session: Session = Depends(get_session)): orders = session.exec(select(Order).where(Order.user_id == user_id)).all() return {"orders": orders} @router.get("/", response_model=OrderList) def list_all_orders(session: Session = Depends(get_session)): orders = session.exec(select(Order)).all() return {"orders": orders} @router.get("/{order_id}/calculate-total", response_model=float) def calculate_total_price(order_id: int, session: Session = Depends(get_session)): order_items = session.exec(select(OrderItem).where(OrderItem.order_id == order_id)).all() total_price = sum(item.price * item.quantity for item in order_items) return total_price @router.put("/{order_id}", response_model=OrderRead) def update_order(order_id: int, order_update: OrderUpdate, session: Session = Depends(get_session)): order = session.get(Order, order_id) if not order: raise HTTPException(status_code=404, detail="Order not found") for key, value in order_update.dict(exclude_unset=True).items(): setattr(order, key, value) session.add(order) session.commit() session.refresh(order) return order @router.delete("/{order_id}") def delete_order(order_id: int, session: Session = Depends(get_session)): order = session.get(Order, order_id) if not order: raise HTTPException(status_code=404, detail="Order not found") session.delete(order) session.commit() return {"message": "Order deleted successfully"}