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.go52
1 files changed, 18 insertions, 34 deletions
diff --git a/backend/controllers/mapController.go b/backend/controllers/mapController.go
index 37b8e9b..e46b766 100644
--- a/backend/controllers/mapController.go
+++ b/backend/controllers/mapController.go
@@ -20,60 +20,44 @@ import (
20// @Router /maps/{id}/summary [get] 20// @Router /maps/{id}/summary [get]
21func FetchMapSummary(c *gin.Context) { 21func FetchMapSummary(c *gin.Context) {
22 id := c.Param("id") 22 id := c.Param("id")
23 // Get map data 23 response := models.MapSummaryResponse{Map: models.Map{}, Summary: models.MapSummary{Routes: []models.MapRoute{}}}
24 response := models.MapSummaryResponse{Map: models.Map{}, Summary: models.MapSummary{History: []models.MapHistory{}, Routes: []models.MapRoute{}}}
25 intID, err := strconv.Atoi(id) 24 intID, err := strconv.Atoi(id)
26 if err != nil { 25 if err != nil {
27 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 26 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
28 return 27 return
29 } 28 }
29 // (
30 // SELECT COALESCE(avg(rating), 0.0)
31 // FROM route_ratings
32 // WHERE map_id = $1
33 // )
34 // Get map data
30 response.Map.ID = intID 35 response.Map.ID = intID
31 sql := `SELECT m.id, g.name, c.name, m.name, 36 sql := `SELECT m.id, g.name, c.name, m.name
32 (
33 SELECT COALESCE(avg(rating), 0.0)
34 FROM map_ratings
35 WHERE map_id = $1
36 )
37 FROM maps m 37 FROM maps m
38 INNER JOIN games g ON m.game_id = g.id 38 INNER JOIN games g ON m.game_id = g.id
39 INNER JOIN chapters c ON m.chapter_id = c.id 39 INNER JOIN chapters c ON m.chapter_id = c.id
40 WHERE m.id = $1` 40 WHERE m.id = $1`
41 err = database.DB.QueryRow(sql, id).Scan(&response.Map.ID, &response.Map.GameName, &response.Map.ChapterName, &response.Map.MapName, &response.Summary.Rating) 41 err = database.DB.QueryRow(sql, id).Scan(&response.Map.ID, &response.Map.GameName, &response.Map.ChapterName, &response.Map.MapName)
42 if err != nil { 42 if err != nil {
43 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 43 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
44 return 44 return
45 } 45 }
46 sql = `SELECT user_name, score_count, record_date 46 // Get map routes and histories
47 FROM map_history 47 sql = `SELECT c.id, c.name, h.user_name, h.score_count, h.record_date, r.score_count, r.description, r.showcase, COALESCE(avg(rating), 0.0) FROM map_routes r
48 WHERE map_id = $1 48 INNER JOIN categories c ON r.category_id = c.id
49 ORDER BY record_date ASC` 49 INNER JOIN map_history h ON r.map_id = h.map_id AND r.category_id = h.category_id
50 LEFT JOIN map_ratings rt ON r.map_id = rt.map_id AND r.category_id = rt.category_id
51 WHERE r.map_id = $1 AND h.score_count = r.score_count GROUP BY c.id, h.user_name, h.score_count, h.record_date, r.score_count, r.description, r.showcase
52 ORDER BY h.record_date ASC;`
50 rows, err := database.DB.Query(sql, id) 53 rows, err := database.DB.Query(sql, id)
51 if err != nil { 54 if err != nil {
52 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 55 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
53 return 56 return
54 } 57 }
55 for rows.Next() { 58 for rows.Next() {
56 history := models.MapHistory{} 59 route := models.MapRoute{Category: models.Category{}, History: models.MapHistory{}}
57 err = rows.Scan(&history.RunnerName, &history.ScoreCount, &history.Date) 60 err = rows.Scan(&route.Category.ID, &route.Category.Name, &route.History.RunnerName, &route.History.ScoreCount, &route.History.Date, &route.ScoreCount, &route.Description, &route.Showcase, &route.Rating)
58 if err != nil {
59 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
60 return
61 }
62 response.Summary.History = append(response.Summary.History, history)
63 }
64 sql = `SELECT c.id, c.name, mr.score_count, mr.description, mr.showcase
65 FROM map_routes mr
66 INNER JOIN categories c ON mr.category_id = c.id
67 WHERE mr.map_id = $1
68 ORDER BY mr.score_count DESC`
69 rows, err = database.DB.Query(sql, id)
70 if err != nil {
71 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
72 return
73 }
74 for rows.Next() {
75 route := models.MapRoute{}
76 err = rows.Scan(&route.Category.ID, &route.Category.Name, &route.ScoreCount, &route.Description, &route.Showcase)
77 if err != nil { 61 if err != nil {
78 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 62 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
79 return 63 return