diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-01-15 11:43:53 +0300 |
|---|---|---|
| committer | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-01-15 11:43:53 +0300 |
| commit | b6096d1c07282f28dc264eeaed7a62f4bc9f4d08 (patch) | |
| tree | 05a4fd4eb26b9cc230569d600442abbb3a597e51 | |
| parent | also update maps table when a new world record is achieved (diff) | |
| download | lphub-b6096d1c07282f28dc264eeaed7a62f4bc9f4d08.tar.gz lphub-b6096d1c07282f28dc264eeaed7a62f4bc9f4d08.tar.bz2 lphub-b6096d1c07282f28dc264eeaed7a62f4bc9f4d08.zip | |
retrieving competitive user records (#26)
| -rw-r--r-- | backend/controllers/userController.go | 154 | ||||
| -rw-r--r-- | backend/models/models.go | 33 | ||||
| -rw-r--r-- | backend/models/responses.go | 27 |
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 | ||
| 7 | type Response struct { | ||
| 8 | Success bool `json:"success"` | ||
| 9 | Message string `json:"message"` | ||
| 10 | Data any `json:"data"` | ||
| 11 | } | ||
| 12 | |||
| 13 | type LoginResponse struct { | ||
| 14 | Token string `json:"token"` | ||
| 15 | } | ||
| 16 | |||
| 7 | type User struct { | 17 | type 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 | |||
| 62 | type 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 | |||
| 72 | type ScoreResponse struct { | ||
| 73 | MapID int `json:"map_id"` | ||
| 74 | Records any `json:"records"` | ||
| 75 | } | ||
| 76 | |||
| 77 | func 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 @@ | |||
| 1 | package models | ||
| 2 | |||
| 3 | type Response struct { | ||
| 4 | Success bool `json:"success"` | ||
| 5 | Message string `json:"message"` | ||
| 6 | Data any `json:"data"` | ||
| 7 | } | ||
| 8 | |||
| 9 | type LoginResponse struct { | ||
| 10 | Token string `json:"token"` | ||
| 11 | } | ||
| 12 | |||
| 13 | type 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 | |||
| 21 | func ErrorResponse(message string) Response { | ||
| 22 | return Response{ | ||
| 23 | Success: false, | ||
| 24 | Message: message, | ||
| 25 | Data: nil, | ||
| 26 | } | ||
| 27 | } | ||