diff options
Diffstat (limited to 'backend/controllers/mapController.go')
| -rw-r--r-- | backend/controllers/mapController.go | 52 |
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] |
| 21 | func FetchMapSummary(c *gin.Context) { | 21 | func 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 |