From 6a4d54d7b23eece1434ba1c2bec5b68b16ab7897 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Tue, 17 Jan 2023 02:15:56 +0300 Subject: added rankings for finishing all sp and mp maps (#28) --- backend/controllers/homeController.go | 90 +++++++++++++++++++++++++++++++++++ backend/models/models.go | 11 +++++ backend/routes/routes.go | 1 + 3 files changed, 102 insertions(+) (limited to 'backend') diff --git a/backend/controllers/homeController.go b/backend/controllers/homeController.go index 635038b..42dfaa7 100644 --- a/backend/controllers/homeController.go +++ b/backend/controllers/homeController.go @@ -75,3 +75,93 @@ func Login(c *gin.Context) { return } } + +func Rankings(c *gin.Context) { + rows, err := database.DB.Query(`SELECT steam_id, username FROM users;`) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + var spRankings []models.UserRanking + var mpRankings []models.UserRanking + for rows.Next() { + var userID, username string + err := rows.Scan(&userID, &username) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + // Getting all sp records for each user + var uniqueSingleUserRecords, totalSingleMaps int + sql := `SELECT COUNT(DISTINCT map_id), (SELECT COUNT(map_name) FROM maps + WHERE is_coop = FALSE AND is_disabled = false) FROM records_sp WHERE user_id = $1;` + err = database.DB.QueryRow(sql, userID).Scan(&uniqueSingleUserRecords, &totalSingleMaps) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + // Has all singleplayer records + if uniqueSingleUserRecords == totalSingleMaps { + var ranking models.UserRanking + ranking.UserID = userID + ranking.Username = username + sql := `SELECT DISTINCT map_id, score_count FROM records_sp WHERE user_id = $1 ORDER BY map_id, score_count;` + rows, err := database.DB.Query(sql, userID) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + totalScore := 0 + var maps []int + for rows.Next() { + var mapID, scoreCount int + rows.Scan(&mapID, &scoreCount) + if len(maps) != 0 && maps[len(maps)-1] == mapID { + continue + } + totalScore += scoreCount + maps = append(maps, mapID) + } + ranking.TotalScore = totalScore + spRankings = append(spRankings, ranking) + } + // Getting all mp records for each user + var uniqueMultiUserRecords, totalMultiMaps int + sql = `SELECT COUNT(DISTINCT map_id), (SELECT COUNT(map_name) FROM maps + WHERE is_coop = TRUE AND is_disabled = false) FROM records_mp WHERE host_id = $1 OR partner_id = $2;` + err = database.DB.QueryRow(sql, userID, userID).Scan(&uniqueMultiUserRecords, &totalMultiMaps) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + // Has all singleplayer records + if uniqueMultiUserRecords == totalMultiMaps { + var ranking models.UserRanking + ranking.UserID = userID + ranking.Username = username + sql := `SELECT DISTINCT map_id, score_count FROM records_mp WHERE host_id = $1 OR partner_id = $2 ORDER BY map_id, score_count;` + rows, err := database.DB.Query(sql, userID, userID) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + totalScore := 0 + var maps []int + for rows.Next() { + var mapID, scoreCount int + rows.Scan(&mapID, &scoreCount) + if len(maps) != 0 && maps[len(maps)-1] == mapID { + continue + } + totalScore += scoreCount + maps = append(maps, mapID) + } + ranking.TotalScore = totalScore + mpRankings = append(mpRankings, ranking) + } + } + c.JSON(http.StatusOK, models.RankingsResponse{ + RankingsSP: spRankings, + RankingsMP: mpRankings, + }) +} diff --git a/backend/models/models.go b/backend/models/models.go index 0c380ff..5ce3ebf 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -61,6 +61,17 @@ type RecordRequest struct { IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"` } +type UserRanking struct { + UserID string `json:"user_id"` + Username string `json:"username"` + TotalScore int `json:"total_score"` +} + +type RankingsResponse struct { + RankingsSP []UserRanking `json:"rankings_sp"` + RankingsMP []UserRanking `json:"rankings_mp"` +} + type ProfileResponse struct { Profile bool `json:"profile"` SteamID string `json:"steam_id"` diff --git a/backend/routes/routes.go b/backend/routes/routes.go index b872b77..b42167a 100644 --- a/backend/routes/routes.go +++ b/backend/routes/routes.go @@ -21,5 +21,6 @@ func InitRoutes(router *gin.Engine) { v1.GET("/demo", controllers.DownloadDemoWithID) v1.GET("/maps/:id", middleware.CheckAuth, controllers.FetchMap) v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) + v1.GET("/rankings", middleware.CheckAuth, controllers.Rankings) } } -- cgit v1.2.3