霖雨寺
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
import sqlite3
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter, HTTPException, status
|
||||
|
||||
from app.database import Database
|
||||
from app.schemas import Temple, TempleCreate, TempleUpdate
|
||||
|
||||
|
||||
router = APIRouter(prefix="/temples", tags=["temples"])
|
||||
|
||||
|
||||
def row_to_temple(row: sqlite3.Row) -> Temple:
|
||||
return Temple(
|
||||
id=row["id"],
|
||||
name=row["name"],
|
||||
location=row["location"],
|
||||
contact_phone=row["contact_phone"],
|
||||
description=row["description"],
|
||||
is_active=bool(row["is_active"]),
|
||||
)
|
||||
|
||||
|
||||
def raise_duplicate_temple_error() -> None:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_409_CONFLICT,
|
||||
detail="Temple name already exists",
|
||||
)
|
||||
|
||||
|
||||
@router.get("", response_model=List[Temple])
|
||||
def list_temples(db: Database) -> List[Temple]:
|
||||
rows = db.execute(
|
||||
"""
|
||||
SELECT id, name, location, contact_phone, description, is_active
|
||||
FROM temples
|
||||
ORDER BY id
|
||||
"""
|
||||
).fetchall()
|
||||
return [row_to_temple(row) for row in rows]
|
||||
|
||||
|
||||
@router.post("", response_model=Temple, status_code=status.HTTP_201_CREATED)
|
||||
def create_temple(payload: TempleCreate, db: Database) -> Temple:
|
||||
try:
|
||||
cursor = db.execute(
|
||||
"""
|
||||
INSERT INTO temples (name, location, contact_phone, description, is_active)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
""",
|
||||
(
|
||||
payload.name,
|
||||
payload.location,
|
||||
payload.contact_phone,
|
||||
payload.description,
|
||||
int(payload.is_active),
|
||||
),
|
||||
)
|
||||
db.commit()
|
||||
except sqlite3.IntegrityError:
|
||||
raise_duplicate_temple_error()
|
||||
|
||||
return get_temple(cursor.lastrowid, db)
|
||||
|
||||
|
||||
@router.get("/{temple_id}", response_model=Temple)
|
||||
def get_temple(temple_id: int, db: Database) -> Temple:
|
||||
row = db.execute(
|
||||
"""
|
||||
SELECT id, name, location, contact_phone, description, is_active
|
||||
FROM temples
|
||||
WHERE id = ?
|
||||
""",
|
||||
(temple_id,),
|
||||
).fetchone()
|
||||
if row is None:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Temple not found")
|
||||
return row_to_temple(row)
|
||||
|
||||
|
||||
@router.patch("/{temple_id}", response_model=Temple)
|
||||
def update_temple(temple_id: int, payload: TempleUpdate, db: Database) -> Temple:
|
||||
temple = get_temple(temple_id, db)
|
||||
updates = payload.model_dump(exclude_unset=True)
|
||||
|
||||
if not updates:
|
||||
return temple
|
||||
|
||||
name = updates.get("name", temple.name)
|
||||
location = updates.get("location", temple.location)
|
||||
contact_phone = updates.get("contact_phone", temple.contact_phone)
|
||||
description = updates.get("description", temple.description)
|
||||
is_active = updates.get("is_active", temple.is_active)
|
||||
|
||||
try:
|
||||
db.execute(
|
||||
"""
|
||||
UPDATE temples
|
||||
SET name = ?, location = ?, contact_phone = ?, description = ?, is_active = ?
|
||||
WHERE id = ?
|
||||
""",
|
||||
(name, location, contact_phone, description, int(is_active), temple_id),
|
||||
)
|
||||
db.commit()
|
||||
except sqlite3.IntegrityError:
|
||||
raise_duplicate_temple_error()
|
||||
|
||||
return get_temple(temple_id, db)
|
||||
|
||||
|
||||
@router.delete("/{temple_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
def delete_temple(temple_id: int, db: Database) -> None:
|
||||
cursor = db.execute("DELETE FROM temples WHERE id = ?", (temple_id,))
|
||||
db.commit()
|
||||
if cursor.rowcount == 0:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Temple not found")
|
||||
Reference in New Issue
Block a user