@@ -31,48 +31,51 @@ export class AnalyticsController implements OnModuleInit {
3131
3232 @Post ( 'record-solve' )
3333 @HttpCode ( HttpStatus . NO_CONTENT )
34- recordSolve ( @Body ( ) body : RecordSolveDto ) : void {
34+ async recordSolve ( @Body ( ) body : RecordSolveDto ) : Promise < void > {
3535 this . logger . log ( `Received record-solve request: ${ JSON . stringify ( body ) } ` ) ;
3636 const { userId, puzzleId, solveTime } = body ;
37- this . analyticsService . recordPuzzleSolve ( userId , puzzleId , solveTime ) ;
37+ // Await so write errors surface as 5xx rather than being silently
38+ // dropped; the service internally falls back to in-memory on Redis
39+ // failure so this won't crash the request.
40+ await this . analyticsService . recordPuzzleSolveAsync (
41+ userId ,
42+ puzzleId ,
43+ solveTime ,
44+ ) ;
3845 }
3946
4047 @Get ( 'puzzles/most-solved' )
4148 async getMostSolvedPuzzles ( ) : Promise <
4249 Array < { puzzleId : string ; solveCount : number } >
4350 > {
4451 this . logger . log ( 'Handling request for most solved puzzles.' ) ;
45- return this . analyticsService . getMostSolvedPuzzles ( ) ;
52+ return this . analyticsService . getMostSolvedPuzzlesAsync ( ) ;
4653 }
4754
4855 @Get ( 'puzzles/:puzzleId/average-solve-time' )
49- getAverageSolveTime ( @Param ( 'puzzleId' ) puzzleId : string ) : {
50- puzzleId : string ;
51- averageSolveTime : number ;
52- } {
56+ async getAverageSolveTime (
57+ @Param ( 'puzzleId' ) puzzleId : string ,
58+ ) : Promise < { puzzleId : string ; averageSolveTime : number } > {
5359 this . logger . log (
5460 `Handling request for average solve time for puzzle ${ puzzleId } .` ,
5561 ) ;
5662 const averageSolveTime =
57- this . analyticsService . getAverageSolveTime ( puzzleId ) ;
63+ await this . analyticsService . getAverageSolveTimeAsync ( puzzleId ) ;
5864 return { puzzleId, averageSolveTime } ;
5965 }
6066
6167 @Get ( 'users/:userId/history' )
62- getUserPuzzleHistory (
68+ async getUserPuzzleHistory (
6369 @Param ( 'userId' ) userId : string ,
64- @Query ( 'page' ) page ?: string ,
65- @Query ( 'limit' ) limit ?: string ,
66- ) : PaginatedUserPuzzleHistory {
67- const parsedPage = page ? parseInt ( page , 10 ) : 1 ;
68- const parsedLimit = limit ? parseInt ( limit , 10 ) : 20 ;
69- this . logger . log (
70- `Handling paginated request for user ${ userId } puzzle history (page=${ parsedPage } , limit=${ parsedLimit } ).` ,
71- ) ;
72- return this . analyticsService . getUserPuzzleStatsPage (
73- userId ,
74- parsedPage > 0 ? parsedPage : 1 ,
75- parsedLimit > 0 ? parsedLimit : 20 ,
76- ) ;
70+ ) : Promise < Record < string , any > > {
71+ this . logger . log ( `Handling request for user ${ userId } puzzle history.` ) ;
72+ const userHistoryMap =
73+ await this . analyticsService . getUserPuzzleStatsAsync ( userId ) ;
74+
75+ const userHistoryObject : Record < string , any > = { } ;
76+ userHistoryMap . forEach ( ( value , key ) => {
77+ userHistoryObject [ key ] = value ;
78+ } ) ;
79+ return userHistoryObject ;
7780 }
7881}
0 commit comments