From 1f47d78a5f82998fe62fefe6d6f076583c101800 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 17 Jun 2023 12:30:25 +0300 Subject: feat: search with query (#40) --- backend/routes/routes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backend/routes') diff --git a/backend/routes/routes.go b/backend/routes/routes.go index 96da1ce..bf8a995 100644 --- a/backend/routes/routes.go +++ b/backend/routes/routes.go @@ -29,7 +29,7 @@ func InitRoutes(router *gin.Engine) { v1.GET("/maps/:id/leaderboards", middleware.CheckAuth, controllers.FetchMapLeaderboards) v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) v1.GET("/rankings", middleware.CheckAuth, controllers.Rankings) - v1.GET("/search", controllers.Search) + v1.GET("/search", controllers.SearchWithQuery) v1.GET("/games", controllers.FetchGames) v1.GET("/games/:id", controllers.FetchChapters) v1.GET("/chapters/:id", controllers.FetchChapterMaps) -- cgit v1.2.3 From 8cce8b446e63d03161f0807c76721b40d851b50d Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 28 Jun 2023 23:27:22 +0300 Subject: feat: mod edit for map summary Former-commit-id: dbef520658347a8c23546371ced24f1c0271749d --- backend/controllers/modController.go | 91 ++++++++++++++++++++++++++++++++++++ backend/middleware/auth.go | 10 +++- backend/models/models.go | 1 + backend/models/requests.go | 29 ++++++++++-- backend/routes/routes.go | 1 + 5 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 backend/controllers/modController.go (limited to 'backend/routes') diff --git a/backend/controllers/modController.go b/backend/controllers/modController.go new file mode 100644 index 0000000..ebf1cb7 --- /dev/null +++ b/backend/controllers/modController.go @@ -0,0 +1,91 @@ +package controllers + +import ( + "net/http" + "strconv" + + "github.com/gin-gonic/gin" + "github.com/pektezol/leastportals/backend/database" + "github.com/pektezol/leastportals/backend/models" +) + +// PUT Map Summary +// +// @Summary Edit map summary with specified map id. +// @Tags maps +// @Produce json +// @Param id path int true "Map ID" +// @Success 200 {object} models.Response{data=models.EditMapSummaryRequest} +// @Failure 400 {object} models.Response +// @Router /maps/{id}/summary [put] +func EditMapSummary(c *gin.Context) { + // Check if user exists + 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 { + c.JSON(http.StatusUnauthorized, "Insufficient permissions.") + return + } + // Bind parameter and body + id := c.Param("id") + mapID, err := strconv.Atoi(id) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + var request models.EditMapSummaryRequest + if err := c.BindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + // Fetch route category and score count + var categoryID, scoreCount int + sql := `SELECT mr.category_id, mr.score_count + FROM map_routes mr + INNER JOIN maps m + WHERE m.id = $1 AND mr.id = $2` + err = database.DB.QueryRow(sql, mapID, request.RouteID).Scan(&categoryID, &scoreCount) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + // Start database transaction + tx, err := database.DB.Begin() + if err != nil { + c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) + return + } + defer tx.Rollback() + // Update database with new data + sql = `UPDATE map_routes SET score_count = $2, description = $3, showcase = $4 WHERE id = $1` + _, err = tx.Exec(sql, request.RouteID, request.ScoreCount, request.Description, request.Showcase) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + sql = `UPDATE map_history SET user_name = $3, score_count = $4, record_date = $5 WHERE map_id = $1 AND category_id = $2` + _, err = tx.Exec(sql, mapID, categoryID, request.UserName, request.ScoreCount, request.RecordDate) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + if err = tx.Commit(); err != nil { + c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) + return + } + // Return response + c.JSON(http.StatusOK, models.Response{ + Success: true, + Message: "Successfully updated map summary.", + Data: request, + }) +} diff --git a/backend/middleware/auth.go b/backend/middleware/auth.go index 14a0b78..86e79d9 100644 --- a/backend/middleware/auth.go +++ b/backend/middleware/auth.go @@ -36,13 +36,21 @@ func CheckAuth(c *gin.Context) { } // Get user from DB var user models.User - database.DB.QueryRow(`SELECT * FROM users WHERE steam_id = $1`, claims["sub"]).Scan( + database.DB.QueryRow(`SELECT u.steam_id, u.user_name, u.avatar_link, u.country_code, u.created_at, u.updated_at, array_agg(t.) FROM users u WHERE steam_id = $1`, claims["sub"]).Scan( &user.SteamID, &user.UserName, &user.AvatarLink, &user.CountryCode, &user.CreatedAt, &user.UpdatedAt) if user.SteamID == "" { c.Next() return } + // Get user titles from DB + user.Titles = []string{} + rows, _ := database.DB.Query(`SELECT t.title_name FROM titles t WHERE t.user_id = $1`, user.SteamID) + for rows.Next() { + var title string + rows.Scan(&title) + user.Titles = append(user.Titles, title) + } c.Set("user", user) c.Next() } else { diff --git a/backend/models/models.go b/backend/models/models.go index 7b8cbc4..5355a9f 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -11,6 +11,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"` } type UserShort struct { diff --git a/backend/models/requests.go b/backend/models/requests.go index 49b2d75..e95eab6 100644 --- a/backend/models/requests.go +++ b/backend/models/requests.go @@ -1,8 +1,29 @@ package models +import ( + "mime/multipart" + "time" +) + +type EditMapSummaryRequest struct { + RouteID int `json:"route_id" binding:"required"` + Description string `json:"description" binding:"required"` + Showcase string `json:"showcase" binding:"required"` + UserName string `json:"user_name" binding:"required"` + ScoreCount int `json:"score_count" binding:"required"` + RecordDate time.Time `json:"record_date" binding:"required"` +} + +type CreateMapHistoryRequest struct { + CategoryID int `json:"category_id" binding:"required"` + UserName string `json:"user_name" binding:"required"` + ScoreCount int `json:"score_count" binding:"required"` + RecordDate time.Time `json:"record_date" binding:"required"` +} + type RecordRequest struct { - ScoreCount int `json:"score_count" form:"score_count" binding:"required"` - ScoreTime int `json:"score_time" form:"score_time" binding:"required"` - PartnerID string `json:"partner_id" form:"partner_id" binding:"required"` - IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"` + HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required"` + PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo"` + IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange"` + PartnerID string `json:"partner_id" form:"partner_id"` } diff --git a/backend/routes/routes.go b/backend/routes/routes.go index bf8a995..93dc1dd 100644 --- a/backend/routes/routes.go +++ b/backend/routes/routes.go @@ -26,6 +26,7 @@ func InitRoutes(router *gin.Engine) { v1.GET("/users/:id", middleware.CheckAuth, controllers.FetchUser) v1.GET("/demos", controllers.DownloadDemoWithID) v1.GET("/maps/:id/summary", middleware.CheckAuth, controllers.FetchMapSummary) + v1.PUT("/maps/:id/summary", middleware.CheckAuth, controllers.EditMapSummary) v1.GET("/maps/:id/leaderboards", middleware.CheckAuth, controllers.FetchMapLeaderboards) v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) v1.GET("/rankings", middleware.CheckAuth, controllers.Rankings) -- cgit v1.2.3 From 94d51cc7783519f94176e813f195a07f50d4de69 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 29 Jun 2023 19:23:48 +0300 Subject: feat: create map summary Former-commit-id: 5ab31d8543512b9d32e3d25beee347e9668f8323 --- backend/controllers/modController.go | 87 +++++++++++++++++++++++++++++++++++- backend/routes/routes.go | 1 + 2 files changed, 87 insertions(+), 1 deletion(-) (limited to 'backend/routes') diff --git a/backend/controllers/modController.go b/backend/controllers/modController.go index 5fe0f68..75be112 100644 --- a/backend/controllers/modController.go +++ b/backend/controllers/modController.go @@ -9,6 +9,91 @@ import ( "github.com/pektezol/leastportals/backend/models" ) +// POST Map Summary +// +// @Summary Create map summary with specified map id. +// @Tags maps +// @Produce json +// @Param id path int true "Map ID" +// @Param request body models.CreateMapSummaryRequest true "Body" +// @Success 200 {object} models.Response{data=models.CreateMapSummaryRequest} +// @Failure 400 {object} models.Response +// @Router /maps/{id}/summary [post] +func CreateMapSummary(c *gin.Context) { + // Check if user exists + 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 { + c.JSON(http.StatusUnauthorized, models.ErrorResponse("Insufficient permissions.")) + return + } + // Bind parameter and body + id := c.Param("id") + mapID, err := strconv.Atoi(id) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + var request models.CreateMapSummaryRequest + if err := c.BindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + // Start database transaction + tx, err := database.DB.Begin() + if err != nil { + c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) + return + } + defer tx.Rollback() + // Fetch route category and score count + var checkMapID int + sql := `SELECT m.id FROM maps m WHERE m.id = $1` + err = database.DB.QueryRow(sql, mapID).Scan(&checkMapID) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + if mapID != checkMapID { + c.JSON(http.StatusBadRequest, models.ErrorResponse("Map ID does not exist.")) + return + } + // Update database with new data + sql = `INSERT INTO map_routes (map_id,category_id,score_count,description,showcase) + VALUES ($1,$2,$3,$4,$5)` + _, err = tx.Exec(sql, mapID, request.CategoryID, request.ScoreCount, request.Description, request.Showcase) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + sql = `INSERT INTO map_history (map_id,category_id,user_name,score_count,record_date) + VALUES ($1,$2,$3,$4,$5)` + _, err = tx.Exec(sql, mapID, request.CategoryID, request.UserName, request.ScoreCount, request.RecordDate) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + if err = tx.Commit(); err != nil { + c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) + return + } + // Return response + c.JSON(http.StatusOK, models.Response{ + Success: true, + Message: "Successfully updated map summary.", + Data: request, + }) +} + // PUT Map Summary // // @Summary Edit map summary with specified map id. @@ -33,7 +118,7 @@ func EditMapSummary(c *gin.Context) { } } if !moderator { - c.JSON(http.StatusUnauthorized, "Insufficient permissions.") + c.JSON(http.StatusUnauthorized, models.ErrorResponse("Insufficient permissions.")) return } // Bind parameter and body diff --git a/backend/routes/routes.go b/backend/routes/routes.go index 93dc1dd..2eb91a4 100644 --- a/backend/routes/routes.go +++ b/backend/routes/routes.go @@ -26,6 +26,7 @@ func InitRoutes(router *gin.Engine) { v1.GET("/users/:id", middleware.CheckAuth, controllers.FetchUser) v1.GET("/demos", controllers.DownloadDemoWithID) v1.GET("/maps/:id/summary", middleware.CheckAuth, controllers.FetchMapSummary) + v1.POST("/maps/:id/summary", middleware.CheckAuth, controllers.CreateMapSummary) v1.PUT("/maps/:id/summary", middleware.CheckAuth, controllers.EditMapSummary) v1.GET("/maps/:id/leaderboards", middleware.CheckAuth, controllers.FetchMapLeaderboards) v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) -- cgit v1.2.3 From c393b3771a51453258cd504bf816e4f12b0cfc2b Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 29 Jun 2023 19:40:20 +0300 Subject: fix: remove middleware for unneeded routes Former-commit-id: 0e357aca92274049c7bea7d70910befef4427efc --- backend/routes/routes.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'backend/routes') diff --git a/backend/routes/routes.go b/backend/routes/routes.go index 2eb91a4..feb49f3 100644 --- a/backend/routes/routes.go +++ b/backend/routes/routes.go @@ -25,12 +25,12 @@ func InitRoutes(router *gin.Engine) { v1.POST("/profile", middleware.CheckAuth, controllers.UpdateUser) v1.GET("/users/:id", middleware.CheckAuth, controllers.FetchUser) v1.GET("/demos", controllers.DownloadDemoWithID) - v1.GET("/maps/:id/summary", middleware.CheckAuth, controllers.FetchMapSummary) + v1.GET("/maps/:id/summary", controllers.FetchMapSummary) v1.POST("/maps/:id/summary", middleware.CheckAuth, controllers.CreateMapSummary) v1.PUT("/maps/:id/summary", middleware.CheckAuth, controllers.EditMapSummary) - v1.GET("/maps/:id/leaderboards", middleware.CheckAuth, controllers.FetchMapLeaderboards) + v1.GET("/maps/:id/leaderboards", controllers.FetchMapLeaderboards) v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) - v1.GET("/rankings", middleware.CheckAuth, controllers.Rankings) + v1.GET("/rankings", controllers.Rankings) v1.GET("/search", controllers.SearchWithQuery) v1.GET("/games", controllers.FetchGames) v1.GET("/games/:id", controllers.FetchChapters) -- cgit v1.2.3 From 779c99ea5425f68d62f53b00a9f1e9920573aea1 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:08:59 +0300 Subject: feat: delete map summary route Former-commit-id: 2f2f884426ff0be75d4ec1b1220edb05b20ba9d8 --- backend/routes/routes.go | 1 + 1 file changed, 1 insertion(+) (limited to 'backend/routes') diff --git a/backend/routes/routes.go b/backend/routes/routes.go index feb49f3..a39c8c4 100644 --- a/backend/routes/routes.go +++ b/backend/routes/routes.go @@ -28,6 +28,7 @@ func InitRoutes(router *gin.Engine) { v1.GET("/maps/:id/summary", controllers.FetchMapSummary) v1.POST("/maps/:id/summary", middleware.CheckAuth, controllers.CreateMapSummary) v1.PUT("/maps/:id/summary", middleware.CheckAuth, controllers.EditMapSummary) + v1.DELETE("/maps/:id/summary", middleware.CheckAuth, controllers.DeleteMapSummary) v1.GET("/maps/:id/leaderboards", controllers.FetchMapLeaderboards) v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) v1.GET("/rankings", controllers.Rankings) -- cgit v1.2.3 From 311a039edc8f91666c8d05acd94aabab20833ffe Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 12 Jul 2023 14:26:24 +0300 Subject: feat: edit map image Former-commit-id: 288e6772dda69a9543a01db85069c95476addd4e --- backend/controllers/modController.go | 55 ++++++++++++++++++ backend/models/requests.go | 4 ++ backend/routes/routes.go | 1 + docs/docs.go | 104 ++++++++++++++++++++++++++++++++++- docs/swagger.json | 104 ++++++++++++++++++++++++++++++++++- docs/swagger.yaml | 63 ++++++++++++++++++++- 6 files changed, 328 insertions(+), 3 deletions(-) (limited to 'backend/routes') diff --git a/backend/controllers/modController.go b/backend/controllers/modController.go index ff79e3e..98fb165 100644 --- a/backend/controllers/modController.go +++ b/backend/controllers/modController.go @@ -264,3 +264,58 @@ func DeleteMapSummary(c *gin.Context) { Data: request, }) } + +// PUT Map Image +// +// @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} +// @Failure 400 {object} models.Response +// @Router /maps/{id}/image [put] +func EditMapImage(c *gin.Context) { + // Check if user exists + 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 { + c.JSON(http.StatusUnauthorized, models.ErrorResponse("Insufficient permissions.")) + return + } + // Bind parameter and body + id := c.Param("id") + mapID, err := strconv.Atoi(id) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + var request models.EditMapImageRequest + if err := c.BindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + // Update database with new data + sql := `UPDATE maps SET image = $2 WHERE id = $1` + _, err = database.DB.Exec(sql, mapID, request.Image) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + // Return response + c.JSON(http.StatusOK, models.Response{ + Success: true, + Message: "Successfully updated map image.", + Data: request, + }) +} diff --git a/backend/models/requests.go b/backend/models/requests.go index f275203..fac05b6 100644 --- a/backend/models/requests.go +++ b/backend/models/requests.go @@ -27,6 +27,10 @@ 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"` diff --git a/backend/routes/routes.go b/backend/routes/routes.go index a39c8c4..1377d32 100644 --- a/backend/routes/routes.go +++ b/backend/routes/routes.go @@ -29,6 +29,7 @@ func InitRoutes(router *gin.Engine) { v1.POST("/maps/:id/summary", middleware.CheckAuth, controllers.CreateMapSummary) v1.PUT("/maps/:id/summary", middleware.CheckAuth, controllers.EditMapSummary) v1.DELETE("/maps/:id/summary", middleware.CheckAuth, controllers.DeleteMapSummary) + v1.PUT("/maps/:id/image", middleware.CheckAuth, controllers.EditMapImage) v1.GET("/maps/:id/leaderboards", controllers.FetchMapLeaderboards) v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) v1.GET("/rankings", controllers.Rankings) diff --git a/docs/docs.go b/docs/docs.go index 57984f4..13d4cf6 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -229,6 +229,68 @@ const docTemplate = `{ } } }, + "/maps/{id}/image": { + "put": { + "description": "Edit map image with specified map id.", + "produces": [ + "application/json" + ], + "tags": [ + "maps" + ], + "parameters": [ + { + "type": "string", + "description": "JWT Token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "description": "Map ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Body", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.EditMapImageRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/models.EditMapImageRequest" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, "/maps/{id}/leaderboards": { "get": { "description": "Get map leaderboards with specified id.", @@ -344,7 +406,19 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Response" + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/models.RecordResponse" + } + } + } + ] } }, "400": { @@ -1047,6 +1121,17 @@ const docTemplate = `{ } } }, + "models.EditMapImageRequest": { + "type": "object", + "required": [ + "image" + ], + "properties": { + "image": { + "type": "string" + } + } + }, "models.EditMapSummaryRequest": { "type": "object", "required": [ @@ -1084,6 +1169,9 @@ const docTemplate = `{ "id": { "type": "integer" }, + "is_coop": { + "type": "boolean" + }, "name": { "type": "string" } @@ -1112,6 +1200,9 @@ const docTemplate = `{ "image": { "type": "string" }, + "is_coop": { + "type": "boolean" + }, "map_name": { "type": "string" } @@ -1242,6 +1333,17 @@ const docTemplate = `{ } } }, + "models.RecordResponse": { + "type": "object", + "properties": { + "score_count": { + "type": "integer" + }, + "score_time": { + "type": "integer" + } + } + }, "models.Response": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index ef422ab..f644288 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -222,6 +222,68 @@ } } }, + "/maps/{id}/image": { + "put": { + "description": "Edit map image with specified map id.", + "produces": [ + "application/json" + ], + "tags": [ + "maps" + ], + "parameters": [ + { + "type": "string", + "description": "JWT Token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "type": "integer", + "description": "Map ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Body", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.EditMapImageRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/models.EditMapImageRequest" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, "/maps/{id}/leaderboards": { "get": { "description": "Get map leaderboards with specified id.", @@ -337,7 +399,19 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Response" + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/models.RecordResponse" + } + } + } + ] } }, "400": { @@ -1040,6 +1114,17 @@ } } }, + "models.EditMapImageRequest": { + "type": "object", + "required": [ + "image" + ], + "properties": { + "image": { + "type": "string" + } + } + }, "models.EditMapSummaryRequest": { "type": "object", "required": [ @@ -1077,6 +1162,9 @@ "id": { "type": "integer" }, + "is_coop": { + "type": "boolean" + }, "name": { "type": "string" } @@ -1105,6 +1193,9 @@ "image": { "type": "string" }, + "is_coop": { + "type": "boolean" + }, "map_name": { "type": "string" } @@ -1235,6 +1326,17 @@ } } }, + "models.RecordResponse": { + "type": "object", + "properties": { + "score_count": { + "type": "integer" + }, + "score_time": { + "type": "integer" + } + } + }, "models.Response": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 2fed413..3b706ea 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -61,6 +61,13 @@ definitions: required: - route_id type: object + models.EditMapImageRequest: + properties: + image: + type: string + required: + - image + type: object models.EditMapSummaryRequest: properties: description: @@ -87,6 +94,8 @@ definitions: properties: id: type: integer + is_coop: + type: boolean name: type: string type: object @@ -105,6 +114,8 @@ definitions: type: integer image: type: string + is_coop: + type: boolean map_name: type: string type: object @@ -189,6 +200,13 @@ definitions: $ref: '#/definitions/models.UserRanking' type: array type: object + models.RecordResponse: + properties: + score_count: + type: integer + score_time: + type: integer + type: object models.Response: properties: data: {} @@ -364,6 +382,44 @@ paths: $ref: '#/definitions/models.Response' tags: - login + /maps/{id}/image: + put: + description: Edit map image with specified map id. + parameters: + - description: JWT Token + in: header + name: Authorization + required: true + type: string + - description: Map ID + in: path + name: id + required: true + type: integer + - description: Body + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.EditMapImageRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/models.Response' + - properties: + data: + $ref: '#/definitions/models.EditMapImageRequest' + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/models.Response' + tags: + - maps /maps/{id}/leaderboards: get: description: Get map leaderboards with specified id. @@ -435,7 +491,12 @@ paths: "200": description: OK schema: - $ref: '#/definitions/models.Response' + allOf: + - $ref: '#/definitions/models.Response' + - properties: + data: + $ref: '#/definitions/models.RecordResponse' + type: object "400": description: Bad Request schema: -- cgit v1.2.3