aboutsummaryrefslogtreecommitdiff
path: root/backend/controllers/mapController.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/controllers/mapController.go')
-rw-r--r--backend/controllers/mapController.go126
1 files changed, 119 insertions, 7 deletions
diff --git a/backend/controllers/mapController.go b/backend/controllers/mapController.go
index bd85a97..d8783b7 100644
--- a/backend/controllers/mapController.go
+++ b/backend/controllers/mapController.go
@@ -15,7 +15,6 @@ import (
15// 15//
16// @Summary Get map summary with specified id. 16// @Summary Get map summary with specified id.
17// @Tags maps 17// @Tags maps
18// @Accept json
19// @Produce json 18// @Produce json
20// @Param id path int true "Map ID" 19// @Param id path int true "Map ID"
21// @Success 200 {object} models.Response{data=models.Map{data=models.MapSummary}} 20// @Success 200 {object} models.Response{data=models.Map{data=models.MapSummary}}
@@ -57,7 +56,7 @@ func FetchMapSummary(c *gin.Context) {
57 FROM maps m 56 FROM maps m
58 INNER JOIN games g ON m.game_id = g.id 57 INNER JOIN games g ON m.game_id = g.id
59 INNER JOIN chapters c ON m.chapter_id = c.id 58 INNER JOIN chapters c ON m.chapter_id = c.id
60 WHERE m.id = $1;` 59 WHERE m.id = $1`
61 // TODO: CategoryScores 60 // TODO: CategoryScores
62 err = database.DB.QueryRow(sql, id).Scan(&mapData.GameName, &mapData.ChapterName, &mapData.MapName, &mapSummaryData.Description, &mapSummaryData.Showcase, &routers, &mapSummaryData.Rating) 61 err = database.DB.QueryRow(sql, id).Scan(&mapData.GameName, &mapData.ChapterName, &mapData.MapName, &mapSummaryData.Description, &mapSummaryData.Showcase, &routers, &mapSummaryData.Rating)
63 if err != nil { 62 if err != nil {
@@ -69,7 +68,7 @@ func FetchMapSummary(c *gin.Context) {
69 var historyDates pq.StringArray 68 var historyDates pq.StringArray
70 sql = `SELECT array_agg(user_name), array_agg(score_count), array_agg(record_date) 69 sql = `SELECT array_agg(user_name), array_agg(score_count), array_agg(record_date)
71 FROM map_history 70 FROM map_history
72 WHERE map_id = $1;` 71 WHERE map_id = $1`
73 err = database.DB.QueryRow(sql, id).Scan(&historyNames, &historyScores, &historyDates) 72 err = database.DB.QueryRow(sql, id).Scan(&historyNames, &historyScores, &historyDates)
74 if err != nil { 73 if err != nil {
75 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 74 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
@@ -103,7 +102,6 @@ func FetchMapSummary(c *gin.Context) {
103// 102//
104// @Summary Get map leaderboards with specified id. 103// @Summary Get map leaderboards with specified id.
105// @Tags maps 104// @Tags maps
106// @Accept json
107// @Produce json 105// @Produce json
108// @Param id path int true "Map ID" 106// @Param id path int true "Map ID"
109// @Success 200 {object} models.Response{data=models.Map{data=models.MapRecords}} 107// @Success 200 {object} models.Response{data=models.Map{data=models.MapRecords}}
@@ -125,7 +123,7 @@ func FetchMapLeaderboards(c *gin.Context) {
125 FROM maps m 123 FROM maps m
126 INNER JOIN games g ON m.game_id = g.id 124 INNER JOIN games g ON m.game_id = g.id
127 INNER JOIN chapters c ON m.chapter_id = c.id 125 INNER JOIN chapters c ON m.chapter_id = c.id
128 WHERE m.id = $1;` 126 WHERE m.id = $1`
129 err = database.DB.QueryRow(sql, id).Scan(&mapData.GameName, &mapData.ChapterName, &mapData.MapName, &isDisabled) 127 err = database.DB.QueryRow(sql, id).Scan(&mapData.GameName, &mapData.ChapterName, &mapData.MapName, &isDisabled)
130 if err != nil { 128 if err != nil {
131 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 129 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
@@ -146,7 +144,7 @@ func FetchMapLeaderboards(c *gin.Context) {
146 FROM records_mp 144 FROM records_mp
147 WHERE map_id = $1 145 WHERE map_id = $1
148 ) sub 146 ) sub
149 WHERE rn = 1;` 147 WHERE rn = 1`
150 rows, err := database.DB.Query(sql, id) 148 rows, err := database.DB.Query(sql, id)
151 if err != nil { 149 if err != nil {
152 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 150 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
@@ -181,7 +179,7 @@ func FetchMapLeaderboards(c *gin.Context) {
181 WHERE map_id = $1 179 WHERE map_id = $1
182 ) sub 180 ) sub
183 INNER JOIN users ON user_id = users.steam_id 181 INNER JOIN users ON user_id = users.steam_id
184 WHERE rn = 1;` 182 WHERE rn = 1`
185 rows, err := database.DB.Query(sql, id) 183 rows, err := database.DB.Query(sql, id)
186 if err != nil { 184 if err != nil {
187 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 185 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
@@ -215,3 +213,117 @@ func FetchMapLeaderboards(c *gin.Context) {
215 Data: mapData, 213 Data: mapData,
216 }) 214 })
217} 215}
216
217// GET Games
218//
219// @Summary Get games from the leaderboards.
220// @Tags games & chapters
221// @Produce json
222// @Success 200 {object} models.Response{data=[]models.Game}
223// @Failure 400 {object} models.Response
224// @Router /games [get]
225func FetchGames(c *gin.Context) {
226 rows, err := database.DB.Query(`SELECT id, name FROM games`)
227 if err != nil {
228 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
229 return
230 }
231 var games []models.Game
232 for rows.Next() {
233 var game models.Game
234 if err := rows.Scan(&game.ID, &game.Name); err != nil {
235 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
236 return
237 }
238 games = append(games, game)
239 }
240 c.JSON(http.StatusOK, models.Response{
241 Success: true,
242 Message: "Successfully retrieved games.",
243 Data: games,
244 })
245}
246
247// GET Chapters of a Game
248//
249// @Summary Get chapters from the specified game id.
250// @Tags games & chapters
251// @Produce json
252// @Param id path int true "Game ID"
253// @Success 200 {object} models.Response{data=models.ChaptersResponse}
254// @Failure 400 {object} models.Response
255// @Router /games/{id} [get]
256func FetchChapters(c *gin.Context) {
257 gameID := c.Param("id")
258 intID, err := strconv.Atoi(gameID)
259 if err != nil {
260 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
261 return
262 }
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)
265 if err != nil {
266 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
267 return
268 }
269 var chapters []models.Chapter
270 var gameName string
271 for rows.Next() {
272 var chapter models.Chapter
273 if err := rows.Scan(&chapter.ID, &chapter.Name, &gameName); err != nil {
274 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
275 return
276 }
277 chapters = append(chapters, chapter)
278 }
279 response.Game.ID = intID
280 response.Game.Name = gameName
281 response.Chapters = chapters
282 c.JSON(http.StatusOK, models.Response{
283 Success: true,
284 Message: "Successfully retrieved chapters.",
285 Data: response,
286 })
287}
288
289// GET Maps of a Chapter
290//
291// @Summary Get maps from the specified chapter id.
292// @Tags games & chapters
293// @Produce json
294// @Param id path int true "Chapter ID"
295// @Success 200 {object} models.Response{data=models.ChapterMapsResponse}
296// @Failure 400 {object} models.Response
297// @Router /chapters/{id} [get]
298func FetchChapterMaps(c *gin.Context) {
299 chapterID := c.Param("id")
300 intID, err := strconv.Atoi(chapterID)
301 if err != nil {
302 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
303 return
304 }
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)
307 if err != nil {
308 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
309 return
310 }
311 var maps []models.MapShort
312 var chapterName string
313 for rows.Next() {
314 var mapShort models.MapShort
315 if err := rows.Scan(&mapShort.ID, &mapShort.Name, &chapterName); err != nil {
316 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
317 return
318 }
319 maps = append(maps, mapShort)
320 }
321 response.Chapter.ID = intID
322 response.Chapter.Name = chapterName
323 response.Maps = maps
324 c.JSON(http.StatusOK, models.Response{
325 Success: true,
326 Message: "Successfully retrieved maps.",
327 Data: response,
328 })
329}