From b6096d1c07282f28dc264eeaed7a62f4bc9f4d08 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sun, 15 Jan 2023 11:43:53 +0300 Subject: retrieving competitive user records (#26) --- backend/controllers/userController.go | 154 ++++++++++++++++++++++++++++++++-- backend/models/models.go | 33 ++++++++ backend/models/responses.go | 27 ------ 3 files changed, 182 insertions(+), 32 deletions(-) delete mode 100644 backend/models/responses.go (limited to 'backend') 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) { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return } + // Retrieve singleplayer records + var scoresSP []models.ScoreResponse + sql := `SELECT id, map_id, score_count, score_time, demo_id, record_date FROM records_sp WHERE user_id = $1 ORDER BY map_id;` + rows, err := database.DB.Query(sql, user.(models.User).SteamID) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + i := 0 + var recordsSP []models.RecordSP + for rows.Next() { + var mapID int + var record models.RecordSP + rows.Scan(&record.RecordID, &mapID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate) + if i == 0 { + recordsSP = append(recordsSP, record) + scoresSP = append(scoresSP, models.ScoreResponse{ + MapID: mapID, + Records: recordsSP, + }) + continue + } + // More than one record in one map + if mapID == scoresSP[i-1].MapID { + scoresSP[i-1].Records = append(scoresSP[i-1].Records.([]models.RecordSP), record) + continue + } + // New map + recordsSP = append(recordsSP, record) + scoresSP = append(scoresSP, models.ScoreResponse{ + MapID: mapID, + Records: recordsSP, + }) + i++ + } + // Retrieve multiplayer records + var scoresMP []models.ScoreResponse + sql = `SELECT id, map_id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date FROM records_mp + WHERE host_id = $1 OR partner_id = $2 ORDER BY map_id;` + rows, err = database.DB.Query(sql, user.(models.User).SteamID, user.(models.User).SteamID) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + j := 0 + var recordsMP []models.RecordMP + for rows.Next() { + var mapID int + var record models.RecordMP + rows.Scan(&record.RecordID, &mapID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) + if j == 0 { + recordsMP = append(recordsMP, record) + scoresMP = append(scoresMP, models.ScoreResponse{ + MapID: mapID, + Records: recordsMP, + }) + continue + } + // More than one record in one map + if mapID == scoresMP[j-1].MapID { + scoresMP[j-1].Records = append(scoresMP[j-1].Records.([]models.RecordMP), record) + continue + } + // New map + recordsMP = append(recordsMP, record) + scoresMP = append(scoresMP, models.ScoreResponse{ + MapID: mapID, + Records: recordsMP, + }) + j++ + } c.JSON(http.StatusOK, models.Response{ Success: true, - Message: "", + Message: "Successfully retrieved user scores.", Data: models.ProfileResponse{ Profile: true, SteamID: user.(models.User).SteamID, Username: user.(models.User).Username, AvatarLink: user.(models.User).AvatarLink, CountryCode: user.(models.User).CountryCode, + ScoresSP: scoresSP, + ScoresMP: scoresMP, }, }) return @@ -52,17 +125,88 @@ func FetchUser(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - // Target user exists - _, exists := c.Get("user") + // Retrieve singleplayer records + var scoresSP []models.ScoreResponse + sql := `SELECT id, map_id, score_count, score_time, demo_id, record_date FROM records_sp WHERE user_id = $1 ORDER BY map_id;` + rows, err := database.DB.Query(sql, user.SteamID) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + i := 0 + var recordsSP []models.RecordSP + for rows.Next() { + var mapID int + var record models.RecordSP + rows.Scan(&record.RecordID, &mapID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate) + if i == 0 { + recordsSP = append(recordsSP, record) + scoresSP = append(scoresSP, models.ScoreResponse{ + MapID: mapID, + Records: recordsSP, + }) + continue + } + // More than one record in one map + if mapID == scoresSP[i-1].MapID { + scoresSP[i-1].Records = append(scoresSP[i-1].Records.([]models.RecordSP), record) + continue + } + // New map + recordsSP = append(recordsSP, record) + scoresSP = append(scoresSP, models.ScoreResponse{ + MapID: mapID, + Records: recordsSP, + }) + i++ + } + // Retrieve multiplayer records + var scoresMP []models.ScoreResponse + sql = `SELECT id, map_id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date FROM records_mp + WHERE host_id = $1 OR partner_id = $2 ORDER BY map_id;` + rows, err = database.DB.Query(sql, user.SteamID, user.SteamID) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + j := 0 + var recordsMP []models.RecordMP + for rows.Next() { + var mapID int + var record models.RecordMP + rows.Scan(&record.RecordID, &mapID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) + if j == 0 { + recordsMP = append(recordsMP, record) + scoresMP = append(scoresMP, models.ScoreResponse{ + MapID: mapID, + Records: recordsMP, + }) + continue + } + // More than one record in one map + if mapID == scoresMP[j-1].MapID { + scoresMP[j-1].Records = append(scoresMP[j-1].Records.([]models.RecordMP), record) + continue + } + // New map + recordsMP = append(recordsMP, record) + scoresMP = append(scoresMP, models.ScoreResponse{ + MapID: mapID, + Records: recordsMP, + }) + j++ + } c.JSON(http.StatusOK, models.Response{ Success: true, - Message: "", + Message: "Successfully retrieved user scores.", Data: models.ProfileResponse{ - Profile: exists, + Profile: true, SteamID: user.SteamID, Username: user.Username, AvatarLink: user.AvatarLink, CountryCode: user.CountryCode, + ScoresSP: scoresSP, + ScoresMP: scoresMP, }, }) 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 ( "time" ) +type Response struct { + Success bool `json:"success"` + Message string `json:"message"` + Data any `json:"data"` +} + +type LoginResponse struct { + Token string `json:"token"` +} + type User struct { SteamID string `json:"steam_id"` Username string `json:"username"` @@ -48,3 +58,26 @@ type RecordRequest struct { PartnerID string `json:"partner_id" form:"partner_id" binding:"required"` IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"` } + +type ProfileResponse struct { + Profile bool `json:"profile"` + SteamID string `json:"steam_id"` + Username string `json:"username"` + AvatarLink string `json:"avatar_link"` + CountryCode string `json:"country_code"` + ScoresSP []ScoreResponse `json:"scores_sp"` + ScoresMP []ScoreResponse `json:"scores_mp"` +} + +type ScoreResponse struct { + MapID int `json:"map_id"` + Records any `json:"records"` +} + +func ErrorResponse(message string) Response { + return Response{ + Success: false, + Message: message, + Data: nil, + } +} 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 @@ -package models - -type Response struct { - Success bool `json:"success"` - Message string `json:"message"` - Data any `json:"data"` -} - -type LoginResponse struct { - Token string `json:"token"` -} - -type ProfileResponse struct { - Profile bool `json:"profile"` - SteamID string `json:"steam_id"` - Username string `json:"username"` - AvatarLink string `json:"avatar_link"` - CountryCode string `json:"country_code"` -} - -func ErrorResponse(message string) Response { - return Response{ - Success: false, - Message: message, - Data: nil, - } -} -- cgit v1.2.3