From ca7acc2fdc6e6c8371ca5bbeeaabb02d11bb1bee Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sun, 20 Aug 2023 12:51:26 +0300 Subject: refactor: move structs around for better understanding Former-commit-id: 0030a6b0c7b228772d8e27f5722ee6de1718786b --- backend/models/models.go | 14 ++++++++++ backend/models/requests.go | 39 --------------------------- backend/models/responses.go | 64 --------------------------------------------- 3 files changed, 14 insertions(+), 103 deletions(-) delete mode 100644 backend/models/requests.go delete mode 100644 backend/models/responses.go (limited to 'backend/models') diff --git a/backend/models/models.go b/backend/models/models.go index 1231cb1..e21ba6a 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -4,6 +4,20 @@ import ( "time" ) +type Response struct { + Success bool `json:"success"` + Message string `json:"message"` + Data any `json:"data"` +} + +func ErrorResponse(message string) Response { + return Response{ + Success: false, + Message: message, + Data: nil, + } +} + type User struct { SteamID string `json:"steam_id"` UserName string `json:"user_name"` diff --git a/backend/models/requests.go b/backend/models/requests.go deleted file mode 100644 index 0113597..0000000 --- a/backend/models/requests.go +++ /dev/null @@ -1,39 +0,0 @@ -package models - -import ( - "mime/multipart" - "time" -) - -type CreateMapSummaryRequest struct { - CategoryID int `json:"category_id" binding:"required"` - Description string `json:"description" binding:"required"` - Showcase string `json:"showcase"` - UserName string `json:"user_name" binding:"required"` - ScoreCount *int `json:"score_count" binding:"required"` - RecordDate time.Time `json:"record_date" binding:"required"` -} - -type EditMapSummaryRequest struct { - RouteID int `json:"route_id" binding:"required"` - Description string `json:"description" binding:"required"` - Showcase string `json:"showcase"` - UserName string `json:"user_name" binding:"required"` - ScoreCount *int `json:"score_count" binding:"required"` - RecordDate time.Time `json:"record_date" binding:"required"` -} - -type DeleteMapSummaryRequest struct { - RouteID int `json:"route_id" binding:"required"` -} - -type EditMapImageRequest struct { - Image string `json:"image" binding:"required"` -} - -type RecordRequest struct { - HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required" swaggerignore:"true"` - PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo" swaggerignore:"true"` - IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange"` - PartnerID string `json:"partner_id" form:"partner_id"` -} diff --git a/backend/models/responses.go b/backend/models/responses.go deleted file mode 100644 index 459911c..0000000 --- a/backend/models/responses.go +++ /dev/null @@ -1,64 +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 RankingsResponse struct { - RankingsSP []UserRanking `json:"rankings_sp"` - RankingsMP []UserRanking `json:"rankings_mp"` -} - -type ProfileResponse struct { - Profile bool `json:"profile"` - SteamID string `json:"steam_id"` - UserName string `json:"user_name"` - 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"` -} - -type MapSummaryResponse struct { - Map Map `json:"map"` - Summary MapSummary `json:"summary"` -} - -type SearchResponse struct { - Players []UserShort `json:"players"` - Maps []MapShort `json:"maps"` -} - -type ChaptersResponse struct { - Game Game `json:"game"` - Chapters []Chapter `json:"chapters"` -} - -type ChapterMapsResponse struct { - Chapter Chapter `json:"chapter"` - Maps []MapShort `json:"maps"` -} - -type RecordResponse struct { - ScoreCount int `json:"score_count"` - ScoreTime int `json:"score_time"` -} - -func ErrorResponse(message string) Response { - return Response{ - Success: false, - Message: message, - Data: nil, - } -} -- cgit v1.2.3 From ca973edc28b5fe543c583217896590f4a2e98897 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 24 Aug 2023 22:34:05 +0300 Subject: fix: mod flag for easy check (#49) Former-commit-id: 06ee23ee9659834252d3cb5c3c255797e9f93b62 --- .gitignore | 3 +- backend/controllers/modController.go | 44 +++++----------- backend/controllers/userController.go | 95 +++++++++++++++++------------------ backend/database/init.sql | 15 +++++- backend/middleware/auth.go | 13 +++-- backend/models/models.go | 14 +++++- 6 files changed, 95 insertions(+), 89 deletions(-) (limited to 'backend/models') diff --git a/.gitignore b/.gitignore index 1434a43..10d4fda 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .vscode *.sh *.txt -*.dem \ No newline at end of file +*.dem +*.json \ No newline at end of file diff --git a/backend/controllers/modController.go b/backend/controllers/modController.go index 7ce5cb4..7acdb5d 100644 --- a/backend/controllers/modController.go +++ b/backend/controllers/modController.go @@ -49,18 +49,13 @@ type EditMapImageRequest struct { // @Router /maps/{id}/summary [post] func CreateMapSummary(c *gin.Context) { // Check if user exists - user, exists := c.Get("user") + _, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return } - var moderator bool - for _, title := range user.(models.User).Titles { - if title == "Moderator" { - moderator = true - } - } - if !moderator { + mod, exists := c.Get("mod") + if !exists || !mod.(bool) { c.JSON(http.StatusUnauthorized, models.ErrorResponse("Insufficient permissions.")) return } @@ -135,18 +130,13 @@ func CreateMapSummary(c *gin.Context) { // @Router /maps/{id}/summary [put] func EditMapSummary(c *gin.Context) { // Check if user exists - user, exists := c.Get("user") + _, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return } - var moderator bool - for _, title := range user.(models.User).Titles { - if title == "Moderator" { - moderator = true - } - } - if !moderator { + mod, exists := c.Get("mod") + if !exists || !mod.(bool) { c.JSON(http.StatusUnauthorized, models.ErrorResponse("Insufficient permissions.")) return } @@ -221,18 +211,13 @@ func EditMapSummary(c *gin.Context) { // @Router /maps/{id}/summary [delete] func DeleteMapSummary(c *gin.Context) { // Check if user exists - user, exists := c.Get("user") + _, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return } - var moderator bool - for _, title := range user.(models.User).Titles { - if title == "Moderator" { - moderator = true - } - } - if !moderator { + mod, exists := c.Get("mod") + if !exists || !mod.(bool) { c.JSON(http.StatusUnauthorized, models.ErrorResponse("Insufficient permissions.")) return } @@ -311,18 +296,13 @@ func DeleteMapSummary(c *gin.Context) { // @Router /maps/{id}/image [put] func EditMapImage(c *gin.Context) { // Check if user exists - user, exists := c.Get("user") + _, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return } - var moderator bool - for _, title := range user.(models.User).Titles { - if title == "Moderator" { - moderator = true - } - } - if !moderator { + mod, exists := c.Get("mod") + if !exists || !mod.(bool) { c.JSON(http.StatusUnauthorized, models.ErrorResponse("Insufficient permissions.")) return } 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 { UserName string `json:"user_name"` AvatarLink string `json:"avatar_link"` CountryCode string `json:"country_code"` - ScoresSP []ScoreResponse `json:"scores_sp"` - ScoresMP []ScoreResponse `json:"scores_mp"` + Titles []models.Title `json:"titles"` + Links models.Links `json:"links"` + Rankings ProfileRankings `json:"rankings"` + Records ProfileRecords `json:"records"` +} + +type ProfileRankings struct { + Overall ProfileRankingsDetails `json:"overall"` + Singleplayer ProfileRankingsDetails `json:"singleplayer"` + Cooperative ProfileRankingsDetails `json:"cooperative"` +} + +type ProfileRankingsDetails struct { + Rank int `json:"rank"` + CompletionCount int `json:"completion_count"` + CompletionTotal int `json:"completion_total"` +} + +type ProfileRecords struct { + P2Singleplayer ProfileRecordsDetails `json:"portal2_singleplayer"` + P2Cooperative ProfileRecordsDetails `json:"portal2_cooperative"` +} + +type ProfileRecordsDetails struct { + MapID int `json:"map_id"` + Scores []ProfileScores `json:"scores"` +} + +type ProfileScores struct { + DemoID string `json:"demo_id"` + ScoreCount int `json:"score_count"` + ScoreTime int `json:"score_time"` + Date time.Time `json:"date"` } type ScoreResponse struct { @@ -44,58 +75,22 @@ func Profile(c *gin.Context) { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return } - // Retrieve singleplayer records - var scoresSP []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` + // Get user titles + titles := []models.Title{} + sql := `SELECT t.title_name, t.title_color FROM titles t + INNER JOIN user_titles ut ON t.id=ut.title_id WHERE ut.user_id = $1` rows, err := database.DB.Query(sql, user.(models.User).SteamID) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - 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) - // More than one record in one map - if len(scoresSP) != 0 && mapID == scoresSP[len(scoresSP)-1].MapID { - scoresSP[len(scoresSP)-1].Records = append(scoresSP[len(scoresSP)-1].Records.([]models.RecordSP), record) - continue - } - // New map - recordsSP = []models.RecordSP{} - recordsSP = append(recordsSP, record) - scoresSP = append(scoresSP, ScoreResponse{ - MapID: mapID, - Records: recordsSP, - }) - } - // Retrieve multiplayer records - var scoresMP []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 - } - 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) - // More than one record in one map - if len(scoresMP) != 0 && mapID == scoresMP[len(scoresMP)-1].MapID { - scoresMP[len(scoresMP)-1].Records = append(scoresMP[len(scoresMP)-1].Records.([]models.RecordMP), record) - continue + var title models.Title + if err := rows.Scan(&title.Name, &title.Color); err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return } - // New map - recordsMP = []models.RecordMP{} - recordsMP = append(recordsMP, record) - scoresMP = append(scoresMP, ScoreResponse{ - MapID: mapID, - Records: recordsMP, - }) + titles = append(titles, title) } c.JSON(http.StatusOK, models.Response{ Success: true, @@ -106,8 +101,10 @@ func Profile(c *gin.Context) { UserName: user.(models.User).UserName, AvatarLink: user.(models.User).AvatarLink, CountryCode: user.(models.User).CountryCode, - ScoresSP: scoresSP, - ScoresMP: scoresMP, + Titles: user.(models.User).Titles, + Links: models.Links{}, + Rankings: ProfileRankings{}, + Records: ProfileRecords{}, }, }) return diff --git a/backend/database/init.sql b/backend/database/init.sql index 11d4944..25de872 100644 --- a/backend/database/init.sql +++ b/backend/database/init.sql @@ -3,6 +3,10 @@ CREATE TABLE users ( user_name TEXT NOT NULL, avatar_link TEXT NOT NULL, country_code CHAR(2) NOT NULL, + p2sr TEXT NOT NULL DEFAULT '-', + steam TEXT NOT NULL DEFAULT '-', + youtube TEXT NOT NULL DEFAULT '-', + twitch TEXT NOT NULL DEFAULT '-', created_at TIMESTAMP NOT NULL DEFAULT now(), updated_at TIMESTAMP NOT NULL DEFAULT now(), PRIMARY KEY (steam_id) @@ -117,9 +121,16 @@ CREATE TABLE records_mp ( ); CREATE TABLE titles ( - user_id TEXT, + id SERIAL, title_name TEXT NOT NULL, - PRIMARY KEY (user_id), + title_color CHAR(6) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE user_titles ( + title_id INT NOT NULL, + user_id TEXT NOT NULL, + FOREIGN KEY (title_id) REFERENCES titles(id), FOREIGN KEY (user_id) REFERENCES users(steam_id) ); diff --git a/backend/middleware/auth.go b/backend/middleware/auth.go index 6a057da..e2c84fa 100644 --- a/backend/middleware/auth.go +++ b/backend/middleware/auth.go @@ -44,14 +44,19 @@ func CheckAuth(c *gin.Context) { return } // Get user titles from DB - user.Titles = []string{} - rows, _ := database.DB.Query(`SELECT title_name FROM titles t INNER JOIN user_titles ut ON t.id=ut.title_id WHERE ut.user_id = $1`, user.SteamID) + var moderator bool + user.Titles = []models.Title{} + rows, _ := database.DB.Query(`SELECT t.title_name, t.title_color FROM titles t INNER JOIN user_titles ut ON t.id=ut.title_id WHERE ut.user_id = $1`, user.SteamID) for rows.Next() { - var title string - rows.Scan(&title) + var title models.Title + rows.Scan(&title.Name, &title.Color) + if title.Name == "Moderator" { + moderator = true + } user.Titles = append(user.Titles, title) } c.Set("user", user) + c.Set("mod", moderator) c.Next() } else { c.Next() diff --git a/backend/models/models.go b/backend/models/models.go index e21ba6a..f124db5 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -25,7 +25,7 @@ type User struct { CountryCode string `json:"country_code"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` - Titles []string `json:"titles"` + Titles []Title `json:"titles"` } type UserShort struct { @@ -92,6 +92,18 @@ type Category struct { Name string `json:"name"` } +type Title struct { + Name string `json:"name"` + Color string `json:"color"` +} + +type Links struct { + P2SR string `json:"p2sr"` + Steam string `json:"stream"` + YouTube string `json:"youtube"` + Twitch string `json:"twitch"` +} + type RecordSP struct { RecordID int `json:"record_id"` Placement int `json:"placement"` -- cgit v1.2.3 From ee533d9405e3ffe1fd1a073e29f839568c465ba7 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 30 Aug 2023 16:31:29 +0300 Subject: feat: better leaderboards response, coop additions (#45) Former-commit-id: 3a4a8af14d054512204b5ca4c25a6603ec94773e --- backend/handlers/map.go | 104 +++++++++++++++++++++++++++++++++++------------ backend/models/models.go | 28 ------------- 2 files changed, 79 insertions(+), 53 deletions(-) (limited to 'backend/models') diff --git a/backend/handlers/map.go b/backend/handlers/map.go index b47e793..9b0caef 100644 --- a/backend/handlers/map.go +++ b/backend/handlers/map.go @@ -3,6 +3,7 @@ package handlers import ( "net/http" "strconv" + "time" "github.com/gin-gonic/gin" "github.com/pektezol/leastportalshub/backend/database" @@ -14,6 +15,11 @@ type MapSummaryResponse struct { Summary models.MapSummary `json:"summary"` } +type MapLeaderboardsResponse struct { + Map models.Map `json:"map"` + Records any `json:"records"` +} + type ChaptersResponse struct { Game models.Game `json:"game"` Chapters []models.Chapter `json:"chapters"` @@ -24,6 +30,34 @@ type ChapterMapsResponse struct { Maps []models.MapShort `json:"maps"` } +type RecordSingleplayer struct { + Placement int `json:"placement"` + RecordID int `json:"record_id"` + ScoreCount int `json:"score_count"` + ScoreTime int `json:"score_time"` + UserID string `json:"user_id"` + UserName string `json:"user_name"` + UserAvatar string `json:"user_avatar"` + DemoID string `json:"demo_id"` + RecordDate time.Time `json:"record_date"` +} + +type RecordMultiplayer struct { + Placement int `json:"placement"` + RecordID int `json:"record_id"` + ScoreCount int `json:"score_count"` + ScoreTime int `json:"score_time"` + HostID string `json:"host_id"` + HostName string `json:"host_name"` + HostAvatar string `json:"host_avatar"` + PartnerID string `json:"partner_id"` + PartnerName string `json:"partner_name"` + PartnerAvatar string `json:"partner_avatar"` + HostDemoID string `json:"host_demo_id"` + PartnerDemoID string `json:"partner_demo_id"` + RecordDate time.Time `json:"record_date"` +} + // GET Map Summary // // @Description Get map summary with specified id. @@ -88,28 +122,29 @@ func FetchMapSummary(c *gin.Context) { // @Tags maps // @Produce json // @Param id path int true "Map ID" -// @Success 200 {object} models.Response{data=models.Map{data=models.MapRecords}} +// @Success 200 {object} models.Response{data=MapLeaderboardsResponse} // @Failure 400 {object} models.Response // @Router /maps/{id}/leaderboards [get] func FetchMapLeaderboards(c *gin.Context) { // TODO: make new response type id := c.Param("id") // Get map data - var mapData models.Map - var mapRecordsData models.MapRecords + response := MapLeaderboardsResponse{Map: models.Map{}, Records: nil} + // var mapData models.Map + // var mapRecordsData models.MapRecords var isDisabled bool intID, err := strconv.Atoi(id) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - mapData.ID = intID + response.Map.ID = intID sql := `SELECT g.name, c.name, m.name, is_disabled, m.image FROM maps m INNER JOIN games g ON m.game_id = g.id INNER JOIN chapters c ON m.chapter_id = c.id WHERE m.id = $1` - err = database.DB.QueryRow(sql, id).Scan(&mapData.GameName, &mapData.ChapterName, &mapData.MapName, &isDisabled, &mapData.Image) + err = database.DB.QueryRow(sql, id).Scan(&response.Map.GameName, &response.Map.ChapterName, &response.Map.MapName, &isDisabled, &response.Map.Image) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -119,17 +154,38 @@ func FetchMapLeaderboards(c *gin.Context) { return } // TODO: avatar and names for host & partner - // Get records from the map - if mapData.GameName == "Portal 2 - Cooperative" { - var records []models.RecordMP - sql = `SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date - FROM ( - SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date, - ROW_NUMBER() OVER (PARTITION BY host_id, partner_id ORDER BY score_count, score_time) AS rn - FROM records_mp - WHERE map_id = $1 - ) sub - WHERE rn = 1` + if response.Map.GameName == "Portal 2 - Cooperative" { + records := []RecordMultiplayer{} + sql = `SELECT + sub.id, + sub.host_id, + host.user_name AS host_user_name, + host.avatar_link AS host_avatar_link, + sub.partner_id, + partner.user_name AS partner_user_name, + partner.avatar_link AS partner_avatar_link, + sub.score_count, + sub.score_time, + sub.host_demo_id, + sub.partner_demo_id, + sub.record_date + FROM ( + SELECT + id, + host_id, + partner_id, + score_count, + score_time, + host_demo_id, + partner_demo_id, + record_date, + ROW_NUMBER() OVER (PARTITION BY host_id, partner_id ORDER BY score_count, score_time) AS rn + FROM records_mp + WHERE map_id = $1 + ) sub + JOIN users AS host ON sub.host_id = host.steam_id + JOIN users AS partner ON sub.partner_id = partner.steam_id + WHERE sub.rn = 1;` rows, err := database.DB.Query(sql, id) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) @@ -138,8 +194,8 @@ func FetchMapLeaderboards(c *gin.Context) { placement := 1 ties := 0 for rows.Next() { - var record models.RecordMP - err := rows.Scan(&record.RecordID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) + var record RecordMultiplayer + err := rows.Scan(&record.RecordID, &record.HostID, &record.HostName, &record.HostAvatar, &record.PartnerID, &record.PartnerName, &record.PartnerAvatar, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -153,9 +209,9 @@ func FetchMapLeaderboards(c *gin.Context) { records = append(records, record) placement++ } - mapRecordsData.Records = records + response.Records = records } else { - var records []models.RecordSP + records := []RecordSingleplayer{} sql = `SELECT id, user_id, users.user_name, users.avatar_link, score_count, score_time, demo_id, record_date FROM ( SELECT id, user_id, score_count, score_time, demo_id, record_date, @@ -173,7 +229,7 @@ func FetchMapLeaderboards(c *gin.Context) { placement := 1 ties := 0 for rows.Next() { - var record models.RecordSP + var record RecordSingleplayer err := rows.Scan(&record.RecordID, &record.UserID, &record.UserName, &record.UserAvatar, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) @@ -188,14 +244,12 @@ func FetchMapLeaderboards(c *gin.Context) { records = append(records, record) placement++ } - mapRecordsData.Records = records + response.Records = records } - // mapData.Data = mapRecordsData - // Return response c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully retrieved map leaderboards.", - Data: mapData, + Data: response, }) } diff --git a/backend/models/models.go b/backend/models/models.go index f124db5..b706d25 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -104,34 +104,6 @@ type Links struct { Twitch string `json:"twitch"` } -type RecordSP struct { - RecordID int `json:"record_id"` - Placement int `json:"placement"` - UserID string `json:"user_id"` - UserName string `json:"user_name"` - UserAvatar string `json:"user_avatar"` - ScoreCount int `json:"score_count"` - ScoreTime int `json:"score_time"` - DemoID string `json:"demo_id"` - RecordDate time.Time `json:"record_date"` -} - -type RecordMP struct { - RecordID int `json:"record_id"` - Placement int `json:"placement"` - HostID string `json:"host_id"` - HostName string `json:"host_name"` - HostAvatar string `json:"host_avatar"` - PartnerID string `json:"partner_id"` - PartnerName string `json:"partner_name"` - PartnerAvatar string `json:"partner_avatar"` - ScoreCount int `json:"score_count"` - ScoreTime int `json:"score_time"` - HostDemoID string `json:"host_demo_id"` - PartnerDemoID string `json:"partner_demo_id"` - RecordDate time.Time `json:"record_date"` -} - type PlayerSummaries struct { SteamId string `json:"steamid"` CommunityVisibilityState int `json:"communityvisibilitystate"` -- cgit v1.2.3 From dd9a047dc6512b3b6419ac4bd05a77bc22be95b0 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 16:26:48 +0300 Subject: fix: imrpoved user models on responses Former-commit-id: 3aeb7e76928081664f33a4012bd1d84c81eef77c --- backend/handlers/home.go | 9 ++++----- backend/handlers/map.go | 42 ++++++++++++++++++------------------------ backend/models/models.go | 11 ++++++++--- 3 files changed, 30 insertions(+), 32 deletions(-) (limited to 'backend/models') diff --git a/backend/handlers/home.go b/backend/handlers/home.go index 53be1de..eb3912c 100644 --- a/backend/handlers/home.go +++ b/backend/handlers/home.go @@ -68,7 +68,7 @@ func Rankings(c *gin.Context) { ranking := models.UserRanking{} var currentCount int var totalCount int - err = rows.Scan(&ranking.UserID, &ranking.UserName, ¤tCount, &totalCount, &ranking.TotalScore) + err = rows.Scan(&ranking.User.SteamID, &ranking.User.UserName, ¤tCount, &totalCount, &ranking.TotalScore) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -100,7 +100,7 @@ func Rankings(c *gin.Context) { ranking := models.UserRanking{} var currentCount int var totalCount int - err = rows.Scan(&ranking.UserID, &ranking.UserName, ¤tCount, &totalCount, &ranking.TotalScore) + err = rows.Scan(&ranking.User.SteamID, &ranking.User.UserName, ¤tCount, &totalCount, &ranking.TotalScore) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -113,11 +113,10 @@ func Rankings(c *gin.Context) { // Has both so they are qualified for overall ranking for _, spRanking := range response.Singleplayer { for _, mpRanking := range response.Multiplayer { - if spRanking.UserID == mpRanking.UserID { + if spRanking.User.SteamID == mpRanking.User.SteamID { totalScore := spRanking.TotalScore + mpRanking.TotalScore overallRanking := models.UserRanking{ - UserID: spRanking.UserID, - UserName: spRanking.UserName, + User: spRanking.User, TotalScore: totalScore, } response.Overall = append(response.Overall, overallRanking) diff --git a/backend/handlers/map.go b/backend/handlers/map.go index 0a0206e..1d9cee8 100644 --- a/backend/handlers/map.go +++ b/backend/handlers/map.go @@ -31,31 +31,25 @@ type ChapterMapsResponse struct { } type RecordSingleplayer struct { - Placement int `json:"placement"` - RecordID int `json:"record_id"` - ScoreCount int `json:"score_count"` - ScoreTime int `json:"score_time"` - UserID string `json:"user_id"` - UserName string `json:"user_name"` - UserAvatar string `json:"user_avatar"` - DemoID string `json:"demo_id"` - RecordDate time.Time `json:"record_date"` + Placement int `json:"placement"` + RecordID int `json:"record_id"` + ScoreCount int `json:"score_count"` + ScoreTime int `json:"score_time"` + User models.UserShortWithAvatar `json:"user"` + DemoID string `json:"demo_id"` + RecordDate time.Time `json:"record_date"` } type RecordMultiplayer struct { - Placement int `json:"placement"` - RecordID int `json:"record_id"` - ScoreCount int `json:"score_count"` - ScoreTime int `json:"score_time"` - HostID string `json:"host_id"` - HostName string `json:"host_name"` - HostAvatar string `json:"host_avatar"` - PartnerID string `json:"partner_id"` - PartnerName string `json:"partner_name"` - PartnerAvatar string `json:"partner_avatar"` - HostDemoID string `json:"host_demo_id"` - PartnerDemoID string `json:"partner_demo_id"` - RecordDate time.Time `json:"record_date"` + Placement int `json:"placement"` + RecordID int `json:"record_id"` + ScoreCount int `json:"score_count"` + ScoreTime int `json:"score_time"` + Host models.UserShortWithAvatar `json:"host"` + Partner models.UserShortWithAvatar `json:"partner"` + HostDemoID string `json:"host_demo_id"` + PartnerDemoID string `json:"partner_demo_id"` + RecordDate time.Time `json:"record_date"` } // GET Map Summary @@ -195,7 +189,7 @@ func FetchMapLeaderboards(c *gin.Context) { ties := 0 for rows.Next() { var record RecordMultiplayer - err := rows.Scan(&record.RecordID, &record.HostID, &record.HostName, &record.HostAvatar, &record.PartnerID, &record.PartnerName, &record.PartnerAvatar, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) + err := rows.Scan(&record.RecordID, &record.Host.SteamID, &record.Host.UserName, &record.Host.AvatarLink, &record.Partner.SteamID, &record.Partner.UserName, &record.Partner.AvatarLink, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -230,7 +224,7 @@ func FetchMapLeaderboards(c *gin.Context) { ties := 0 for rows.Next() { var record RecordSingleplayer - err := rows.Scan(&record.RecordID, &record.UserID, &record.UserName, &record.UserAvatar, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate) + err := rows.Scan(&record.RecordID, &record.User.SteamID, &record.User.UserName, &record.User.AvatarLink, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return diff --git a/backend/models/models.go b/backend/models/models.go index b706d25..2d54295 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -33,6 +33,12 @@ type UserShort struct { UserName string `json:"user_name"` } +type UserShortWithAvatar struct { + SteamID string `json:"steam_id"` + UserName string `json:"user_name"` + AvatarLink string `json:"avatar_link"` +} + type Map struct { ID int `json:"id"` GameName string `json:"game_name"` @@ -71,9 +77,8 @@ type MapRecords struct { } type UserRanking struct { - UserID string `json:"user_id"` - UserName string `json:"user_name"` - TotalScore int `json:"total_score"` + User UserShort `json:"user"` + TotalScore int `json:"total_score"` } type Game struct { -- cgit v1.2.3