22
33from fastapi import APIRouter , Depends , HTTPException
44from pydantic import BaseModel
5+ from sqlalchemy .orm import Session
56
6- from src .dependencies import get_gamification_service , get_learning_service
7+ from src .dependencies import get_db , get_gamification_service , get_learning_service
78from src .models .codetour_schemas import CodeTour
89from src .models .learning import LessonContent , Persona , Syllabus
910from src .services .gamification import GamificationService , UserStats
1011from src .services .learning_service import LearningService
12+ from src .services .challenges import ChallengeService
1113
1214router = APIRouter (tags = ["learning" ])
1315
@@ -262,15 +264,12 @@ async def generate_challenge(
262264 repo_id : str ,
263265 lesson_id : str ,
264266 request : GenerateChallengeRequest ,
265- learning_service : LearningService = Depends (get_learning_service )
267+ learning_service : LearningService = Depends (get_learning_service ),
268+ db : Session = Depends (get_db ),
266269):
267270 """Generate an interactive challenge for a lesson."""
268- from src .dependencies import get_db
269- from src .services .challenges import ChallengeService
270-
271271 try :
272272 # Create challenge service with LLM from learning service
273- db = next (get_db ())
274273 challenge_service = ChallengeService (db , learning_service ._llm )
275274
276275 challenge = await challenge_service .generate_challenge (
@@ -295,21 +294,20 @@ class ValidateBugHuntRequest(BaseModel):
295294async def validate_bug_hunt (
296295 repo_id : str ,
297296 request : ValidateBugHuntRequest ,
298- gamification : GamificationService = Depends (get_gamification_service )
297+ gamification : GamificationService = Depends (get_gamification_service ),
298+ db : Session = Depends (get_db ),
299299):
300300 """Validate a bug hunt challenge answer."""
301- from src .dependencies import get_db
302- from src .services .challenges import ChallengeService
303-
304301 try :
305- db = next (get_db ())
306302 challenge_service = ChallengeService (db )
307303 result = challenge_service .validate_bug_hunt (request .challenge , request .selected_line )
308304
309305 # Award XP if correct
310306 if result ["correct" ]:
311307 xp_gain = gamification .record_challenge_complete (repo_id , request .used_hint )
312308 result ["xp_gained" ] = xp_gain .model_dump ()
309+ result ["xp_earned" ] = xp_gain .amount + xp_gain .bonus
310+ result ["stats" ] = gamification .get_user_stats (repo_id ).model_dump ()
313311
314312 return result
315313 except Exception as e :
@@ -326,21 +324,20 @@ class ValidateCodeTraceRequest(BaseModel):
326324async def validate_code_trace (
327325 repo_id : str ,
328326 request : ValidateCodeTraceRequest ,
329- gamification : GamificationService = Depends (get_gamification_service )
327+ gamification : GamificationService = Depends (get_gamification_service ),
328+ db : Session = Depends (get_db ),
330329):
331330 """Validate a code trace challenge answer."""
332- from src .dependencies import get_db
333- from src .services .challenges import ChallengeService
334-
335331 try :
336- db = next (get_db ())
337332 challenge_service = ChallengeService (db )
338333 result = challenge_service .validate_code_trace (request .challenge , request .selected_index )
339334
340335 # Award XP if correct
341336 if result ["correct" ]:
342337 xp_gain = gamification .record_challenge_complete (repo_id , request .used_hint )
343338 result ["xp_gained" ] = xp_gain .model_dump ()
339+ result ["xp_earned" ] = xp_gain .amount + xp_gain .bonus
340+ result ["stats" ] = gamification .get_user_stats (repo_id ).model_dump ()
344341
345342 return result
346343 except Exception as e :
@@ -357,21 +354,20 @@ class ValidateFillBlankRequest(BaseModel):
357354async def validate_fill_blank (
358355 repo_id : str ,
359356 request : ValidateFillBlankRequest ,
360- gamification : GamificationService = Depends (get_gamification_service )
357+ gamification : GamificationService = Depends (get_gamification_service ),
358+ db : Session = Depends (get_db ),
361359):
362360 """Validate a fill in the blank challenge answer."""
363- from src .dependencies import get_db
364- from src .services .challenges import ChallengeService
365-
366361 try :
367- db = next (get_db ())
368362 challenge_service = ChallengeService (db )
369363 result = challenge_service .validate_fill_blank (request .challenge , request .answers )
370364
371365 # Award XP if correct
372366 if result ["correct" ]:
373367 xp_gain = gamification .record_challenge_complete (repo_id , request .used_hint )
374368 result ["xp_gained" ] = xp_gain .model_dump ()
369+ result ["xp_earned" ] = xp_gain .amount + xp_gain .bonus
370+ result ["stats" ] = gamification .get_user_stats (repo_id ).model_dump ()
375371
376372 return result
377373 except Exception as e :
0 commit comments