aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-01-17 02:15:56 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-01-17 02:15:56 +0300
commit6a4d54d7b23eece1434ba1c2bec5b68b16ab7897 (patch)
tree30c793a2f2d874e5f1b6c76881be34c82b5133c4 /backend
parentranking placements in each map with correct tie handling (#5, #27) (diff)
downloadlphub-6a4d54d7b23eece1434ba1c2bec5b68b16ab7897.tar.gz
lphub-6a4d54d7b23eece1434ba1c2bec5b68b16ab7897.tar.bz2
lphub-6a4d54d7b23eece1434ba1c2bec5b68b16ab7897.zip
added rankings for finishing all sp and mp maps (#28)
Diffstat (limited to 'backend')
-rw-r--r--backend/controllers/homeController.go90
-rw-r--r--backend/models/models.go11
-rw-r--r--backend/routes/routes.go1
3 files changed, 102 insertions, 0 deletions
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) {
75 return 75 return
76 } 76 }
77} 77}
78
79func Rankings(c *gin.Context) {
80 rows, err := database.DB.Query(`SELECT steam_id, username FROM users;`)
81 if err != nil {
82 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
83 return
84 }
85 var spRankings []models.UserRanking
86 var mpRankings []models.UserRanking
87 for rows.Next() {
88 var userID, username string
89 err := rows.Scan(&userID, &username)
90 if err != nil {
91 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
92 return
93 }
94 // Getting all sp records for each user
95 var uniqueSingleUserRecords, totalSingleMaps int
96 sql := `SELECT COUNT(DISTINCT map_id), (SELECT COUNT(map_name) FROM maps
97 WHERE is_coop = FALSE AND is_disabled = false) FROM records_sp WHERE user_id = $1;`
98 err = database.DB.QueryRow(sql, userID).Scan(&uniqueSingleUserRecords, &totalSingleMaps)
99 if err != nil {
100 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
101 return
102 }
103 // Has all singleplayer records
104 if uniqueSingleUserRecords == totalSingleMaps {
105 var ranking models.UserRanking
106 ranking.UserID = userID
107 ranking.Username = username
108 sql := `SELECT DISTINCT map_id, score_count FROM records_sp WHERE user_id = $1 ORDER BY map_id, score_count;`
109 rows, err := database.DB.Query(sql, userID)
110 if err != nil {
111 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
112 return
113 }
114 totalScore := 0
115 var maps []int
116 for rows.Next() {
117 var mapID, scoreCount int
118 rows.Scan(&mapID, &scoreCount)
119 if len(maps) != 0 && maps[len(maps)-1] == mapID {
120 continue
121 }
122 totalScore += scoreCount
123 maps = append(maps, mapID)
124 }
125 ranking.TotalScore = totalScore
126 spRankings = append(spRankings, ranking)
127 }
128 // Getting all mp records for each user
129 var uniqueMultiUserRecords, totalMultiMaps int
130 sql = `SELECT COUNT(DISTINCT map_id), (SELECT COUNT(map_name) FROM maps
131 WHERE is_coop = TRUE AND is_disabled = false) FROM records_mp WHERE host_id = $1 OR partner_id = $2;`
132 err = database.DB.QueryRow(sql, userID, userID).Scan(&uniqueMultiUserRecords, &totalMultiMaps)
133 if err != nil {
134 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
135 return
136 }
137 // Has all singleplayer records
138 if uniqueMultiUserRecords == totalMultiMaps {
139 var ranking models.UserRanking
140 ranking.UserID = userID
141 ranking.Username = username
142 sql := `SELECT DISTINCT map_id, score_count FROM records_mp WHERE host_id = $1 OR partner_id = $2 ORDER BY map_id, score_count;`
143 rows, err := database.DB.Query(sql, userID, userID)
144 if err != nil {
145 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
146 return
147 }
148 totalScore := 0
149 var maps []int
150 for rows.Next() {
151 var mapID, scoreCount int
152 rows.Scan(&mapID, &scoreCount)
153 if len(maps) != 0 && maps[len(maps)-1] == mapID {
154 continue
155 }
156 totalScore += scoreCount
157 maps = append(maps, mapID)
158 }
159 ranking.TotalScore = totalScore
160 mpRankings = append(mpRankings, ranking)
161 }
162 }
163 c.JSON(http.StatusOK, models.RankingsResponse{
164 RankingsSP: spRankings,
165 RankingsMP: mpRankings,
166 })
167}
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 {
61 IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"` 61 IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"`
62} 62}
63 63
64type UserRanking struct {
65 UserID string `json:"user_id"`
66 Username string `json:"username"`
67 TotalScore int `json:"total_score"`
68}
69
70type RankingsResponse struct {
71 RankingsSP []UserRanking `json:"rankings_sp"`
72 RankingsMP []UserRanking `json:"rankings_mp"`
73}
74
64type ProfileResponse struct { 75type ProfileResponse struct {
65 Profile bool `json:"profile"` 76 Profile bool `json:"profile"`
66 SteamID string `json:"steam_id"` 77 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) {
21 v1.GET("/demo", controllers.DownloadDemoWithID) 21 v1.GET("/demo", controllers.DownloadDemoWithID)
22 v1.GET("/maps/:id", middleware.CheckAuth, controllers.FetchMap) 22 v1.GET("/maps/:id", middleware.CheckAuth, controllers.FetchMap)
23 v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) 23 v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo)
24 v1.GET("/rankings", middleware.CheckAuth, controllers.Rankings)
24 } 25 }
25} 26}