Fix games list
This commit is contained in:
@@ -99,7 +99,10 @@ async def list_challenges(game_id: int, current_user: CurrentUser, db: DbSession
|
||||
|
||||
@router.get("/marathons/{marathon_id}/challenges", response_model=list[ChallengeResponse])
|
||||
async def list_marathon_challenges(marathon_id: int, current_user: CurrentUser, db: DbSession):
|
||||
"""List all challenges for a marathon (from all approved games). Participants only."""
|
||||
"""List all challenges for a marathon (from all approved games). Participants only.
|
||||
Also includes virtual challenges for playthrough-type games."""
|
||||
from app.models.game import GameType
|
||||
|
||||
# Check marathon exists
|
||||
result = await db.execute(select(Marathon).where(Marathon.id == marathon_id))
|
||||
marathon = result.scalar_one_or_none()
|
||||
@@ -111,7 +114,7 @@ async def list_marathon_challenges(marathon_id: int, current_user: CurrentUser,
|
||||
if not current_user.is_admin and not participant:
|
||||
raise HTTPException(status_code=403, detail="You are not a participant of this marathon")
|
||||
|
||||
# Get all approved challenges from approved games in this marathon
|
||||
# Get all approved challenges from approved games (challenges type) in this marathon
|
||||
result = await db.execute(
|
||||
select(Challenge)
|
||||
.join(Game, Challenge.game_id == Game.id)
|
||||
@@ -125,7 +128,47 @@ async def list_marathon_challenges(marathon_id: int, current_user: CurrentUser,
|
||||
)
|
||||
challenges = result.scalars().all()
|
||||
|
||||
return [build_challenge_response(c, c.game) for c in challenges]
|
||||
responses = [build_challenge_response(c, c.game) for c in challenges]
|
||||
|
||||
# Also get playthrough-type games and create virtual challenges for them
|
||||
result = await db.execute(
|
||||
select(Game)
|
||||
.where(
|
||||
Game.marathon_id == marathon_id,
|
||||
Game.status == GameStatus.APPROVED.value,
|
||||
Game.game_type == GameType.PLAYTHROUGH.value,
|
||||
)
|
||||
.order_by(Game.title)
|
||||
)
|
||||
playthrough_games = result.scalars().all()
|
||||
|
||||
for game in playthrough_games:
|
||||
# Create virtual challenge response for playthrough game
|
||||
virtual_challenge = ChallengeResponse(
|
||||
id=-game.id, # Negative ID to distinguish from real challenges
|
||||
title=f"Прохождение: {game.title}",
|
||||
description=game.playthrough_description or "Пройдите игру",
|
||||
type="completion",
|
||||
difficulty="medium",
|
||||
points=game.playthrough_points or 0,
|
||||
estimated_time=None,
|
||||
proof_type=game.playthrough_proof_type or "screenshot",
|
||||
proof_hint=game.playthrough_proof_hint,
|
||||
game=GameShort(
|
||||
id=game.id,
|
||||
title=game.title,
|
||||
cover_url=None,
|
||||
download_url=game.download_url,
|
||||
game_type=game.game_type
|
||||
),
|
||||
is_generated=False,
|
||||
created_at=game.created_at,
|
||||
status="approved",
|
||||
proposed_by=None,
|
||||
)
|
||||
responses.append(virtual_challenge)
|
||||
|
||||
return responses
|
||||
|
||||
|
||||
@router.post("/games/{game_id}/challenges", response_model=ChallengeResponse)
|
||||
|
||||
Reference in New Issue
Block a user