Files
Stardream eace48732d
Build and Push Docker Images / build (push) Successful in 17s
Initial release
2026-06-02 12:02:02 +10:00

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"}