Zaebalsya

This commit is contained in:
2025-12-17 20:19:26 +07:00
parent 7e7cdbcd76
commit 0b3837b08e
6 changed files with 267 additions and 35 deletions

View File

@@ -13,6 +13,7 @@ from app.schemas import (
ChallengePreview,
ChallengesPreviewResponse,
ChallengesSaveRequest,
ChallengesGenerateRequest,
)
from app.services.gpt import gpt_service
@@ -187,7 +188,12 @@ async def create_challenge(
@router.post("/marathons/{marathon_id}/preview-challenges", response_model=ChallengesPreviewResponse)
async def preview_challenges(marathon_id: int, current_user: CurrentUser, db: DbSession):
async def preview_challenges(
marathon_id: int,
current_user: CurrentUser,
db: DbSession,
data: ChallengesGenerateRequest | None = None,
):
"""Generate challenges preview for approved games in marathon using GPT (without saving). Organizers only."""
# Check marathon
result = await db.execute(select(Marathon).where(Marathon.id == marathon_id))
@@ -202,31 +208,45 @@ async def preview_challenges(marathon_id: int, current_user: CurrentUser, db: Db
await require_organizer(db, current_user, marathon_id)
# Get only APPROVED games
result = await db.execute(
select(Game).where(
Game.marathon_id == marathon_id,
Game.status == GameStatus.APPROVED.value,
)
query = select(Game).where(
Game.marathon_id == marathon_id,
Game.status == GameStatus.APPROVED.value,
)
# Filter by specific game IDs if provided
if data and data.game_ids:
query = query.where(Game.id.in_(data.game_ids))
result = await db.execute(query)
games = result.scalars().all()
if not games:
raise HTTPException(status_code=400, detail="No approved games in marathon")
raise HTTPException(status_code=400, detail="No approved games found")
# Filter games that don't have challenges yet
# Build games list for generation (skip games that already have challenges, unless specific IDs requested)
games_to_generate = []
game_map = {}
for game in games:
existing = await db.scalar(
select(Challenge.id).where(Challenge.game_id == game.id).limit(1)
)
if not existing:
# If specific games requested, generate even if they have challenges
if data and data.game_ids:
games_to_generate.append({
"id": game.id,
"title": game.title,
"genre": game.genre
})
game_map[game.id] = game.title
else:
# Otherwise only generate for games without challenges
existing = await db.scalar(
select(Challenge.id).where(Challenge.game_id == game.id).limit(1)
)
if not existing:
games_to_generate.append({
"id": game.id,
"title": game.title,
"genre": game.genre
})
game_map[game.id] = game.title
if not games_to_generate:
return ChallengesPreviewResponse(challenges=[])