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/controllers/homeController.go | 18 +++++++-- backend/controllers/loginController.go | 16 +++++--- backend/controllers/mapController.go | 27 ++++++++++--- backend/controllers/modController.go | 67 +++++++++++++++++++++++---------- backend/controllers/recordController.go | 20 ++++++++-- backend/controllers/userController.go | 43 ++++++++++++++------- backend/models/models.go | 14 +++++++ backend/models/requests.go | 39 ------------------- backend/models/responses.go | 64 ------------------------------- 9 files changed, 152 insertions(+), 156 deletions(-) delete mode 100644 backend/models/requests.go delete mode 100644 backend/models/responses.go (limited to 'backend') diff --git a/backend/controllers/homeController.go b/backend/controllers/homeController.go index c94590a..d1b99cb 100644 --- a/backend/controllers/homeController.go +++ b/backend/controllers/homeController.go @@ -10,6 +10,16 @@ import ( "github.com/pektezol/leastportalshub/backend/models" ) +type SearchResponse struct { + Players []models.UserShort `json:"players"` + Maps []models.MapShort `json:"maps"` +} + +type RankingsResponse struct { + RankingsSP []models.UserRanking `json:"rankings_sp"` + RankingsMP []models.UserRanking `json:"rankings_mp"` +} + func Home(c *gin.Context) { user, exists := c.Get("user") if !exists { @@ -26,7 +36,7 @@ func Home(c *gin.Context) { // @Description Get rankings of every player. // @Tags rankings // @Produce json -// @Success 200 {object} models.Response{data=models.RankingsResponse} +// @Success 200 {object} models.Response{data=RankingsResponse} // @Failure 400 {object} models.Response // @Router /rankings [get] func Rankings(c *gin.Context) { @@ -116,7 +126,7 @@ func Rankings(c *gin.Context) { c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully retrieved rankings.", - Data: models.RankingsResponse{ + Data: RankingsResponse{ RankingsSP: spRankings, RankingsMP: mpRankings, }, @@ -129,14 +139,14 @@ func Rankings(c *gin.Context) { // @Tags search // @Produce json // @Param q query string false "Search user or map name." -// @Success 200 {object} models.Response{data=models.SearchResponse} +// @Success 200 {object} models.Response{data=SearchResponse} // @Failure 400 {object} models.Response // @Router /search [get] func SearchWithQuery(c *gin.Context) { query := c.Query("q") query = strings.ToLower(query) log.Println(query) - var response models.SearchResponse + var response SearchResponse // Cache all maps for faster response var maps = []models.MapShort{ {ID: 1, Name: "Container Ride"}, diff --git a/backend/controllers/loginController.go b/backend/controllers/loginController.go index e907b22..76bf51f 100644 --- a/backend/controllers/loginController.go +++ b/backend/controllers/loginController.go @@ -15,13 +15,17 @@ import ( "github.com/solovev/steam_go" ) +type LoginResponse struct { + Token string `json:"token"` +} + // Login // // @Description Get (redirect) login page for Steam auth. // @Tags login // @Accept json // @Produce json -// @Success 200 {object} models.Response{data=models.LoginResponse} +// @Success 200 {object} models.Response{data=LoginResponse} // @Failure 400 {object} models.Response // @Router /login [get] func Login(c *gin.Context) { @@ -85,7 +89,7 @@ func Login(c *gin.Context) { // c.JSON(http.StatusOK, models.Response{ // Success: true, // Message: "Successfully generated token.", - // Data: models.LoginResponse{ + // Data: LoginResponse{ // Token: tokenString, // }, // }) @@ -99,7 +103,7 @@ func Login(c *gin.Context) { // @Tags auth // @Produce json // -// @Success 200 {object} models.Response{data=models.LoginResponse} +// @Success 200 {object} models.Response{data=LoginResponse} // @Failure 404 {object} models.Response // @Router /token [get] func GetCookie(c *gin.Context) { @@ -111,7 +115,7 @@ func GetCookie(c *gin.Context) { c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Token cookie successfully retrieved.", - Data: models.LoginResponse{ + Data: LoginResponse{ Token: cookie, }, }) @@ -123,7 +127,7 @@ func GetCookie(c *gin.Context) { // @Tags auth // @Produce json // -// @Success 200 {object} models.Response{data=models.LoginResponse} +// @Success 200 {object} models.Response{data=LoginResponse} // @Failure 404 {object} models.Response // @Router /token [delete] func DeleteCookie(c *gin.Context) { @@ -136,7 +140,7 @@ func DeleteCookie(c *gin.Context) { c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Token cookie successfully deleted.", - Data: models.LoginResponse{ + Data: LoginResponse{ Token: cookie, }, }) diff --git a/backend/controllers/mapController.go b/backend/controllers/mapController.go index ebd65dd..0a324d6 100644 --- a/backend/controllers/mapController.go +++ b/backend/controllers/mapController.go @@ -9,18 +9,33 @@ import ( "github.com/pektezol/leastportalshub/backend/models" ) +type MapSummaryResponse struct { + Map models.Map `json:"map"` + Summary models.MapSummary `json:"summary"` +} + +type ChaptersResponse struct { + Game models.Game `json:"game"` + Chapters []models.Chapter `json:"chapters"` +} + +type ChapterMapsResponse struct { + Chapter models.Chapter `json:"chapter"` + Maps []models.MapShort `json:"maps"` +} + // GET Map Summary // // @Description Get map summary with specified id. // @Tags maps // @Produce json // @Param id path int true "Map ID" -// @Success 200 {object} models.Response{data=models.MapSummaryResponse} +// @Success 200 {object} models.Response{data=MapSummaryResponse} // @Failure 400 {object} models.Response // @Router /maps/{id}/summary [get] func FetchMapSummary(c *gin.Context) { id := c.Param("id") - response := models.MapSummaryResponse{Map: models.Map{}, Summary: models.MapSummary{Routes: []models.MapRoute{}}} + response := MapSummaryResponse{Map: models.Map{}, Summary: models.MapSummary{Routes: []models.MapRoute{}}} intID, err := strconv.Atoi(id) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) @@ -220,7 +235,7 @@ func FetchGames(c *gin.Context) { // @Tags games & chapters // @Produce json // @Param id path int true "Game ID" -// @Success 200 {object} models.Response{data=models.ChaptersResponse} +// @Success 200 {object} models.Response{data=ChaptersResponse} // @Failure 400 {object} models.Response // @Router /games/{id} [get] func FetchChapters(c *gin.Context) { @@ -230,7 +245,7 @@ func FetchChapters(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - var response models.ChaptersResponse + var response ChaptersResponse rows, err := database.DB.Query(`SELECT c.id, c.name, g.name FROM chapters c INNER JOIN games g ON c.game_id = g.id WHERE game_id = $1`, gameID) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) @@ -262,7 +277,7 @@ func FetchChapters(c *gin.Context) { // @Tags games & chapters // @Produce json // @Param id path int true "Chapter ID" -// @Success 200 {object} models.Response{data=models.ChapterMapsResponse} +// @Success 200 {object} models.Response{data=ChapterMapsResponse} // @Failure 400 {object} models.Response // @Router /chapters/{id} [get] func FetchChapterMaps(c *gin.Context) { @@ -272,7 +287,7 @@ func FetchChapterMaps(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - var response models.ChapterMapsResponse + var response ChapterMapsResponse rows, err := database.DB.Query(`SELECT m.id, m.name, c.name FROM maps m INNER JOIN chapters c ON m.chapter_id = c.id WHERE chapter_id = $1`, chapterID) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) diff --git a/backend/controllers/modController.go b/backend/controllers/modController.go index e2add1f..7ce5cb4 100644 --- a/backend/controllers/modController.go +++ b/backend/controllers/modController.go @@ -3,21 +3,48 @@ package controllers import ( "net/http" "strconv" + "time" "github.com/gin-gonic/gin" "github.com/pektezol/leastportalshub/backend/database" "github.com/pektezol/leastportalshub/backend/models" ) +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"` +} + // POST Map Summary // // @Description Create map summary with specified map id. // @Tags maps // @Produce json -// @Param Authorization header string true "JWT Token" -// @Param id path int true "Map ID" -// @Param request body models.CreateMapSummaryRequest true "Body" -// @Success 200 {object} models.Response{data=models.CreateMapSummaryRequest} +// @Param Authorization header string true "JWT Token" +// @Param id path int true "Map ID" +// @Param request body CreateMapSummaryRequest true "Body" +// @Success 200 {object} models.Response{data=CreateMapSummaryRequest} // @Failure 400 {object} models.Response // @Router /maps/{id}/summary [post] func CreateMapSummary(c *gin.Context) { @@ -44,7 +71,7 @@ func CreateMapSummary(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - var request models.CreateMapSummaryRequest + var request CreateMapSummaryRequest if err := c.BindJSON(&request); err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -100,10 +127,10 @@ func CreateMapSummary(c *gin.Context) { // @Description Edit map summary with specified map id. // @Tags maps // @Produce json -// @Param Authorization header string true "JWT Token" -// @Param id path int true "Map ID" -// @Param request body models.EditMapSummaryRequest true "Body" -// @Success 200 {object} models.Response{data=models.EditMapSummaryRequest} +// @Param Authorization header string true "JWT Token" +// @Param id path int true "Map ID" +// @Param request body EditMapSummaryRequest true "Body" +// @Success 200 {object} models.Response{data=EditMapSummaryRequest} // @Failure 400 {object} models.Response // @Router /maps/{id}/summary [put] func EditMapSummary(c *gin.Context) { @@ -130,7 +157,7 @@ func EditMapSummary(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - var request models.EditMapSummaryRequest + var request EditMapSummaryRequest if err := c.BindJSON(&request); err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -186,10 +213,10 @@ func EditMapSummary(c *gin.Context) { // @Description Delete map summary with specified map id. // @Tags maps // @Produce json -// @Param Authorization header string true "JWT Token" -// @Param id path int true "Map ID" -// @Param request body models.DeleteMapSummaryRequest true "Body" -// @Success 200 {object} models.Response{data=models.DeleteMapSummaryRequest} +// @Param Authorization header string true "JWT Token" +// @Param id path int true "Map ID" +// @Param request body DeleteMapSummaryRequest true "Body" +// @Success 200 {object} models.Response{data=DeleteMapSummaryRequest} // @Failure 400 {object} models.Response // @Router /maps/{id}/summary [delete] func DeleteMapSummary(c *gin.Context) { @@ -216,7 +243,7 @@ func DeleteMapSummary(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - var request models.DeleteMapSummaryRequest + var request DeleteMapSummaryRequest if err := c.BindJSON(&request); err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -276,10 +303,10 @@ func DeleteMapSummary(c *gin.Context) { // @Description Edit map image with specified map id. // @Tags maps // @Produce json -// @Param Authorization header string true "JWT Token" -// @Param id path int true "Map ID" -// @Param request body models.EditMapImageRequest true "Body" -// @Success 200 {object} models.Response{data=models.EditMapImageRequest} +// @Param Authorization header string true "JWT Token" +// @Param id path int true "Map ID" +// @Param request body EditMapImageRequest true "Body" +// @Success 200 {object} models.Response{data=EditMapImageRequest} // @Failure 400 {object} models.Response // @Router /maps/{id}/image [put] func EditMapImage(c *gin.Context) { @@ -306,7 +333,7 @@ func EditMapImage(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - var request models.EditMapImageRequest + var request EditMapImageRequest if err := c.BindJSON(&request); err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return diff --git a/backend/controllers/recordController.go b/backend/controllers/recordController.go index 951be41..d141fc3 100644 --- a/backend/controllers/recordController.go +++ b/backend/controllers/recordController.go @@ -19,6 +19,18 @@ import ( "google.golang.org/api/drive/v3" ) +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"` +} + +type RecordResponse struct { + ScoreCount int `json:"score_count"` + ScoreTime int `json:"score_time"` +} + // POST Record // // @Description Post record with demo of a specific map. @@ -31,7 +43,7 @@ import ( // @Param partner_demo formData file false "Partner Demo" // @Param is_partner_orange formData boolean false "Is Partner Orange" // @Param partner_id formData string false "Partner ID" -// @Success 200 {object} models.Response{data=models.RecordResponse} +// @Success 200 {object} models.Response{data=RecordResponse} // @Failure 400 {object} models.Response // @Failure 401 {object} models.Response // @Router /maps/{id}/record [post] @@ -61,7 +73,7 @@ func CreateRecordWithDemo(c *gin.Context) { isCoop = true } // Get record request - var record models.RecordRequest + var record RecordRequest if err := c.ShouldBind(&record); err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -183,7 +195,7 @@ func CreateRecordWithDemo(c *gin.Context) { c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully created record.", - Data: models.RecordResponse{ScoreCount: hostDemoScoreCount, ScoreTime: hostDemoScoreTime}, + Data: RecordResponse{ScoreCount: hostDemoScoreCount, ScoreTime: hostDemoScoreTime}, }) } @@ -253,6 +265,7 @@ func serviceAccount() *http.Client { return client } +// Create Gdrive file func createFile(service *drive.Service, name string, mimeType string, content io.Reader, parentId string) (*drive.File, error) { f := &drive.File{ MimeType: mimeType, @@ -269,6 +282,7 @@ func createFile(service *drive.Service, name string, mimeType string, content io return file, nil } +// Delete Gdrive file func deleteFile(service *drive.Service, fileId string) { service.Files.Delete(fileId) } diff --git a/backend/controllers/userController.go b/backend/controllers/userController.go index 6aa77fc..0dae155 100644 --- a/backend/controllers/userController.go +++ b/backend/controllers/userController.go @@ -11,6 +11,21 @@ import ( "github.com/pektezol/leastportalshub/backend/models" ) +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"` +} + // GET Profile // // @Description Get profile page of session user. @@ -18,7 +33,7 @@ import ( // @Accept json // @Produce json // @Param Authorization header string true "JWT Token" -// @Success 200 {object} models.Response{data=models.ProfileResponse} +// @Success 200 {object} models.Response{data=ProfileResponse} // @Failure 400 {object} models.Response // @Failure 401 {object} models.Response // @Router /profile [get] @@ -30,7 +45,7 @@ func Profile(c *gin.Context) { return } // Retrieve singleplayer records - var scoresSP []models.ScoreResponse + 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` rows, err := database.DB.Query(sql, user.(models.User).SteamID) if err != nil { @@ -50,13 +65,13 @@ func Profile(c *gin.Context) { // New map recordsSP = []models.RecordSP{} recordsSP = append(recordsSP, record) - scoresSP = append(scoresSP, models.ScoreResponse{ + scoresSP = append(scoresSP, ScoreResponse{ MapID: mapID, Records: recordsSP, }) } // Retrieve multiplayer records - var scoresMP []models.ScoreResponse + 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) @@ -77,7 +92,7 @@ func Profile(c *gin.Context) { // New map recordsMP = []models.RecordMP{} recordsMP = append(recordsMP, record) - scoresMP = append(scoresMP, models.ScoreResponse{ + scoresMP = append(scoresMP, ScoreResponse{ MapID: mapID, Records: recordsMP, }) @@ -85,7 +100,7 @@ func Profile(c *gin.Context) { c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully retrieved user scores.", - Data: models.ProfileResponse{ + Data: ProfileResponse{ Profile: true, SteamID: user.(models.User).SteamID, UserName: user.(models.User).UserName, @@ -105,7 +120,7 @@ func Profile(c *gin.Context) { // @Accept json // @Produce json // @Param id path int true "User ID" -// @Success 200 {object} models.Response{data=models.ProfileResponse} +// @Success 200 {object} models.Response{data=ProfileResponse} // @Failure 400 {object} models.Response // @Failure 404 {object} models.Response // @Router /users/{id} [get] @@ -132,7 +147,7 @@ func FetchUser(c *gin.Context) { return } // Retrieve singleplayer records - var scoresSP []models.ScoreResponse + 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` rows, err := database.DB.Query(sql, user.SteamID) if err != nil { @@ -152,13 +167,13 @@ func FetchUser(c *gin.Context) { // New map recordsSP = []models.RecordSP{} recordsSP = append(recordsSP, record) - scoresSP = append(scoresSP, models.ScoreResponse{ + scoresSP = append(scoresSP, ScoreResponse{ MapID: mapID, Records: recordsSP, }) } // Retrieve multiplayer records - var scoresMP []models.ScoreResponse + 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.SteamID, user.SteamID) @@ -179,7 +194,7 @@ func FetchUser(c *gin.Context) { // New map recordsMP = []models.RecordMP{} recordsMP = append(recordsMP, record) - scoresMP = append(scoresMP, models.ScoreResponse{ + scoresMP = append(scoresMP, ScoreResponse{ MapID: mapID, Records: recordsMP, }) @@ -187,7 +202,7 @@ func FetchUser(c *gin.Context) { c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully retrieved user scores.", - Data: models.ProfileResponse{ + Data: ProfileResponse{ Profile: true, SteamID: user.SteamID, UserName: user.UserName, @@ -207,7 +222,7 @@ func FetchUser(c *gin.Context) { // @Accept json // @Produce json // @Param Authorization header string true "JWT Token" -// @Success 200 {object} models.Response{data=models.ProfileResponse} +// @Success 200 {object} models.Response{data=ProfileResponse} // @Failure 400 {object} models.Response // @Failure 401 {object} models.Response // @Router /profile [post] @@ -233,7 +248,7 @@ func UpdateUser(c *gin.Context) { c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully updated user.", - Data: models.ProfileResponse{ + Data: ProfileResponse{ Profile: true, SteamID: user.(models.User).SteamID, UserName: profile.PersonaName, 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