aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/controllers/recordController.go87
-rw-r--r--backend/models/requests.go4
-rw-r--r--backend/parser/parser.go7
-rw-r--r--docs/docs.go118
-rw-r--r--docs/swagger.json112
-rw-r--r--docs/swagger.yaml78
6 files changed, 269 insertions, 137 deletions
diff --git a/backend/controllers/recordController.go b/backend/controllers/recordController.go
index 627be57..aec31bb 100644
--- a/backend/controllers/recordController.go
+++ b/backend/controllers/recordController.go
@@ -5,14 +5,15 @@ import (
5 b64 "encoding/base64" 5 b64 "encoding/base64"
6 "io" 6 "io"
7 "log" 7 "log"
8 "mime/multipart"
8 "net/http" 9 "net/http"
9 "os" 10 "os"
10 "strconv"
11 11
12 "github.com/gin-gonic/gin" 12 "github.com/gin-gonic/gin"
13 "github.com/google/uuid" 13 "github.com/google/uuid"
14 "github.com/pektezol/leastportals/backend/database" 14 "github.com/pektezol/leastportals/backend/database"
15 "github.com/pektezol/leastportals/backend/models" 15 "github.com/pektezol/leastportals/backend/models"
16 "github.com/pektezol/leastportals/backend/parser"
16 "golang.org/x/oauth2/google" 17 "golang.org/x/oauth2/google"
17 "golang.org/x/oauth2/jwt" 18 "golang.org/x/oauth2/jwt"
18 "google.golang.org/api/drive/v3" 19 "google.golang.org/api/drive/v3"
@@ -25,9 +26,8 @@ import (
25// @Accept mpfd 26// @Accept mpfd
26// @Produce json 27// @Produce json
27// @Param Authorization header string true "JWT Token" 28// @Param Authorization header string true "JWT Token"
28// @Param demos formData []file true "Demos" 29// @Param host_demo formData file true "Host Demo"
29// @Param score_count formData int true "Score Count" 30// @Param partner_demo formData file true "Partner Demo"
30// @Param score_time formData int true "Score Time"
31// @Param is_partner_orange formData boolean true "Is Partner Orange" 31// @Param is_partner_orange formData boolean true "Is Partner Orange"
32// @Param partner_id formData string true "Partner ID" 32// @Param partner_id formData string true "Partner ID"
33// @Success 200 {object} models.Response{data=models.RecordRequest} 33// @Success 200 {object} models.Response{data=models.RecordRequest}
@@ -43,11 +43,11 @@ func CreateRecordWithDemo(c *gin.Context) {
43 return 43 return
44 } 44 }
45 // Check if map is sp or mp 45 // Check if map is sp or mp
46 var gameID int 46 var gameName string
47 var isCoop bool 47 var isCoop bool
48 var isDisabled bool 48 var isDisabled bool
49 sql := `SELECT game_id, is_disabled FROM maps WHERE id = $1` 49 sql := `SELECT g.name, m.is_disabled FROM maps m INNER JOIN games g ON m.game_id=g.id WHERE id = $1`
50 err := database.DB.QueryRow(sql, mapId).Scan(&gameID, &isDisabled) 50 err := database.DB.QueryRow(sql, mapId).Scan(&gameName, &isDisabled)
51 if err != nil { 51 if err != nil {
52 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 52 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
53 return 53 return
@@ -56,51 +56,23 @@ func CreateRecordWithDemo(c *gin.Context) {
56 c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards.")) 56 c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards."))
57 return 57 return
58 } 58 }
59 if gameID == 2 { 59 if gameName == "Portal 2 - Cooperative" {
60 isCoop = true 60 isCoop = true
61 } 61 }
62 // Get record request 62 // Get record request
63 var record models.RecordRequest 63 var record models.RecordRequest
64 score_count, err := strconv.Atoi(c.PostForm("score_count")) 64 if err := c.ShouldBind(&record); err != nil {
65 if err != nil {
66 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
67 return
68 }
69 score_time, err := strconv.Atoi(c.PostForm("score_time"))
70 if err != nil {
71 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
72 return
73 }
74 is_partner_orange, err := strconv.ParseBool(c.PostForm("is_partner_orange"))
75 if err != nil {
76 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
77 return
78 }
79 record.ScoreCount = score_count
80 record.ScoreTime = score_time
81 record.PartnerID = c.PostForm("partner_id")
82 record.IsPartnerOrange = is_partner_orange
83 if record.PartnerID == "" {
84 c.JSON(http.StatusBadRequest, models.ErrorResponse("No partner id given."))
85 return
86 }
87 // Multipart form
88 form, err := c.MultipartForm()
89 if err != nil {
90 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 65 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
91 return 66 return
92 } 67 }
93 files := form.File["demos"] 68 if isCoop && (record.PartnerDemo == nil || record.PartnerID == "") {
94 if len(files) != 2 && isCoop { 69 c.JSON(http.StatusBadRequest, models.ErrorResponse("Invalid entry for coop record submission."))
95 c.JSON(http.StatusBadRequest, models.ErrorResponse("Not enough demos for coop submission."))
96 return
97 }
98 if len(files) != 1 && !isCoop {
99 c.JSON(http.StatusBadRequest, models.ErrorResponse("Too many demos for singleplayer submission."))
100 return 70 return
101 } 71 }
102 var hostDemoUUID string 72 // Demo files
103 var partnerDemoUUID string 73 demoFiles := []*multipart.FileHeader{record.HostDemo, record.PartnerDemo}
74 var hostDemoUUID, hostDemoFileID, partnerDemoUUID, partnerDemoFileID string
75 var hostDemoScoreCount, hostDemoScoreTime int
104 client := serviceAccount() 76 client := serviceAccount()
105 srv, err := drive.New(client) 77 srv, err := drive.New(client)
106 if err != nil { 78 if err != nil {
@@ -115,16 +87,15 @@ func CreateRecordWithDemo(c *gin.Context) {
115 } 87 }
116 // Defer to a rollback in case anything fails 88 // Defer to a rollback in case anything fails
117 defer tx.Rollback() 89 defer tx.Rollback()
118 fileID := "" 90 for i, header := range demoFiles {
119 for i, header := range files {
120 uuid := uuid.New().String() 91 uuid := uuid.New().String()
121 // Upload & insert into demos 92 // Upload & insert into demos
122 err = c.SaveUploadedFile(header, "docs/"+header.Filename) 93 err = c.SaveUploadedFile(header, "parser/demos/"+header.Filename)
123 if err != nil { 94 if err != nil {
124 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 95 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
125 return 96 return
126 } 97 }
127 f, err := os.Open("docs/" + header.Filename) 98 f, err := os.Open("parser/demos/" + header.Filename)
128 if err != nil { 99 if err != nil {
129 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 100 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
130 return 101 return
@@ -135,11 +106,16 @@ func CreateRecordWithDemo(c *gin.Context) {
135 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 106 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
136 return 107 return
137 } 108 }
138 fileID = file.Id 109 hostDemoScoreCount, hostDemoScoreTime, err = parser.ProcessDemo(record.HostDemo)
110 if err != nil {
111 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
112 return
113 }
139 if i == 0 { 114 if i == 0 {
115 hostDemoFileID = file.Id
140 hostDemoUUID = uuid 116 hostDemoUUID = uuid
141 } 117 } else if i == 1 {
142 if i == 1 { 118 partnerDemoFileID = file.Id
143 partnerDemoUUID = uuid 119 partnerDemoUUID = uuid
144 } 120 }
145 _, err = tx.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id) 121 _, err = tx.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id)
@@ -148,7 +124,7 @@ func CreateRecordWithDemo(c *gin.Context) {
148 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 124 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
149 return 125 return
150 } 126 }
151 os.Remove("docs/" + header.Filename) 127 os.Remove("parser/demos/" + header.Filename)
152 } 128 }
153 // Insert into records 129 // Insert into records
154 if isCoop { 130 if isCoop {
@@ -163,9 +139,10 @@ func CreateRecordWithDemo(c *gin.Context) {
163 partnerID = user.(models.User).SteamID 139 partnerID = user.(models.User).SteamID
164 hostID = record.PartnerID 140 hostID = record.PartnerID
165 } 141 }
166 _, err := tx.Exec(sql, mapId, record.ScoreCount, record.ScoreTime, hostID, partnerID, hostDemoUUID, partnerDemoUUID) 142 _, err := tx.Exec(sql, mapId, hostDemoScoreCount, hostDemoScoreTime, hostID, partnerID, hostDemoUUID, partnerDemoUUID)
167 if err != nil { 143 if err != nil {
168 deleteFile(srv, fileID) 144 deleteFile(srv, hostDemoFileID)
145 deleteFile(srv, partnerDemoFileID)
169 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 146 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
170 return 147 return
171 } 148 }
@@ -180,9 +157,9 @@ func CreateRecordWithDemo(c *gin.Context) {
180 } else { 157 } else {
181 sql := `INSERT INTO records_sp(map_id,score_count,score_time,user_id,demo_id) 158 sql := `INSERT INTO records_sp(map_id,score_count,score_time,user_id,demo_id)
182 VALUES($1, $2, $3, $4, $5)` 159 VALUES($1, $2, $3, $4, $5)`
183 _, err := tx.Exec(sql, mapId, record.ScoreCount, record.ScoreTime, user.(models.User).SteamID, hostDemoUUID) 160 _, err := tx.Exec(sql, mapId, hostDemoScoreCount, hostDemoScoreTime, user.(models.User).SteamID, hostDemoUUID)
184 if err != nil { 161 if err != nil {
185 deleteFile(srv, fileID) 162 deleteFile(srv, hostDemoFileID)
186 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 163 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
187 return 164 return
188 } 165 }
diff --git a/backend/models/requests.go b/backend/models/requests.go
index e95eab6..4b4657b 100644
--- a/backend/models/requests.go
+++ b/backend/models/requests.go
@@ -22,8 +22,8 @@ type CreateMapHistoryRequest struct {
22} 22}
23 23
24type RecordRequest struct { 24type RecordRequest struct {
25 HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required"` 25 HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required" swaggerignore:"true"`
26 PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo"` 26 PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo" swaggerignore:"true"`
27 IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange"` 27 IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange"`
28 PartnerID string `json:"partner_id" form:"partner_id"` 28 PartnerID string `json:"partner_id" form:"partner_id"`
29} 29}
diff --git a/backend/parser/parser.go b/backend/parser/parser.go
new file mode 100644
index 0000000..6f9a24f
--- /dev/null
+++ b/backend/parser/parser.go
@@ -0,0 +1,7 @@
1package parser
2
3import "mime/multipart"
4
5func ProcessDemo(demo *multipart.FileHeader) (scoreCount int, scoreTime int, err error) {
6 return 0, 0, nil
7}
diff --git a/docs/docs.go b/docs/docs.go
index a0aad6f..090d3e8 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -1,5 +1,5 @@
1// Package docs GENERATED BY SWAG; DO NOT EDIT 1// Code generated by swaggo/swag. DO NOT EDIT.
2// This file was generated by swaggo/swag 2
3package docs 3package docs
4 4
5import "github.com/swaggo/swag" 5import "github.com/swaggo/swag"
@@ -345,26 +345,16 @@ const docTemplate = `{
345 "required": true 345 "required": true
346 }, 346 },
347 { 347 {
348 "type": "array", 348 "type": "file",
349 "items": { 349 "description": "Host Demo",
350 "type": "file" 350 "name": "host_demo",
351 },
352 "description": "Demos",
353 "name": "demos",
354 "in": "formData", 351 "in": "formData",
355 "required": true 352 "required": true
356 }, 353 },
357 { 354 {
358 "type": "integer", 355 "type": "file",
359 "description": "Score Count", 356 "description": "Partner Demo",
360 "name": "score_count", 357 "name": "partner_demo",
361 "in": "formData",
362 "required": true
363 },
364 {
365 "type": "integer",
366 "description": "Score Time",
367 "name": "score_time",
368 "in": "formData", 358 "in": "formData",
369 "required": true 359 "required": true
370 }, 360 },
@@ -461,6 +451,50 @@ const docTemplate = `{
461 } 451 }
462 } 452 }
463 } 453 }
454 },
455 "put": {
456 "produces": [
457 "application/json"
458 ],
459 "tags": [
460 "maps"
461 ],
462 "summary": "Edit map summary with specified map id.",
463 "parameters": [
464 {
465 "type": "integer",
466 "description": "Map ID",
467 "name": "id",
468 "in": "path",
469 "required": true
470 }
471 ],
472 "responses": {
473 "200": {
474 "description": "OK",
475 "schema": {
476 "allOf": [
477 {
478 "$ref": "#/definitions/models.Response"
479 },
480 {
481 "type": "object",
482 "properties": {
483 "data": {
484 "$ref": "#/definitions/models.EditMapSummaryRequest"
485 }
486 }
487 }
488 ]
489 }
490 },
491 "400": {
492 "description": "Bad Request",
493 "schema": {
494 "$ref": "#/definitions/models.Response"
495 }
496 }
497 }
464 } 498 }
465 }, 499 },
466 "/profile": { 500 "/profile": {
@@ -843,6 +877,37 @@ const docTemplate = `{
843 } 877 }
844 } 878 }
845 }, 879 },
880 "models.EditMapSummaryRequest": {
881 "type": "object",
882 "required": [
883 "description",
884 "record_date",
885 "route_id",
886 "score_count",
887 "showcase",
888 "user_name"
889 ],
890 "properties": {
891 "description": {
892 "type": "string"
893 },
894 "record_date": {
895 "type": "string"
896 },
897 "route_id": {
898 "type": "integer"
899 },
900 "score_count": {
901 "type": "integer"
902 },
903 "showcase": {
904 "type": "string"
905 },
906 "user_name": {
907 "type": "string"
908 }
909 }
910 },
846 "models.Game": { 911 "models.Game": {
847 "type": "object", 912 "type": "object",
848 "properties": { 913 "properties": {
@@ -874,6 +939,9 @@ const docTemplate = `{
874 "id": { 939 "id": {
875 "type": "integer" 940 "type": "integer"
876 }, 941 },
942 "image": {
943 "type": "string"
944 },
877 "map_name": { 945 "map_name": {
878 "type": "string" 946 "type": "string"
879 } 947 }
@@ -1003,24 +1071,12 @@ const docTemplate = `{
1003 }, 1071 },
1004 "models.RecordRequest": { 1072 "models.RecordRequest": {
1005 "type": "object", 1073 "type": "object",
1006 "required": [
1007 "is_partner_orange",
1008 "partner_id",
1009 "score_count",
1010 "score_time"
1011 ],
1012 "properties": { 1074 "properties": {
1013 "is_partner_orange": { 1075 "is_partner_orange": {
1014 "type": "boolean" 1076 "type": "boolean"
1015 }, 1077 },
1016 "partner_id": { 1078 "partner_id": {
1017 "type": "string" 1079 "type": "string"
1018 },
1019 "score_count": {
1020 "type": "integer"
1021 },
1022 "score_time": {
1023 "type": "integer"
1024 } 1080 }
1025 } 1081 }
1026 }, 1082 },
@@ -1100,6 +1156,8 @@ var SwaggerInfo = &swag.Spec{
1100 Description: "Backend API endpoints for the Least Portals Database.", 1156 Description: "Backend API endpoints for the Least Portals Database.",
1101 InfoInstanceName: "swagger", 1157 InfoInstanceName: "swagger",
1102 SwaggerTemplate: docTemplate, 1158 SwaggerTemplate: docTemplate,
1159 LeftDelim: "{{",
1160 RightDelim: "}}",
1103} 1161}
1104 1162
1105func init() { 1163func init() {
diff --git a/docs/swagger.json b/docs/swagger.json
index 2279ff6..62079b1 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -338,26 +338,16 @@
338 "required": true 338 "required": true
339 }, 339 },
340 { 340 {
341 "type": "array", 341 "type": "file",
342 "items": { 342 "description": "Host Demo",
343 "type": "file" 343 "name": "host_demo",
344 },
345 "description": "Demos",
346 "name": "demos",
347 "in": "formData", 344 "in": "formData",
348 "required": true 345 "required": true
349 }, 346 },
350 { 347 {
351 "type": "integer", 348 "type": "file",
352 "description": "Score Count", 349 "description": "Partner Demo",
353 "name": "score_count", 350 "name": "partner_demo",
354 "in": "formData",
355 "required": true
356 },
357 {
358 "type": "integer",
359 "description": "Score Time",
360 "name": "score_time",
361 "in": "formData", 351 "in": "formData",
362 "required": true 352 "required": true
363 }, 353 },
@@ -454,6 +444,50 @@
454 } 444 }
455 } 445 }
456 } 446 }
447 },
448 "put": {
449 "produces": [
450 "application/json"
451 ],
452 "tags": [
453 "maps"
454 ],
455 "summary": "Edit map summary with specified map id.",
456 "parameters": [
457 {
458 "type": "integer",
459 "description": "Map ID",
460 "name": "id",
461 "in": "path",
462 "required": true
463 }
464 ],
465 "responses": {
466 "200": {
467 "description": "OK",
468 "schema": {
469 "allOf": [
470 {
471 "$ref": "#/definitions/models.Response"
472 },
473 {
474 "type": "object",
475 "properties": {
476 "data": {
477 "$ref": "#/definitions/models.EditMapSummaryRequest"
478 }
479 }
480 }
481 ]
482 }
483 },
484 "400": {
485 "description": "Bad Request",
486 "schema": {
487 "$ref": "#/definitions/models.Response"
488 }
489 }
490 }
457 } 491 }
458 }, 492 },
459 "/profile": { 493 "/profile": {
@@ -836,6 +870,37 @@
836 } 870 }
837 } 871 }
838 }, 872 },
873 "models.EditMapSummaryRequest": {
874 "type": "object",
875 "required": [
876 "description",
877 "record_date",
878 "route_id",
879 "score_count",
880 "showcase",
881 "user_name"
882 ],
883 "properties": {
884 "description": {
885 "type": "string"
886 },
887 "record_date": {
888 "type": "string"
889 },
890 "route_id": {
891 "type": "integer"
892 },
893 "score_count": {
894 "type": "integer"
895 },
896 "showcase": {
897 "type": "string"
898 },
899 "user_name": {
900 "type": "string"
901 }
902 }
903 },
839 "models.Game": { 904 "models.Game": {
840 "type": "object", 905 "type": "object",
841 "properties": { 906 "properties": {
@@ -867,6 +932,9 @@
867 "id": { 932 "id": {
868 "type": "integer" 933 "type": "integer"
869 }, 934 },
935 "image": {
936 "type": "string"
937 },
870 "map_name": { 938 "map_name": {
871 "type": "string" 939 "type": "string"
872 } 940 }
@@ -996,24 +1064,12 @@
996 }, 1064 },
997 "models.RecordRequest": { 1065 "models.RecordRequest": {
998 "type": "object", 1066 "type": "object",
999 "required": [
1000 "is_partner_orange",
1001 "partner_id",
1002 "score_count",
1003 "score_time"
1004 ],
1005 "properties": { 1067 "properties": {
1006 "is_partner_orange": { 1068 "is_partner_orange": {
1007 "type": "boolean" 1069 "type": "boolean"
1008 }, 1070 },
1009 "partner_id": { 1071 "partner_id": {
1010 "type": "string" 1072 "type": "string"
1011 },
1012 "score_count": {
1013 "type": "integer"
1014 },
1015 "score_time": {
1016 "type": "integer"
1017 } 1073 }
1018 } 1074 }
1019 }, 1075 },
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index ba4775a..9d58620 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -32,6 +32,28 @@ definitions:
32 game: 32 game:
33 $ref: '#/definitions/models.Game' 33 $ref: '#/definitions/models.Game'
34 type: object 34 type: object
35 models.EditMapSummaryRequest:
36 properties:
37 description:
38 type: string
39 record_date:
40 type: string
41 route_id:
42 type: integer
43 score_count:
44 type: integer
45 showcase:
46 type: string
47 user_name:
48 type: string
49 required:
50 - description
51 - record_date
52 - route_id
53 - score_count
54 - showcase
55 - user_name
56 type: object
35 models.Game: 57 models.Game:
36 properties: 58 properties:
37 id: 59 id:
@@ -52,6 +74,8 @@ definitions:
52 type: string 74 type: string
53 id: 75 id:
54 type: integer 76 type: integer
77 image:
78 type: string
55 map_name: 79 map_name:
56 type: string 80 type: string
57 type: object 81 type: object
@@ -140,15 +164,6 @@ definitions:
140 type: boolean 164 type: boolean
141 partner_id: 165 partner_id:
142 type: string 166 type: string
143 score_count:
144 type: integer
145 score_time:
146 type: integer
147 required:
148 - is_partner_orange
149 - partner_id
150 - score_count
151 - score_time
152 type: object 167 type: object
153 models.Response: 168 models.Response:
154 properties: 169 properties:
@@ -388,23 +403,16 @@ paths:
388 name: Authorization 403 name: Authorization
389 required: true 404 required: true
390 type: string 405 type: string
391 - description: Demos 406 - description: Host Demo
392 in: formData
393 items:
394 type: file
395 name: demos
396 required: true
397 type: array
398 - description: Score Count
399 in: formData 407 in: formData
400 name: score_count 408 name: host_demo
401 required: true 409 required: true
402 type: integer 410 type: file
403 - description: Score Time 411 - description: Partner Demo
404 in: formData 412 in: formData
405 name: score_time 413 name: partner_demo
406 required: true 414 required: true
407 type: integer 415 type: file
408 - description: Is Partner Orange 416 - description: Is Partner Orange
409 in: formData 417 in: formData
410 name: is_partner_orange 418 name: is_partner_orange
@@ -465,6 +473,32 @@ paths:
465 summary: Get map summary with specified id. 473 summary: Get map summary with specified id.
466 tags: 474 tags:
467 - maps 475 - maps
476 put:
477 parameters:
478 - description: Map ID
479 in: path
480 name: id
481 required: true
482 type: integer
483 produces:
484 - application/json
485 responses:
486 "200":
487 description: OK
488 schema:
489 allOf:
490 - $ref: '#/definitions/models.Response'
491 - properties:
492 data:
493 $ref: '#/definitions/models.EditMapSummaryRequest'
494 type: object
495 "400":
496 description: Bad Request
497 schema:
498 $ref: '#/definitions/models.Response'
499 summary: Edit map summary with specified map id.
500 tags:
501 - maps
468 /profile: 502 /profile:
469 get: 503 get:
470 consumes: 504 consumes: