import uuid from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_current_user from app.api.schemas import PrizeCreate, PrizeResponse from app.core.database import get_db from app.models.lottery import Lottery, LotteryStatus from app.models.prize import Prize from app.models.user import User router = APIRouter(tags=["prizes"]) @router.post("/lotteries/{lottery_id}/prizes", response_model=PrizeResponse) async def add_prize( lottery_id: uuid.UUID, data: PrizeCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ) -> Prize: result = await db.execute(select(Lottery).where(Lottery.id == lottery_id)) lottery = result.scalar_one_or_none() if lottery is None: raise HTTPException(404, "Lottery not found") if lottery.creator_id != current_user.id: raise HTTPException(403, "Not authorized") if lottery.status not in (LotteryStatus.DRAFT, LotteryStatus.ACTIVE): raise HTTPException(400, "Cannot modify prizes after activation") # Determine next sort order last_result = await db.execute( select(Prize) .where(Prize.lottery_id == lottery_id) .order_by(Prize.sort_order.desc()) .limit(1) ) last = last_result.scalar_one_or_none() sort_order = (last.sort_order + 1) if last else 0 prize = Prize(lottery_id=lottery_id, sort_order=sort_order, **data.model_dump()) db.add(prize) await db.commit() await db.refresh(prize) return prize @router.put("/prizes/{prize_id}", response_model=PrizeResponse) async def update_prize( prize_id: uuid.UUID, data: PrizeCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ) -> Prize: result = await db.execute(select(Prize).where(Prize.id == prize_id)) prize = result.scalar_one_or_none() if prize is None: raise HTTPException(404, "Prize not found") lottery_result = await db.execute(select(Lottery).where(Lottery.id == prize.lottery_id)) lottery = lottery_result.scalar_one() if lottery.creator_id != current_user.id: raise HTTPException(403, "Not authorized") if lottery.status not in (LotteryStatus.DRAFT, LotteryStatus.ACTIVE): raise HTTPException(400, "Cannot modify prizes after activation") prize.name = data.name prize.quantity = data.quantity prize.description = data.description await db.commit() await db.refresh(prize) return prize @router.delete("/prizes/{prize_id}") async def delete_prize( prize_id: uuid.UUID, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ) -> dict: result = await db.execute(select(Prize).where(Prize.id == prize_id)) prize = result.scalar_one_or_none() if prize is None: raise HTTPException(404, "Prize not found") lottery_result = await db.execute(select(Lottery).where(Lottery.id == prize.lottery_id)) lottery = lottery_result.scalar_one() if lottery.creator_id != current_user.id: raise HTTPException(403, "Not authorized") if lottery.status not in (LotteryStatus.DRAFT, LotteryStatus.ACTIVE): raise HTTPException(400, "Cannot modify prizes after activation") await db.delete(prize) await db.commit() return {"status": "deleted"}