diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-05-02 23:36:21 +0300 |
|---|---|---|
| committer | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-05-02 23:36:21 +0300 |
| commit | 4b87005639dabaf84f50084df7a02812676a733c (patch) | |
| tree | c9f5a918c7f32bda86441dffd6e714013fa7c35a | |
| parent | feat: game, chapter, map endpoints for records page (diff) | |
| download | lphub-4b87005639dabaf84f50084df7a02812676a733c.tar.gz lphub-4b87005639dabaf84f50084df7a02812676a733c.tar.bz2 lphub-4b87005639dabaf84f50084df7a02812676a733c.zip | |
feat: add path request to the response with names
| -rw-r--r-- | backend/controllers/mapController.go | 26 | ||||
| -rw-r--r-- | backend/models/models.go | 20 | ||||
| -rw-r--r-- | docs/docs.go | 25 | ||||
| -rw-r--r-- | docs/swagger.json | 25 | ||||
| -rw-r--r-- | docs/swagger.yaml | 17 |
5 files changed, 71 insertions, 42 deletions
diff --git a/backend/controllers/mapController.go b/backend/controllers/mapController.go index 2bf1fdc..506daa2 100644 --- a/backend/controllers/mapController.go +++ b/backend/controllers/mapController.go | |||
| @@ -250,7 +250,7 @@ func FetchGames(c *gin.Context) { | |||
| 250 | // @Tags chapters | 250 | // @Tags chapters |
| 251 | // @Produce json | 251 | // @Produce json |
| 252 | // @Param id path int true "Game ID" | 252 | // @Param id path int true "Game ID" |
| 253 | // @Success 200 {object} models.Response{data=[]models.Chapter} | 253 | // @Success 200 {object} models.Response{data=models.ChaptersResponse} |
| 254 | // @Failure 400 {object} models.Response | 254 | // @Failure 400 {object} models.Response |
| 255 | // @Router /chapters/{id} [get] | 255 | // @Router /chapters/{id} [get] |
| 256 | func FetchChapters(c *gin.Context) { | 256 | func FetchChapters(c *gin.Context) { |
| @@ -260,25 +260,29 @@ func FetchChapters(c *gin.Context) { | |||
| 260 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 260 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 261 | return | 261 | return |
| 262 | } | 262 | } |
| 263 | rows, err := database.DB.Query(`SELECT id, name FROM chapters WHERE game_id = $1`, gameID) | 263 | var response models.ChaptersResponse |
| 264 | 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) | ||
| 264 | if err != nil { | 265 | if err != nil { |
| 265 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 266 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 266 | return | 267 | return |
| 267 | } | 268 | } |
| 268 | var chapters []models.Chapter | 269 | var chapters []models.Chapter |
| 270 | var gameName string | ||
| 269 | for rows.Next() { | 271 | for rows.Next() { |
| 270 | var chapter models.Chapter | 272 | var chapter models.Chapter |
| 271 | if err := rows.Scan(&chapter.ID, &chapter.Name); err != nil { | 273 | if err := rows.Scan(&chapter.ID, &chapter.Name, &gameName); err != nil { |
| 272 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 274 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 273 | return | 275 | return |
| 274 | } | 276 | } |
| 275 | chapter.GameID = intID | ||
| 276 | chapters = append(chapters, chapter) | 277 | chapters = append(chapters, chapter) |
| 277 | } | 278 | } |
| 279 | response.Game.ID = intID | ||
| 280 | response.Game.Name = gameName | ||
| 281 | response.Chapters = chapters | ||
| 278 | c.JSON(http.StatusOK, models.Response{ | 282 | c.JSON(http.StatusOK, models.Response{ |
| 279 | Success: true, | 283 | Success: true, |
| 280 | Message: "Successfully retrieved chapters.", | 284 | Message: "Successfully retrieved chapters.", |
| 281 | Data: chapters, | 285 | Data: response, |
| 282 | }) | 286 | }) |
| 283 | } | 287 | } |
| 284 | 288 | ||
| @@ -298,24 +302,28 @@ func FetchChapterMaps(c *gin.Context) { | |||
| 298 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 302 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 299 | return | 303 | return |
| 300 | } | 304 | } |
| 301 | rows, err := database.DB.Query(`SELECT id, name FROM maps WHERE chapter_id = $1`, chapterID) | 305 | var response models.ChapterMapsResponse |
| 306 | 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) | ||
| 302 | if err != nil { | 307 | if err != nil { |
| 303 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 308 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 304 | return | 309 | return |
| 305 | } | 310 | } |
| 306 | var maps []models.MapShort | 311 | var maps []models.MapShort |
| 312 | var chapterName string | ||
| 307 | for rows.Next() { | 313 | for rows.Next() { |
| 308 | var mapShort models.MapShort | 314 | var mapShort models.MapShort |
| 309 | if err := rows.Scan(&mapShort.ID, &mapShort.Name); err != nil { | 315 | if err := rows.Scan(&mapShort.ID, &mapShort.Name, &chapterName); err != nil { |
| 310 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 316 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 311 | return | 317 | return |
| 312 | } | 318 | } |
| 313 | mapShort.ChapterID = intID | ||
| 314 | maps = append(maps, mapShort) | 319 | maps = append(maps, mapShort) |
| 315 | } | 320 | } |
| 321 | response.Chapter.ID = intID | ||
| 322 | response.Chapter.Name = chapterName | ||
| 323 | response.Maps = maps | ||
| 316 | c.JSON(http.StatusOK, models.Response{ | 324 | c.JSON(http.StatusOK, models.Response{ |
| 317 | Success: true, | 325 | Success: true, |
| 318 | Message: "Successfully retrieved maps.", | 326 | Message: "Successfully retrieved maps.", |
| 319 | Data: maps, | 327 | Data: response, |
| 320 | }) | 328 | }) |
| 321 | } | 329 | } |
diff --git a/backend/models/models.go b/backend/models/models.go index 8f77a93..6f5173a 100644 --- a/backend/models/models.go +++ b/backend/models/models.go | |||
| @@ -158,16 +158,24 @@ type Game struct { | |||
| 158 | Name string `json:"name"` | 158 | Name string `json:"name"` |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | type ChaptersResponse struct { | ||
| 162 | Game Game `json:"game"` | ||
| 163 | Chapters []Chapter `json:"chapters"` | ||
| 164 | } | ||
| 165 | |||
| 161 | type Chapter struct { | 166 | type Chapter struct { |
| 162 | ID int `json:"id"` | 167 | ID int `json:"id"` |
| 163 | GameID int `json:"game_id"` | 168 | Name string `json:"name"` |
| 164 | Name string `json:"name"` | ||
| 165 | } | 169 | } |
| 166 | 170 | ||
| 167 | type MapShort struct { | 171 | type MapShort struct { |
| 168 | ID int `json:"id"` | 172 | ID int `json:"id"` |
| 169 | ChapterID int `json:"chapter_id"` | 173 | Name string `json:"name"` |
| 170 | Name string `json:"name"` | 174 | } |
| 175 | |||
| 176 | type ChapterMapsResponse struct { | ||
| 177 | Chapter Chapter `json:"chapter"` | ||
| 178 | Maps []MapShort `json:"maps"` | ||
| 171 | } | 179 | } |
| 172 | 180 | ||
| 173 | func ErrorResponse(message string) Response { | 181 | func ErrorResponse(message string) Response { |
diff --git a/docs/docs.go b/docs/docs.go index 788ca3d..164db20 100644 --- a/docs/docs.go +++ b/docs/docs.go | |||
| @@ -50,10 +50,7 @@ const docTemplate = `{ | |||
| 50 | "type": "object", | 50 | "type": "object", |
| 51 | "properties": { | 51 | "properties": { |
| 52 | "data": { | 52 | "data": { |
| 53 | "type": "array", | 53 | "$ref": "#/definitions/models.ChaptersResponse" |
| 54 | "items": { | ||
| 55 | "$ref": "#/definitions/models.Chapter" | ||
| 56 | } | ||
| 57 | } | 54 | } |
| 58 | } | 55 | } |
| 59 | } | 56 | } |
| @@ -746,9 +743,6 @@ const docTemplate = `{ | |||
| 746 | "models.Chapter": { | 743 | "models.Chapter": { |
| 747 | "type": "object", | 744 | "type": "object", |
| 748 | "properties": { | 745 | "properties": { |
| 749 | "game_id": { | ||
| 750 | "type": "integer" | ||
| 751 | }, | ||
| 752 | "id": { | 746 | "id": { |
| 753 | "type": "integer" | 747 | "type": "integer" |
| 754 | }, | 748 | }, |
| @@ -757,6 +751,20 @@ const docTemplate = `{ | |||
| 757 | } | 751 | } |
| 758 | } | 752 | } |
| 759 | }, | 753 | }, |
| 754 | "models.ChaptersResponse": { | ||
| 755 | "type": "object", | ||
| 756 | "properties": { | ||
| 757 | "chapters": { | ||
| 758 | "type": "array", | ||
| 759 | "items": { | ||
| 760 | "$ref": "#/definitions/models.Chapter" | ||
| 761 | } | ||
| 762 | }, | ||
| 763 | "game": { | ||
| 764 | "$ref": "#/definitions/models.Game" | ||
| 765 | } | ||
| 766 | } | ||
| 767 | }, | ||
| 760 | "models.Game": { | 768 | "models.Game": { |
| 761 | "type": "object", | 769 | "type": "object", |
| 762 | "properties": { | 770 | "properties": { |
| @@ -834,9 +842,6 @@ const docTemplate = `{ | |||
| 834 | "models.MapShort": { | 842 | "models.MapShort": { |
| 835 | "type": "object", | 843 | "type": "object", |
| 836 | "properties": { | 844 | "properties": { |
| 837 | "chapter_id": { | ||
| 838 | "type": "integer" | ||
| 839 | }, | ||
| 840 | "id": { | 845 | "id": { |
| 841 | "type": "integer" | 846 | "type": "integer" |
| 842 | }, | 847 | }, |
diff --git a/docs/swagger.json b/docs/swagger.json index ba0e8a3..653d52f 100644 --- a/docs/swagger.json +++ b/docs/swagger.json | |||
| @@ -43,10 +43,7 @@ | |||
| 43 | "type": "object", | 43 | "type": "object", |
| 44 | "properties": { | 44 | "properties": { |
| 45 | "data": { | 45 | "data": { |
| 46 | "type": "array", | 46 | "$ref": "#/definitions/models.ChaptersResponse" |
| 47 | "items": { | ||
| 48 | "$ref": "#/definitions/models.Chapter" | ||
| 49 | } | ||
| 50 | } | 47 | } |
| 51 | } | 48 | } |
| 52 | } | 49 | } |
| @@ -739,9 +736,6 @@ | |||
| 739 | "models.Chapter": { | 736 | "models.Chapter": { |
| 740 | "type": "object", | 737 | "type": "object", |
| 741 | "properties": { | 738 | "properties": { |
| 742 | "game_id": { | ||
| 743 | "type": "integer" | ||
| 744 | }, | ||
| 745 | "id": { | 739 | "id": { |
| 746 | "type": "integer" | 740 | "type": "integer" |
| 747 | }, | 741 | }, |
| @@ -750,6 +744,20 @@ | |||
| 750 | } | 744 | } |
| 751 | } | 745 | } |
| 752 | }, | 746 | }, |
| 747 | "models.ChaptersResponse": { | ||
| 748 | "type": "object", | ||
| 749 | "properties": { | ||
| 750 | "chapters": { | ||
| 751 | "type": "array", | ||
| 752 | "items": { | ||
| 753 | "$ref": "#/definitions/models.Chapter" | ||
| 754 | } | ||
| 755 | }, | ||
| 756 | "game": { | ||
| 757 | "$ref": "#/definitions/models.Game" | ||
| 758 | } | ||
| 759 | } | ||
| 760 | }, | ||
| 753 | "models.Game": { | 761 | "models.Game": { |
| 754 | "type": "object", | 762 | "type": "object", |
| 755 | "properties": { | 763 | "properties": { |
| @@ -827,9 +835,6 @@ | |||
| 827 | "models.MapShort": { | 835 | "models.MapShort": { |
| 828 | "type": "object", | 836 | "type": "object", |
| 829 | "properties": { | 837 | "properties": { |
| 830 | "chapter_id": { | ||
| 831 | "type": "integer" | ||
| 832 | }, | ||
| 833 | "id": { | 838 | "id": { |
| 834 | "type": "integer" | 839 | "type": "integer" |
| 835 | }, | 840 | }, |
diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 8b66ec8..88f2d7f 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml | |||
| @@ -2,13 +2,20 @@ basePath: /v1 | |||
| 2 | definitions: | 2 | definitions: |
| 3 | models.Chapter: | 3 | models.Chapter: |
| 4 | properties: | 4 | properties: |
| 5 | game_id: | ||
| 6 | type: integer | ||
| 7 | id: | 5 | id: |
| 8 | type: integer | 6 | type: integer |
| 9 | name: | 7 | name: |
| 10 | type: string | 8 | type: string |
| 11 | type: object | 9 | type: object |
| 10 | models.ChaptersResponse: | ||
| 11 | properties: | ||
| 12 | chapters: | ||
| 13 | items: | ||
| 14 | $ref: '#/definitions/models.Chapter' | ||
| 15 | type: array | ||
| 16 | game: | ||
| 17 | $ref: '#/definitions/models.Game' | ||
| 18 | type: object | ||
| 12 | models.Game: | 19 | models.Game: |
| 13 | properties: | 20 | properties: |
| 14 | id: | 21 | id: |
| @@ -59,8 +66,6 @@ definitions: | |||
| 59 | type: object | 66 | type: object |
| 60 | models.MapShort: | 67 | models.MapShort: |
| 61 | properties: | 68 | properties: |
| 62 | chapter_id: | ||
| 63 | type: integer | ||
| 64 | id: | 69 | id: |
| 65 | type: integer | 70 | type: integer |
| 66 | name: | 71 | name: |
| @@ -205,9 +210,7 @@ paths: | |||
| 205 | - $ref: '#/definitions/models.Response' | 210 | - $ref: '#/definitions/models.Response' |
| 206 | - properties: | 211 | - properties: |
| 207 | data: | 212 | data: |
| 208 | items: | 213 | $ref: '#/definitions/models.ChaptersResponse' |
| 209 | $ref: '#/definitions/models.Chapter' | ||
| 210 | type: array | ||
| 211 | type: object | 214 | type: object |
| 212 | "400": | 215 | "400": |
| 213 | description: Bad Request | 216 | description: Bad Request |