diff options
Diffstat (limited to '')
| -rw-r--r-- | backend/controllers/userController.go | 95 |
1 files changed, 46 insertions, 49 deletions
diff --git a/backend/controllers/userController.go b/backend/controllers/userController.go index 0dae155..64f144a 100644 --- a/backend/controllers/userController.go +++ b/backend/controllers/userController.go | |||
| @@ -17,8 +17,39 @@ type ProfileResponse struct { | |||
| 17 | UserName string `json:"user_name"` | 17 | UserName string `json:"user_name"` |
| 18 | AvatarLink string `json:"avatar_link"` | 18 | AvatarLink string `json:"avatar_link"` |
| 19 | CountryCode string `json:"country_code"` | 19 | CountryCode string `json:"country_code"` |
| 20 | ScoresSP []ScoreResponse `json:"scores_sp"` | 20 | Titles []models.Title `json:"titles"` |
| 21 | ScoresMP []ScoreResponse `json:"scores_mp"` | 21 | Links models.Links `json:"links"` |
| 22 | Rankings ProfileRankings `json:"rankings"` | ||
| 23 | Records ProfileRecords `json:"records"` | ||
| 24 | } | ||
| 25 | |||
| 26 | type ProfileRankings struct { | ||
| 27 | Overall ProfileRankingsDetails `json:"overall"` | ||
| 28 | Singleplayer ProfileRankingsDetails `json:"singleplayer"` | ||
| 29 | Cooperative ProfileRankingsDetails `json:"cooperative"` | ||
| 30 | } | ||
| 31 | |||
| 32 | type ProfileRankingsDetails struct { | ||
| 33 | Rank int `json:"rank"` | ||
| 34 | CompletionCount int `json:"completion_count"` | ||
| 35 | CompletionTotal int `json:"completion_total"` | ||
| 36 | } | ||
| 37 | |||
| 38 | type ProfileRecords struct { | ||
| 39 | P2Singleplayer ProfileRecordsDetails `json:"portal2_singleplayer"` | ||
| 40 | P2Cooperative ProfileRecordsDetails `json:"portal2_cooperative"` | ||
| 41 | } | ||
| 42 | |||
| 43 | type ProfileRecordsDetails struct { | ||
| 44 | MapID int `json:"map_id"` | ||
| 45 | Scores []ProfileScores `json:"scores"` | ||
| 46 | } | ||
| 47 | |||
| 48 | type ProfileScores struct { | ||
| 49 | DemoID string `json:"demo_id"` | ||
| 50 | ScoreCount int `json:"score_count"` | ||
| 51 | ScoreTime int `json:"score_time"` | ||
| 52 | Date time.Time `json:"date"` | ||
| 22 | } | 53 | } |
| 23 | 54 | ||
| 24 | type ScoreResponse struct { | 55 | type ScoreResponse struct { |
| @@ -44,58 +75,22 @@ func Profile(c *gin.Context) { | |||
| 44 | c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) | 75 | c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) |
| 45 | return | 76 | return |
| 46 | } | 77 | } |
| 47 | // Retrieve singleplayer records | 78 | // Get user titles |
| 48 | var scoresSP []ScoreResponse | 79 | titles := []models.Title{} |
| 49 | sql := `SELECT id, map_id, score_count, score_time, demo_id, record_date FROM records_sp WHERE user_id = $1 ORDER BY map_id` | 80 | sql := `SELECT t.title_name, t.title_color FROM titles t |
| 81 | INNER JOIN user_titles ut ON t.id=ut.title_id WHERE ut.user_id = $1` | ||
| 50 | rows, err := database.DB.Query(sql, user.(models.User).SteamID) | 82 | rows, err := database.DB.Query(sql, user.(models.User).SteamID) |
| 51 | if err != nil { | 83 | if err != nil { |
| 52 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 84 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 53 | return | 85 | return |
| 54 | } | 86 | } |
| 55 | var recordsSP []models.RecordSP | ||
| 56 | for rows.Next() { | ||
| 57 | var mapID int | ||
| 58 | var record models.RecordSP | ||
| 59 | rows.Scan(&record.RecordID, &mapID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate) | ||
| 60 | // More than one record in one map | ||
| 61 | if len(scoresSP) != 0 && mapID == scoresSP[len(scoresSP)-1].MapID { | ||
| 62 | scoresSP[len(scoresSP)-1].Records = append(scoresSP[len(scoresSP)-1].Records.([]models.RecordSP), record) | ||
| 63 | continue | ||
| 64 | } | ||
| 65 | // New map | ||
| 66 | recordsSP = []models.RecordSP{} | ||
| 67 | recordsSP = append(recordsSP, record) | ||
| 68 | scoresSP = append(scoresSP, ScoreResponse{ | ||
| 69 | MapID: mapID, | ||
| 70 | Records: recordsSP, | ||
| 71 | }) | ||
| 72 | } | ||
| 73 | // Retrieve multiplayer records | ||
| 74 | var scoresMP []ScoreResponse | ||
| 75 | sql = `SELECT id, map_id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date FROM records_mp | ||
| 76 | WHERE host_id = $1 OR partner_id = $2 ORDER BY map_id` | ||
| 77 | rows, err = database.DB.Query(sql, user.(models.User).SteamID, user.(models.User).SteamID) | ||
| 78 | if err != nil { | ||
| 79 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | ||
| 80 | return | ||
| 81 | } | ||
| 82 | var recordsMP []models.RecordMP | ||
| 83 | for rows.Next() { | 87 | for rows.Next() { |
| 84 | var mapID int | 88 | var title models.Title |
| 85 | var record models.RecordMP | 89 | if err := rows.Scan(&title.Name, &title.Color); err != nil { |
| 86 | rows.Scan(&record.RecordID, &mapID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) | 90 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 87 | // More than one record in one map | 91 | return |
| 88 | if len(scoresMP) != 0 && mapID == scoresMP[len(scoresMP)-1].MapID { | ||
| 89 | scoresMP[len(scoresMP)-1].Records = append(scoresMP[len(scoresMP)-1].Records.([]models.RecordMP), record) | ||
| 90 | continue | ||
| 91 | } | 92 | } |
| 92 | // New map | 93 | titles = append(titles, title) |
| 93 | recordsMP = []models.RecordMP{} | ||
| 94 | recordsMP = append(recordsMP, record) | ||
| 95 | scoresMP = append(scoresMP, ScoreResponse{ | ||
| 96 | MapID: mapID, | ||
| 97 | Records: recordsMP, | ||
| 98 | }) | ||
| 99 | } | 94 | } |
| 100 | c.JSON(http.StatusOK, models.Response{ | 95 | c.JSON(http.StatusOK, models.Response{ |
| 101 | Success: true, | 96 | Success: true, |
| @@ -106,8 +101,10 @@ func Profile(c *gin.Context) { | |||
| 106 | UserName: user.(models.User).UserName, | 101 | UserName: user.(models.User).UserName, |
| 107 | AvatarLink: user.(models.User).AvatarLink, | 102 | AvatarLink: user.(models.User).AvatarLink, |
| 108 | CountryCode: user.(models.User).CountryCode, | 103 | CountryCode: user.(models.User).CountryCode, |
| 109 | ScoresSP: scoresSP, | 104 | Titles: user.(models.User).Titles, |
| 110 | ScoresMP: scoresMP, | 105 | Links: models.Links{}, |
| 106 | Rankings: ProfileRankings{}, | ||
| 107 | Records: ProfileRecords{}, | ||
| 111 | }, | 108 | }, |
| 112 | }) | 109 | }) |
| 113 | return | 110 | return |