اولین نسخه بکاند آرامش پلازا
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
"""
|
||||
یک فکتوری عمومی برای ساخت روترهای CRUD.
|
||||
چون خیلی از منابع (خدمات، آمار، تایملاین، تیم، نظرات مشتریان، چرا ما، FAQ)
|
||||
ساختار مشابهی دارن (لیست عمومی + مدیریت فقط برای ادمین)، این تابع کد تکراری
|
||||
رو حذف میکنه. برای منابعی که پیچیدهتر هستن (پروژهها، مقالات، تماس، خبرنامه)
|
||||
روتر جداگانه با منطق اختصاصی نوشته شده.
|
||||
"""
|
||||
from typing import Type
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.auth import get_current_admin
|
||||
from app.database import get_db
|
||||
|
||||
|
||||
def build_crud_router(
|
||||
*,
|
||||
prefix: str,
|
||||
tag: str,
|
||||
model,
|
||||
create_schema: Type,
|
||||
update_schema: Type,
|
||||
out_schema: Type,
|
||||
order_field: str = "order",
|
||||
) -> APIRouter:
|
||||
router = APIRouter(prefix=prefix, tags=[tag])
|
||||
|
||||
@router.get("", response_model=list[out_schema])
|
||||
def list_items(db: Session = Depends(get_db)):
|
||||
return db.query(model).order_by(getattr(model, order_field)).all()
|
||||
|
||||
@router.get("/{item_id}", response_model=out_schema)
|
||||
def get_item(item_id: int, db: Session = Depends(get_db)):
|
||||
item = db.get(model, item_id)
|
||||
if not item:
|
||||
raise HTTPException(status.HTTP_404_NOT_FOUND, "مورد پیدا نشد")
|
||||
return item
|
||||
|
||||
@router.post("", response_model=out_schema, status_code=status.HTTP_201_CREATED)
|
||||
def create_item(
|
||||
payload: create_schema,
|
||||
db: Session = Depends(get_db),
|
||||
_admin=Depends(get_current_admin),
|
||||
):
|
||||
item = model(**payload.model_dump())
|
||||
db.add(item)
|
||||
db.commit()
|
||||
db.refresh(item)
|
||||
return item
|
||||
|
||||
@router.put("/{item_id}", response_model=out_schema)
|
||||
def update_item(
|
||||
item_id: int,
|
||||
payload: update_schema,
|
||||
db: Session = Depends(get_db),
|
||||
_admin=Depends(get_current_admin),
|
||||
):
|
||||
item = db.get(model, item_id)
|
||||
if not item:
|
||||
raise HTTPException(status.HTTP_404_NOT_FOUND, "مورد پیدا نشد")
|
||||
for field, value in payload.model_dump(exclude_unset=True).items():
|
||||
setattr(item, field, value)
|
||||
db.commit()
|
||||
db.refresh(item)
|
||||
return item
|
||||
|
||||
@router.delete("/{item_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
def delete_item(
|
||||
item_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
_admin=Depends(get_current_admin),
|
||||
):
|
||||
item = db.get(model, item_id)
|
||||
if not item:
|
||||
raise HTTPException(status.HTTP_404_NOT_FOUND, "مورد پیدا نشد")
|
||||
db.delete(item)
|
||||
db.commit()
|
||||
return None
|
||||
|
||||
return router
|
||||
Reference in New Issue
Block a user