from typing import Optional from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_session from app.models import DonationTier from app.schemas import TierCreate, TierUpdate, TierResponse router = APIRouter() @router.get("/", response_model=list[TierResponse]) async def list_tiers(session: AsyncSession = Depends(get_session)): result = await session.execute( select(DonationTier).order_by(DonationTier.display_order) ) return list(result.scalars().all()) @router.get("/{tier_id}", response_model=TierResponse) async def get_tier(tier_id: int, session: AsyncSession = Depends(get_session)): result = await session.execute(select(DonationTier).where(DonationTier.id == tier_id)) tier = result.scalar_one_or_none() if not tier: return {"error": "Tier not found"} return tier @router.post("/", response_model=TierResponse, status_code=201) async def create_tier( payload: TierCreate, session: AsyncSession = Depends(get_session) ): tier = DonationTier(**payload.model_dump()) session.add(tier) await session.commit() await session.refresh(tier) return tier @router.put("/{tier_id}", response_model=TierResponse) async def update_tier( tier_id: int, payload: TierUpdate, session: AsyncSession = Depends(get_session), ): result = await session.execute(select(DonationTier).where(DonationTier.id == tier_id)) tier = result.scalar_one_or_none() if not tier: return {"error": "Tier not found"} for key, value in payload.model_dump(exclude_unset=True).items(): setattr(tier, key, value) await session.commit() await session.refresh(tier) return tier @router.delete("/{tier_id}", status_code=204) async def delete_tier(tier_id: int, session: AsyncSession = Depends(get_session)): result = await session.execute(select(DonationTier).where(DonationTier.id == tier_id)) tier = result.scalar_one_or_none() if not tier: return {"error": "Tier not found"} await session.delete(tier) await session.commit()