This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
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"}
|
||||
Reference in New Issue
Block a user