霖雨寺
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
import sqlite3
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter, HTTPException, status
|
||||
|
||||
from app.database import Database
|
||||
from app.schemas import Order, OrderCreate, OrderUpdate
|
||||
from app.temple_scope import TempleId, ensure_temple_exists
|
||||
|
||||
|
||||
router = APIRouter(prefix="/orders", tags=["orders"])
|
||||
|
||||
|
||||
def row_to_order(row: sqlite3.Row) -> Order:
|
||||
return Order(
|
||||
id=row["id"],
|
||||
temple_id=row["temple_id"],
|
||||
customer_name=row["customer_name"],
|
||||
customer_phone=row["customer_phone"],
|
||||
order_type=row["order_type"],
|
||||
item_name=row["item_name"],
|
||||
amount=float(row["amount"]),
|
||||
status=row["status"],
|
||||
created_at=row["created_at"],
|
||||
)
|
||||
|
||||
|
||||
@router.get("", response_model=List[Order])
|
||||
def list_orders(db: Database, temple_id: TempleId) -> List[Order]:
|
||||
ensure_temple_exists(db, temple_id)
|
||||
rows = db.execute(
|
||||
"""
|
||||
SELECT id, temple_id, customer_name, customer_phone, order_type, item_name, amount, status, created_at
|
||||
FROM orders
|
||||
WHERE temple_id = ?
|
||||
ORDER BY id DESC
|
||||
""",
|
||||
(temple_id,),
|
||||
).fetchall()
|
||||
return [row_to_order(row) for row in rows]
|
||||
|
||||
|
||||
@router.post("", response_model=Order, status_code=status.HTTP_201_CREATED)
|
||||
def create_order(payload: OrderCreate, db: Database, temple_id: TempleId) -> Order:
|
||||
ensure_temple_exists(db, temple_id)
|
||||
cursor = db.execute(
|
||||
"""
|
||||
INSERT INTO orders
|
||||
(temple_id, customer_name, customer_phone, order_type, item_name, amount, status)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||
""",
|
||||
(
|
||||
temple_id,
|
||||
payload.customer_name,
|
||||
payload.customer_phone,
|
||||
payload.order_type,
|
||||
payload.item_name,
|
||||
payload.amount,
|
||||
payload.status,
|
||||
),
|
||||
)
|
||||
db.commit()
|
||||
return get_order(cursor.lastrowid, db, temple_id)
|
||||
|
||||
|
||||
@router.get("/{order_id}", response_model=Order)
|
||||
def get_order(order_id: int, db: Database, temple_id: TempleId) -> Order:
|
||||
ensure_temple_exists(db, temple_id)
|
||||
row = db.execute(
|
||||
"""
|
||||
SELECT id, temple_id, customer_name, customer_phone, order_type, item_name, amount, status, created_at
|
||||
FROM orders
|
||||
WHERE id = ? AND temple_id = ?
|
||||
""",
|
||||
(order_id, temple_id),
|
||||
).fetchone()
|
||||
if row is None:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Order not found")
|
||||
return row_to_order(row)
|
||||
|
||||
|
||||
@router.patch("/{order_id}", response_model=Order)
|
||||
def update_order(order_id: int, payload: OrderUpdate, db: Database, temple_id: TempleId) -> Order:
|
||||
order = get_order(order_id, db, temple_id)
|
||||
updates = payload.model_dump(exclude_unset=True)
|
||||
|
||||
if not updates:
|
||||
return order
|
||||
|
||||
db.execute(
|
||||
"""
|
||||
UPDATE orders
|
||||
SET customer_name = ?, customer_phone = ?, order_type = ?, item_name = ?, amount = ?, status = ?
|
||||
WHERE id = ? AND temple_id = ?
|
||||
""",
|
||||
(
|
||||
updates.get("customer_name", order.customer_name),
|
||||
updates.get("customer_phone", order.customer_phone),
|
||||
updates.get("order_type", order.order_type),
|
||||
updates.get("item_name", order.item_name),
|
||||
updates.get("amount", order.amount),
|
||||
updates.get("status", order.status),
|
||||
order_id,
|
||||
temple_id,
|
||||
),
|
||||
)
|
||||
db.commit()
|
||||
return get_order(order_id, db, temple_id)
|
||||
|
||||
|
||||
@router.delete("/{order_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
def delete_order(order_id: int, db: Database, temple_id: TempleId) -> None:
|
||||
ensure_temple_exists(db, temple_id)
|
||||
cursor = db.execute(
|
||||
"DELETE FROM orders WHERE id = ? AND temple_id = ?",
|
||||
(order_id, temple_id),
|
||||
)
|
||||
db.commit()
|
||||
if cursor.rowcount == 0:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Order not found")
|
||||
Reference in New Issue
Block a user