From df6f6cb5ff8957be8f01d58d60857da2c094a3d9 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 12 Sep 2024 00:25:15 +0300 Subject: refactor: unofficial rankings implementation --- backend/api/routes.go | 6 ++- backend/docs/docs.go | 90 ++++++++++++++++++++++++++++++++++++++++- backend/docs/swagger.json | 90 ++++++++++++++++++++++++++++++++++++++++- backend/docs/swagger.yaml | 57 +++++++++++++++++++++++++- backend/handlers/home.go | 100 +++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 329 insertions(+), 14 deletions(-) (limited to 'backend') diff --git a/backend/api/routes.go b/backend/api/routes.go index 050a3bd..81f1ec6 100644 --- a/backend/api/routes.go +++ b/backend/api/routes.go @@ -25,7 +25,8 @@ const ( mapRecordIDPath string = "/maps/:mapid/record/:recordid" mapDiscussionsPath string = "/maps/:mapid/discussions" mapDiscussionIDPath string = "/maps/:mapid/discussions/:discussionid" - rankingsPath string = "/rankings" + rankingsLPHUBPath string = "/rankings/lphub" + rankingsSteamPath string = "/rankings/steam" searchPath string = "/search" gamesPath string = "/games" chaptersPath string = "/games/:gameid" @@ -73,7 +74,8 @@ func InitRoutes(router *gin.Engine) { v1.PUT(mapDiscussionIDPath, CheckAuth, handlers.EditMapDiscussion) v1.DELETE(mapDiscussionIDPath, CheckAuth, handlers.DeleteMapDiscussion) // Rankings, search - v1.GET(rankingsPath, handlers.Rankings) + v1.GET(rankingsLPHUBPath, handlers.RankingsLPHUB) + v1.GET(rankingsSteamPath, handlers.RankingsSteam) v1.GET(searchPath, handlers.SearchWithQuery) // Games, chapters, maps v1.GET(gamesPath, handlers.FetchGames) diff --git a/backend/docs/docs.go b/backend/docs/docs.go index f652a1e..c4b2801 100644 --- a/backend/docs/docs.go +++ b/backend/docs/docs.go @@ -1171,9 +1171,9 @@ const docTemplate = `{ } } }, - "/rankings": { + "/rankings/lphub": { "get": { - "description": "Get rankings of every player.", + "description": "Get rankings of every player from LPHUB.", "produces": [ "application/json" ], @@ -1202,6 +1202,37 @@ const docTemplate = `{ } } }, + "/rankings/steam": { + "get": { + "description": "Get rankings of every player from Steam.", + "produces": [ + "application/json" + ], + "tags": [ + "rankings" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/handlers.RankingsSteamResponse" + } + } + } + ] + } + } + } + } + }, "/search": { "get": { "description": "Get all user and map data matching to the query.", @@ -1789,6 +1820,29 @@ const docTemplate = `{ } } }, + "handlers.RankingsSteamResponse": { + "type": "object", + "properties": { + "rankings_multiplayer": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.SteamUserRanking" + } + }, + "rankings_overall": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.SteamUserRanking" + } + }, + "rankings_singleplayer": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.SteamUserRanking" + } + } + } + }, "handlers.RecordResponse": { "type": "object", "properties": { @@ -1854,6 +1908,38 @@ const docTemplate = `{ } } }, + "handlers.SteamUserRanking": { + "type": "object", + "properties": { + "avatar_link": { + "type": "string" + }, + "mp_rank": { + "type": "integer" + }, + "mp_score": { + "type": "integer" + }, + "overall_rank": { + "type": "integer" + }, + "overall_score": { + "type": "integer" + }, + "sp_rank": { + "type": "integer" + }, + "sp_score": { + "type": "integer" + }, + "steam_id": { + "type": "string" + }, + "user_name": { + "type": "string" + } + } + }, "models.Category": { "type": "object", "properties": { diff --git a/backend/docs/swagger.json b/backend/docs/swagger.json index 6de5978..7613d2c 100644 --- a/backend/docs/swagger.json +++ b/backend/docs/swagger.json @@ -1165,9 +1165,9 @@ } } }, - "/rankings": { + "/rankings/lphub": { "get": { - "description": "Get rankings of every player.", + "description": "Get rankings of every player from LPHUB.", "produces": [ "application/json" ], @@ -1196,6 +1196,37 @@ } } }, + "/rankings/steam": { + "get": { + "description": "Get rankings of every player from Steam.", + "produces": [ + "application/json" + ], + "tags": [ + "rankings" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/handlers.RankingsSteamResponse" + } + } + } + ] + } + } + } + } + }, "/search": { "get": { "description": "Get all user and map data matching to the query.", @@ -1783,6 +1814,29 @@ } } }, + "handlers.RankingsSteamResponse": { + "type": "object", + "properties": { + "rankings_multiplayer": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.SteamUserRanking" + } + }, + "rankings_overall": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.SteamUserRanking" + } + }, + "rankings_singleplayer": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.SteamUserRanking" + } + } + } + }, "handlers.RecordResponse": { "type": "object", "properties": { @@ -1848,6 +1902,38 @@ } } }, + "handlers.SteamUserRanking": { + "type": "object", + "properties": { + "avatar_link": { + "type": "string" + }, + "mp_rank": { + "type": "integer" + }, + "mp_score": { + "type": "integer" + }, + "overall_rank": { + "type": "integer" + }, + "overall_score": { + "type": "integer" + }, + "sp_rank": { + "type": "integer" + }, + "sp_score": { + "type": "integer" + }, + "steam_id": { + "type": "string" + }, + "user_name": { + "type": "string" + } + } + }, "models.Category": { "type": "object", "properties": { diff --git a/backend/docs/swagger.yaml b/backend/docs/swagger.yaml index 853b3b9..22651e3 100644 --- a/backend/docs/swagger.yaml +++ b/backend/docs/swagger.yaml @@ -283,6 +283,21 @@ definitions: $ref: '#/definitions/models.UserRanking' type: array type: object + handlers.RankingsSteamResponse: + properties: + rankings_multiplayer: + items: + $ref: '#/definitions/handlers.SteamUserRanking' + type: array + rankings_overall: + items: + $ref: '#/definitions/handlers.SteamUserRanking' + type: array + rankings_singleplayer: + items: + $ref: '#/definitions/handlers.SteamUserRanking' + type: array + type: object handlers.RecordResponse: properties: score_count: @@ -325,6 +340,27 @@ definitions: $ref: '#/definitions/models.UserShortWithAvatar' type: array type: object + handlers.SteamUserRanking: + properties: + avatar_link: + type: string + mp_rank: + type: integer + mp_score: + type: integer + overall_rank: + type: integer + overall_score: + type: integer + sp_rank: + type: integer + sp_score: + type: integer + steam_id: + type: string + user_name: + type: string + type: object models.Category: properties: id: @@ -1216,9 +1252,9 @@ paths: $ref: '#/definitions/models.Response' tags: - users - /rankings: + /rankings/lphub: get: - description: Get rankings of every player. + description: Get rankings of every player from LPHUB. produces: - application/json responses: @@ -1233,6 +1269,23 @@ paths: type: object tags: - rankings + /rankings/steam: + get: + description: Get rankings of every player from Steam. + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/models.Response' + - properties: + data: + $ref: '#/definitions/handlers.RankingsSteamResponse' + type: object + tags: + - rankings /search: get: description: Get all user and map data matching to the query. diff --git a/backend/handlers/home.go b/backend/handlers/home.go index 1734d28..fd7c6c0 100644 --- a/backend/handlers/home.go +++ b/backend/handlers/home.go @@ -1,8 +1,11 @@ package handlers import ( + "encoding/json" + "io" "log" "net/http" + "os" "sort" "strings" @@ -18,9 +21,26 @@ type SearchResponse struct { } type RankingsResponse struct { - Overall []models.UserRanking `json:"rankings_overall"` Singleplayer []models.UserRanking `json:"rankings_singleplayer"` Multiplayer []models.UserRanking `json:"rankings_multiplayer"` + Overall []models.UserRanking `json:"rankings_overall"` +} + +type SteamUserRanking struct { + UserName string `json:"user_name"` + AvatarLink string `json:"avatar_link"` + SteamID string `json:"steam_id"` + SpScore int `json:"sp_score"` + MpScore int `json:"mp_score"` + OverallScore int `json:"overall_score"` + SpRank int `json:"sp_rank"` + MpRank int `json:"mp_rank"` + OverallRank int `json:"overall_rank"` +} +type RankingsSteamResponse struct { + Singleplayer []SteamUserRanking `json:"rankings_singleplayer"` + Multiplayer []SteamUserRanking `json:"rankings_multiplayer"` + Overall []SteamUserRanking `json:"rankings_overall"` } type MapShortWithGame struct { @@ -30,18 +50,18 @@ type MapShortWithGame struct { Map string `json:"map"` } -// GET Rankings +// GET Rankings LPHUB // -// @Description Get rankings of every player. +// @Description Get rankings of every player from LPHUB. // @Tags rankings // @Produce json // @Success 200 {object} models.Response{data=RankingsResponse} -// @Router /rankings [get] -func Rankings(c *gin.Context) { +// @Router /rankings/lphub [get] +func RankingsLPHUB(c *gin.Context) { response := RankingsResponse{ - Overall: []models.UserRanking{}, Singleplayer: []models.UserRanking{}, Multiplayer: []models.UserRanking{}, + Overall: []models.UserRanking{}, } // Singleplayer rankings sql := `SELECT u.steam_id, u.user_name, u.avatar_link, COUNT(DISTINCT map_id), @@ -171,6 +191,74 @@ func Rankings(c *gin.Context) { }) } +// GET Rankings Steam +// +// @Description Get rankings of every player from Steam. +// @Tags rankings +// @Produce json +// @Success 200 {object} models.Response{data=RankingsSteamResponse} +// @Router /rankings/steam [get] +func RankingsSteam(c *gin.Context) { + response := RankingsSteamResponse{ + Singleplayer: []SteamUserRanking{}, + Multiplayer: []SteamUserRanking{}, + Overall: []SteamUserRanking{}, + } + spJson, err := os.Open("../rankings/output/sp.json") + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + defer spJson.Close() + spJsonBytes, err := io.ReadAll(spJson) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + err = json.Unmarshal(spJsonBytes, &response.Singleplayer) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + mpJson, err := os.Open("../rankings/output/mp.json") + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + defer mpJson.Close() + mpJsonBytes, err := io.ReadAll(mpJson) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + err = json.Unmarshal(mpJsonBytes, &response.Multiplayer) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + overallJson, err := os.Open("../rankings/output/overall.json") + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + defer overallJson.Close() + overallJsonBytes, err := io.ReadAll(overallJson) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + err = json.Unmarshal(overallJsonBytes, &response.Overall) + if err != nil { + c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) + return + } + c.JSON(http.StatusOK, models.Response{ + Success: true, + Message: "Successfully retrieved rankings.", + Data: response, + }) +} + // GET Search With Query // // @Description Get all user and map data matching to the query. -- cgit v1.2.3