103 lines
3.4 KiB
Python
103 lines
3.4 KiB
Python
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"}
|