@@ -582,6 +582,88 @@ func UpdateTeamRounds(c echo.Context) error {
582582 })
583583}
584584
585+
586+ func GetLeaderBoard (c echo.Context ) error {
587+ ctx := c .Request ().Context ()
588+
589+ limitParam := c .QueryParam ("limit" )
590+ cursorParam := c .QueryParam ("cursor" )
591+ nameParam := c .QueryParam ("name" )
592+
593+ limit := 10
594+ var cursor uuid.NullUUID
595+ var err error
596+
597+ if limitParam != "" {
598+ parsedLimit , err := strconv .Atoi (limitParam )
599+ if err == nil && parsedLimit > 0 {
600+ limit = parsedLimit
601+ }
602+ }
603+
604+ if cursorParam != "" {
605+ parsedCursor , err := uuid .Parse (cursorParam )
606+ if err == nil {
607+ cursor = uuid.NullUUID {UUID : parsedCursor , Valid : true }
608+ }
609+ }
610+
611+ rows , err := utils .Queries .GetLeaderboardWithPagination (ctx , db.GetLeaderboardWithPaginationParams {
612+ Column1 : cursor .UUID ,
613+ Limit : int32 (limit ),
614+ Column2 : nameParam ,
615+ })
616+ if err != nil {
617+ return c .JSON (echo .ErrInternalServerError .Code , & models.Response {
618+ Status : "fail" ,
619+ Message : "Some error occurred" ,
620+ Data : map [string ]string {
621+ "error" : err .Error (),
622+ },
623+ })
624+ }
625+
626+ leaderboardMap := make (map [uuid.UUID ]* models.TeamLeaderboard )
627+ var nextCursor uuid.NullUUID
628+
629+ for _ , row := range rows {
630+ if _ , exists := leaderboardMap [row .TeamID ]; ! exists {
631+ leaderboardMap [row .TeamID ] = & models.TeamLeaderboard {
632+ TeamID : row .TeamID ,
633+ TeamName : row .Name ,
634+ Rounds : []models.Round {},
635+ OverallTotal : int (row .OverallTotal ),
636+ }
637+ }
638+
639+ leaderboardMap [row .TeamID ].Rounds = append (leaderboardMap [row .TeamID ].Rounds , models.Round {
640+ Round : int (row .Round ),
641+ Design : int (row .Design ),
642+ Implementation : int (row .Implementation ),
643+ Presentation : int (row .Presentation ),
644+ Innovation : int (row .Innovation ),
645+ Teamwork : int (row .Teamwork ),
646+ RoundTotal : int (row .RoundTotal ),
647+ })
648+ nextCursor = uuid.NullUUID {UUID : row .TeamID , Valid : true }
649+ }
650+
651+ leaderBoard := make ([]models.TeamLeaderboard , 0 , len (leaderboardMap ))
652+ for _ , team := range leaderboardMap {
653+ leaderBoard = append (leaderBoard , * team )
654+ }
655+
656+ response := map [string ]interface {}{
657+ "leaderboard" : leaderBoard ,
658+ "next_cursor" : nextCursor .UUID .String (),
659+ }
660+
661+ return c .JSON (http .StatusOK , & models.Response {
662+ Status : "success" ,
663+ Message : "Leaderboard fetched successfully" ,
664+ Data : response ,
665+ })
666+
585667func GetAllIdeas (c echo.Context ) error {
586668 ctx := c .Request ().Context ()
587669
0 commit comments