From 9fade13368c732401030d392ef2332279716243e Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Wed, 19 Apr 2023 14:14:11 +0300 Subject: doc: complete rest of swagger implementation, change rankings response (#34) --- backend/controllers/homeController.go | 18 ++- backend/controllers/loginController.go | 2 - backend/controllers/mapController.go | 9 ++ backend/controllers/recordController.go | 23 ++++ docs/docs.go | 207 ++++++++++++++++++++++++++++++++ docs/swagger.json | 207 ++++++++++++++++++++++++++++++++ docs/swagger.yaml | 132 ++++++++++++++++++++ 7 files changed, 593 insertions(+), 5 deletions(-) diff --git a/backend/controllers/homeController.go b/backend/controllers/homeController.go index 8b52ff3..12949a4 100644 --- a/backend/controllers/homeController.go +++ b/backend/controllers/homeController.go @@ -19,6 +19,14 @@ func Home(c *gin.Context) { } } +// GET Rankings +// +// @Summary Get rankings of every player. +// @Accept json +// @Produce json +// @Success 200 {object} models.Response{data=models.RankingsResponse} +// @Failure 400 {object} models.Response +// @Router /demo [get] func Rankings(c *gin.Context) { rows, err := database.DB.Query(`SELECT steam_id, username FROM users;`) if err != nil { @@ -103,8 +111,12 @@ func Rankings(c *gin.Context) { mpRankings = append(mpRankings, ranking) } } - c.JSON(http.StatusOK, models.RankingsResponse{ - RankingsSP: spRankings, - RankingsMP: mpRankings, + c.JSON(http.StatusOK, models.Response{ + Success: true, + Message: "Successfully retrieved rankings.", + Data: models.RankingsResponse{ + RankingsSP: spRankings, + RankingsMP: mpRankings, + }, }) } diff --git a/backend/controllers/loginController.go b/backend/controllers/loginController.go index 6feda8a..84ef22f 100644 --- a/backend/controllers/loginController.go +++ b/backend/controllers/loginController.go @@ -40,7 +40,6 @@ func Login(c *gin.Context) { var checkSteamID int64 err = database.DB.QueryRow("SELECT steam_id FROM users WHERE steam_id = $1", steamID).Scan(&checkSteamID) // if err != nil { - // fmt.Println("y1") // c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) // return // } @@ -48,7 +47,6 @@ func Login(c *gin.Context) { if checkSteamID == 0 { user, err := GetPlayerSummaries(steamID, os.Getenv("API_KEY")) if err != nil { - fmt.Println("y2") c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } diff --git a/backend/controllers/mapController.go b/backend/controllers/mapController.go index 4c57971..1560441 100644 --- a/backend/controllers/mapController.go +++ b/backend/controllers/mapController.go @@ -9,6 +9,15 @@ import ( "github.com/pektezol/leastportals/backend/models" ) +// GET Map +// +// @Summary Get map page with specified id. +// @Accept json +// @Produce json +// @Param id path int true "Map ID" +// @Success 200 {object} models.Response{data=models.Map} +// @Failure 400 {object} models.Response +// @Router /maps/{id} [get] func FetchMap(c *gin.Context) { id := c.Param("id") // Get map data diff --git a/backend/controllers/recordController.go b/backend/controllers/recordController.go index 1cfaa56..27f39fc 100644 --- a/backend/controllers/recordController.go +++ b/backend/controllers/recordController.go @@ -18,6 +18,20 @@ import ( "google.golang.org/api/drive/v3" ) +// POST Record +// +// @Summary Post record with demo of a specific map. +// @Accept mpfd +// @Produce json +// @Param demos formData []file true "Demos" +// @Param score_count formData int true "Score Count" +// @Param score_time formData int true "Score Time" +// @Param is_partner_orange formData boolean true "Is Partner Orange" +// @Param partner_id formData string true "Partner ID" +// @Success 200 {object} models.Response{data=models.RecordRequest} +// @Failure 400 {object} models.Response +// @Failure 401 {object} models.Response +// @Router /maps/{id}/record [post] func CreateRecordWithDemo(c *gin.Context) { mapId := c.Param("id") // Check if user exists @@ -176,6 +190,15 @@ func CreateRecordWithDemo(c *gin.Context) { return } +// GET Demo +// +// @Summary Get demo with specified demo uuid. +// @Accept json +// @Produce octet-stream +// @Param uuid path int true "Demo UUID" +// @Success 200 {file} binary "Demo File" +// @Failure 400 {object} models.Response +// @Router /demo [get] func DownloadDemoWithID(c *gin.Context) { uuid := c.Query("uuid") var locationID string diff --git a/docs/docs.go b/docs/docs.go index caa64bf..40bae17 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -20,6 +20,40 @@ const docTemplate = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { + "/demo": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/octet-stream" + ], + "summary": "Get demo with specified demo uuid.", + "parameters": [ + { + "type": "integer", + "description": "Demo UUID", + "name": "uuid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Demo File", + "schema": { + "type": "file" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, "/login": { "get": { "consumes": [ @@ -57,6 +91,135 @@ const docTemplate = `{ } } }, + "/maps/{id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get map page with specified id.", + "parameters": [ + { + "type": "integer", + "description": "Map ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/models.Map" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, + "/maps/{id}/record": { + "post": { + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "summary": "Post record with demo of a specific map.", + "parameters": [ + { + "type": "array", + "items": { + "type": "file" + }, + "description": "Demos", + "name": "demos", + "in": "formData", + "required": true + }, + { + "type": "integer", + "description": "Score Count", + "name": "score_count", + "in": "formData", + "required": true + }, + { + "type": "integer", + "description": "Score Time", + "name": "score_time", + "in": "formData", + "required": true + }, + { + "type": "boolean", + "description": "Is Partner Orange", + "name": "is_partner_orange", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Partner ID", + "name": "partner_id", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/models.RecordRequest" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, "/profile": { "get": { "consumes": [ @@ -253,6 +416,27 @@ const docTemplate = `{ } } }, + "models.Map": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "is_coop": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "records": {}, + "wr_score": { + "type": "integer" + }, + "wr_time": { + "type": "integer" + } + } + }, "models.ProfileResponse": { "type": "object", "properties": { @@ -285,6 +469,29 @@ const docTemplate = `{ } } }, + "models.RecordRequest": { + "type": "object", + "required": [ + "is_partner_orange", + "partner_id", + "score_count", + "score_time" + ], + "properties": { + "is_partner_orange": { + "type": "boolean" + }, + "partner_id": { + "type": "string" + }, + "score_count": { + "type": "integer" + }, + "score_time": { + "type": "integer" + } + } + }, "models.Response": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index 3d038cb..03a2592 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -13,6 +13,40 @@ "host": "localhost:4000/api", "basePath": "/v1", "paths": { + "/demo": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/octet-stream" + ], + "summary": "Get demo with specified demo uuid.", + "parameters": [ + { + "type": "integer", + "description": "Demo UUID", + "name": "uuid", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Demo File", + "schema": { + "type": "file" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, "/login": { "get": { "consumes": [ @@ -50,6 +84,135 @@ } } }, + "/maps/{id}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "summary": "Get map page with specified id.", + "parameters": [ + { + "type": "integer", + "description": "Map ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/models.Map" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, + "/maps/{id}/record": { + "post": { + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "summary": "Post record with demo of a specific map.", + "parameters": [ + { + "type": "array", + "items": { + "type": "file" + }, + "description": "Demos", + "name": "demos", + "in": "formData", + "required": true + }, + { + "type": "integer", + "description": "Score Count", + "name": "score_count", + "in": "formData", + "required": true + }, + { + "type": "integer", + "description": "Score Time", + "name": "score_time", + "in": "formData", + "required": true + }, + { + "type": "boolean", + "description": "Is Partner Orange", + "name": "is_partner_orange", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Partner ID", + "name": "partner_id", + "in": "formData", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/models.RecordRequest" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, "/profile": { "get": { "consumes": [ @@ -246,6 +409,27 @@ } } }, + "models.Map": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "is_coop": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "records": {}, + "wr_score": { + "type": "integer" + }, + "wr_time": { + "type": "integer" + } + } + }, "models.ProfileResponse": { "type": "object", "properties": { @@ -278,6 +462,29 @@ } } }, + "models.RecordRequest": { + "type": "object", + "required": [ + "is_partner_orange", + "partner_id", + "score_count", + "score_time" + ], + "properties": { + "is_partner_orange": { + "type": "boolean" + }, + "partner_id": { + "type": "string" + }, + "score_count": { + "type": "integer" + }, + "score_time": { + "type": "integer" + } + } + }, "models.Response": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 81d4073..5300e1f 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -5,6 +5,20 @@ definitions: token: type: string type: object + models.Map: + properties: + id: + type: integer + is_coop: + type: boolean + name: + type: string + records: {} + wr_score: + type: integer + wr_time: + type: integer + type: object models.ProfileResponse: properties: avatar_link: @@ -26,6 +40,22 @@ definitions: username: type: string type: object + models.RecordRequest: + properties: + is_partner_orange: + type: boolean + partner_id: + type: string + score_count: + type: integer + score_time: + type: integer + required: + - is_partner_orange + - partner_id + - score_count + - score_time + type: object models.Response: properties: data: {} @@ -50,6 +80,28 @@ info: title: Least Portals Database API version: "1.0" paths: + /demo: + get: + consumes: + - application/json + parameters: + - description: Demo UUID + in: path + name: uuid + required: true + type: integer + produces: + - application/octet-stream + responses: + "200": + description: Demo File + schema: + type: file + "400": + description: Bad Request + schema: + $ref: '#/definitions/models.Response' + summary: Get demo with specified demo uuid. /login: get: consumes: @@ -71,6 +123,86 @@ paths: schema: $ref: '#/definitions/models.Response' summary: Get (redirect) login page for Steam auth. + /maps/{id}: + get: + consumes: + - application/json + parameters: + - description: Map ID + in: path + name: id + required: true + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/models.Response' + - properties: + data: + $ref: '#/definitions/models.Map' + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/models.Response' + summary: Get map page with specified id. + /maps/{id}/record: + post: + consumes: + - multipart/form-data + parameters: + - description: Demos + in: formData + items: + type: file + name: demos + required: true + type: array + - description: Score Count + in: formData + name: score_count + required: true + type: integer + - description: Score Time + in: formData + name: score_time + required: true + type: integer + - description: Is Partner Orange + in: formData + name: is_partner_orange + required: true + type: boolean + - description: Partner ID + in: formData + name: partner_id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/models.Response' + - properties: + data: + $ref: '#/definitions/models.RecordRequest' + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/models.Response' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/models.Response' + summary: Post record with demo of a specific map. /profile: get: consumes: -- cgit v1.2.3