اولین نسخه بک‌اند آرامش پلازا

This commit is contained in:
Behrad
2026-08-27 15:15:12 +03:30
commit 854309f976
26 changed files with 1861 additions and 0 deletions
+81
View File
@@ -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