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