Zaebalsya
This commit is contained in:
@@ -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=[])
|
||||
|
||||
@@ -37,6 +37,7 @@ from app.schemas.challenge import (
|
||||
ChallengesPreviewResponse,
|
||||
ChallengeSaveItem,
|
||||
ChallengesSaveRequest,
|
||||
ChallengesGenerateRequest,
|
||||
)
|
||||
from app.schemas.assignment import (
|
||||
CompleteAssignment,
|
||||
@@ -118,6 +119,7 @@ __all__ = [
|
||||
"ChallengesPreviewResponse",
|
||||
"ChallengeSaveItem",
|
||||
"ChallengesSaveRequest",
|
||||
"ChallengesGenerateRequest",
|
||||
# Assignment
|
||||
"CompleteAssignment",
|
||||
"AssignmentResponse",
|
||||
|
||||
@@ -88,3 +88,8 @@ class ChallengeSaveItem(BaseModel):
|
||||
class ChallengesSaveRequest(BaseModel):
|
||||
"""Request to save previewed challenges"""
|
||||
challenges: list[ChallengeSaveItem]
|
||||
|
||||
|
||||
class ChallengesGenerateRequest(BaseModel):
|
||||
"""Request to generate challenges for specific games"""
|
||||
game_ids: list[int] | None = None # If None, generate for all approved games without challenges
|
||||
|
||||
Reference in New Issue
Block a user