82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
"""
|
|
یک فکتوری عمومی برای ساخت روترهای 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
|