aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-01-15 11:43:53 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-01-15 11:43:53 +0300
commitb6096d1c07282f28dc264eeaed7a62f4bc9f4d08 (patch)
tree05a4fd4eb26b9cc230569d600442abbb3a597e51 /backend
parentalso update maps table when a new world record is achieved (diff)
downloadlphub-b6096d1c07282f28dc264eeaed7a62f4bc9f4d08.tar.gz
lphub-b6096d1c07282f28dc264eeaed7a62f4bc9f4d08.tar.bz2
lphub-b6096d1c07282f28dc264eeaed7a62f4bc9f4d08.zip
retrieving competitive user records (#26)
Diffstat (limited to 'backend')
-rw-r--r--backend/controllers/userController.go154
-rw-r--r--backend/models/models.go33
-rw-r--r--backend/models/responses.go27
3 files changed, 182 insertions, 32 deletions
diff --git a/backend/controllers/userController.go b/backend/controllers/userController.go
index ab29e32..6fd5049 100644
--- a/backend/controllers/userController.go
+++ b/backend/controllers/userController.go
@@ -16,15 +16,88 @@ func Profile(c *gin.Context) {
16 c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) 16 c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in."))
17 return 17 return
18 } 18 }
19 // Retrieve singleplayer records
20 var scoresSP []models.ScoreResponse
21 sql := `SELECT id, map_id, score_count, score_time, demo_id, record_date FROM records_sp WHERE user_id = $1 ORDER BY map_id;`
22 rows, err := database.DB.Query(sql, user.(models.User).SteamID)
23 if err != nil {
24 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
25 return
26 }
27 i := 0
28 var recordsSP []models.RecordSP
29 for rows.Next() {
30 var mapID int
31 var record models.RecordSP
32 rows.Scan(&record.RecordID, &mapID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate)
33 if i == 0 {
34 recordsSP = append(recordsSP, record)
35 scoresSP = append(scoresSP, models.ScoreResponse{
36 MapID: mapID,
37 Records: recordsSP,
38 })
39 continue
40 }
41 // More than one record in one map
42 if mapID == scoresSP[i-1].MapID {
43 scoresSP[i-1].Records = append(scoresSP[i-1].Records.([]models.RecordSP), record)
44 continue
45 }
46 // New map
47 recordsSP = append(recordsSP, record)
48 scoresSP = append(scoresSP, models.ScoreResponse{
49 MapID: mapID,
50 Records: recordsSP,
51 })
52 i++
53 }
54 // Retrieve multiplayer records
55 var scoresMP []models.ScoreResponse
56 sql = `SELECT id, map_id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date FROM records_mp
57 WHERE host_id = $1 OR partner_id = $2 ORDER BY map_id;`
58 rows, err = database.DB.Query(sql, user.(models.User).SteamID, user.(models.User).SteamID)
59 if err != nil {
60 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
61 return
62 }
63 j := 0
64 var recordsMP []models.RecordMP
65 for rows.Next() {
66 var mapID int
67 var record models.RecordMP
68 rows.Scan(&record.RecordID, &mapID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate)
69 if j == 0 {
70 recordsMP = append(recordsMP, record)
71 scoresMP = append(scoresMP, models.ScoreResponse{
72 MapID: mapID,
73 Records: recordsMP,
74 })
75 continue
76 }
77 // More than one record in one map
78 if mapID == scoresMP[j-1].MapID {
79 scoresMP[j-1].Records = append(scoresMP[j-1].Records.([]models.RecordMP), record)
80 continue
81 }
82 // New map
83 recordsMP = append(recordsMP, record)
84 scoresMP = append(scoresMP, models.ScoreResponse{
85 MapID: mapID,
86 Records: recordsMP,
87 })
88 j++
89 }
19 c.JSON(http.StatusOK, models.Response{ 90 c.JSON(http.StatusOK, models.Response{
20 Success: true, 91 Success: true,
21 Message: "", 92 Message: "Successfully retrieved user scores.",
22 Data: models.ProfileResponse{ 93 Data: models.ProfileResponse{
23 Profile: true, 94 Profile: true,
24 SteamID: user.(models.User).SteamID, 95 SteamID: user.(models.User).SteamID,
25 Username: user.(models.User).Username, 96 Username: user.(models.User).Username,
26 AvatarLink: user.(models.User).AvatarLink, 97 AvatarLink: user.(models.User).AvatarLink,
27 CountryCode: user.(models.User).CountryCode, 98 CountryCode: user.(models.User).CountryCode,
99 ScoresSP: scoresSP,
100 ScoresMP: scoresMP,
28 }, 101 },
29 }) 102 })
30 return 103 return
@@ -52,17 +125,88 @@ func FetchUser(c *gin.Context) {
52 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 125 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
53 return 126 return
54 } 127 }
55 // Target user exists 128 // Retrieve singleplayer records
56 _, exists := c.Get("user") 129 var scoresSP []models.ScoreResponse
130 sql := `SELECT id, map_id, score_count, score_time, demo_id, record_date FROM records_sp WHERE user_id = $1 ORDER BY map_id;`
131 rows, err := database.DB.Query(sql, user.SteamID)
132 if err != nil {
133 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
134 return
135 }
136 i := 0
137 var recordsSP []models.RecordSP
138 for rows.Next() {
139 var mapID int
140 var record models.RecordSP
141 rows.Scan(&record.RecordID, &mapID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate)
142 if i == 0 {
143 recordsSP = append(recordsSP, record)
144 scoresSP = append(scoresSP, models.ScoreResponse{
145 MapID: mapID,
146 Records: recordsSP,
147 })
148 continue
149 }
150 // More than one record in one map
151 if mapID == scoresSP[i-1].MapID {
152 scoresSP[i-1].Records = append(scoresSP[i-1].Records.([]models.RecordSP), record)
153 continue
154 }
155 // New map
156 recordsSP = append(recordsSP, record)
157 scoresSP = append(scoresSP, models.ScoreResponse{
158 MapID: mapID,
159 Records: recordsSP,
160 })
161 i++
162 }
163 // Retrieve multiplayer records
164 var scoresMP []models.ScoreResponse
165 sql = `SELECT id, map_id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date FROM records_mp
166 WHERE host_id = $1 OR partner_id = $2 ORDER BY map_id;`
167 rows, err = database.DB.Query(sql, user.SteamID, user.SteamID)
168 if err != nil {
169 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
170 return
171 }
172 j := 0
173 var recordsMP []models.RecordMP
174 for rows.Next() {
175 var mapID int
176 var record models.RecordMP
177 rows.Scan(&record.RecordID, &mapID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate)
178 if j == 0 {
179 recordsMP = append(recordsMP, record)
180 scoresMP = append(scoresMP, models.ScoreResponse{
181 MapID: mapID,
182 Records: recordsMP,
183 })
184 continue
185 }
186 // More than one record in one map
187 if mapID == scoresMP[j-1].MapID {
188 scoresMP[j-1].Records = append(scoresMP[j-1].Records.([]models.RecordMP), record)
189 continue
190 }
191 // New map
192 recordsMP = append(recordsMP, record)
193 scoresMP = append(scoresMP, models.ScoreResponse{
194 MapID: mapID,
195 Records: recordsMP,
196 })
197 j++
198 }
57 c.JSON(http.StatusOK, models.Response{ 199 c.JSON(http.StatusOK, models.Response{
58 Success: true, 200 Success: true,
59 Message: "", 201 Message: "Successfully retrieved user scores.",
60 Data: models.ProfileResponse{ 202 Data: models.ProfileResponse{
61 Profile: exists, 203 Profile: true,
62 SteamID: user.SteamID, 204 SteamID: user.SteamID,
63 Username: user.Username, 205 Username: user.Username,
64 AvatarLink: user.AvatarLink, 206 AvatarLink: user.AvatarLink,
65 CountryCode: user.CountryCode, 207 CountryCode: user.CountryCode,
208 ScoresSP: scoresSP,
209 ScoresMP: scoresMP,
66 }, 210 },
67 }) 211 })
68 return 212 return
diff --git a/backend/models/models.go b/backend/models/models.go
index 7de5812..8e710b7 100644
--- a/backend/models/models.go
+++ b/backend/models/models.go
@@ -4,6 +4,16 @@ import (
4 "time" 4 "time"
5) 5)
6 6
7type Response struct {
8 Success bool `json:"success"`
9 Message string `json:"message"`
10 Data any `json:"data"`
11}
12
13type LoginResponse struct {
14 Token string `json:"token"`
15}
16
7type User struct { 17type User struct {
8 SteamID string `json:"steam_id"` 18 SteamID string `json:"steam_id"`
9 Username string `json:"username"` 19 Username string `json:"username"`
@@ -48,3 +58,26 @@ type RecordRequest struct {
48 PartnerID string `json:"partner_id" form:"partner_id" binding:"required"` 58 PartnerID string `json:"partner_id" form:"partner_id" binding:"required"`
49 IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"` 59 IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"`
50} 60}
61
62type ProfileResponse struct {
63 Profile bool `json:"profile"`
64 SteamID string `json:"steam_id"`
65 Username string `json:"username"`
66 AvatarLink string `json:"avatar_link"`
67 CountryCode string `json:"country_code"`
68 ScoresSP []ScoreResponse `json:"scores_sp"`
69 ScoresMP []ScoreResponse `json:"scores_mp"`
70}
71
72type ScoreResponse struct {
73 MapID int `json:"map_id"`
74 Records any `json:"records"`
75}
76
77func ErrorResponse(message string) Response {
78 return Response{
79 Success: false,
80 Message: message,
81 Data: nil,
82 }
83}
diff --git a/backend/models/responses.go b/backend/models/responses.go
deleted file mode 100644
index 70ee1b6..0000000
--- a/backend/models/responses.go
+++ /dev/null
@@ -1,27 +0,0 @@
1package models
2
3type Response struct {
4 Success bool `json:"success"`
5 Message string `json:"message"`
6 Data any `json:"data"`
7}
8
9type LoginResponse struct {
10 Token string `json:"token"`
11}
12
13type ProfileResponse struct {
14 Profile bool `json:"profile"`
15 SteamID string `json:"steam_id"`
16 Username string `json:"username"`
17 AvatarLink string `json:"avatar_link"`
18 CountryCode string `json:"country_code"`
19}
20
21func ErrorResponse(message string) Response {
22 return Response{
23 Success: false,
24 Message: message,
25 Data: nil,
26 }
27}