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.go112
1 files changed, 93 insertions, 19 deletions
diff --git a/backend/controllers/mapController.go b/backend/controllers/mapController.go
index 16dd669..a04854e 100644
--- a/backend/controllers/mapController.go
+++ b/backend/controllers/mapController.go
@@ -5,24 +5,95 @@ import (
5 "strconv" 5 "strconv"
6 6
7 "github.com/gin-gonic/gin" 7 "github.com/gin-gonic/gin"
8 "github.com/lib/pq"
8 "github.com/pektezol/leastportals/backend/database" 9 "github.com/pektezol/leastportals/backend/database"
9 "github.com/pektezol/leastportals/backend/models" 10 "github.com/pektezol/leastportals/backend/models"
10) 11)
11 12
12// GET Map 13// GET Map Summary
13// 14//
14// @Summary Get map page with specified id. 15// @Summary Get map summary with specified id.
15// @Tags maps 16// @Tags maps
16// @Accept json 17// @Accept json
17// @Produce json 18// @Produce json
18// @Param id path int true "Map ID" 19// @Param id path int true "Map ID"
19// @Success 200 {object} models.Response{data=models.Map} 20// @Success 200 {object} models.Response{data=models.Map{data=models.MapSummary}}
20// @Failure 400 {object} models.Response 21// @Failure 400 {object} models.Response
21// @Router /maps/{id} [get] 22// @Router /maps/{id}/summary [get]
22func FetchMap(c *gin.Context) { 23func FetchMapSummary(c *gin.Context) {
23 id := c.Param("id") 24 id := c.Param("id")
24 // Get map data 25 // Get map data
25 var mapData models.Map 26 var mapData models.Map
27 var mapSummaryData models.MapSummary
28 intID, err := strconv.Atoi(id)
29 if err != nil {
30 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
31 return
32 }
33 mapData.ID = intID
34 var routers pq.StringArray
35 sql := `SELECT g.name, c.name, m.name, m.description, m.showcase,
36 (
37 SELECT user_name
38 FROM map_history
39 WHERE map_id = $1
40 ORDER BY score_count
41 LIMIT 1
42 ),
43 (
44 SELECT array_agg(user_name)
45 FROM map_routers
46 WHERE map_id = $1
47 AND score_count = (
48 SELECT score_count
49 FROM map_history
50 WHERE map_id = $1
51 ORDER BY score_count
52 LIMIT 1
53 )
54 GROUP BY map_routers.user_name
55 ORDER BY user_name
56 ),
57 (
58 SELECT COALESCE(avg(rating), 0.0)
59 FROM map_ratings
60 WHERE map_id = $1
61 )
62 FROM maps m
63 INNER JOIN games g ON m.game_id = g.id
64 INNER JOIN chapters c ON m.chapter_id = c.id
65 WHERE m.id = $1;`
66 // TODO: CategoryScores
67 err = database.DB.QueryRow(sql, id).Scan(&mapData.GameName, &mapData.ChapterName, &mapData.MapName, &mapSummaryData.Description, &mapSummaryData.Showcase, &mapSummaryData.FirstCompletion, &routers, &mapSummaryData.Rating)
68 if err != nil {
69 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
70 return
71 }
72 mapSummaryData.Routers = routers
73 mapData.Data = mapSummaryData
74 // Return response
75 c.JSON(http.StatusOK, models.Response{
76 Success: true,
77 Message: "Successfully retrieved map summary.",
78 Data: mapData,
79 })
80}
81
82// GET Map Leaderboards
83//
84// @Summary Get map leaderboards with specified id.
85// @Tags maps
86// @Accept json
87// @Produce json
88// @Param id path int true "Map ID"
89// @Success 200 {object} models.Response{data=models.Map{data=models.MapRecords}}
90// @Failure 400 {object} models.Response
91// @Router /maps/{id}/leaderboards [get]
92func FetchMapLeaderboards(c *gin.Context) {
93 id := c.Param("id")
94 // Get map data
95 var mapData models.Map
96 var mapRecordsData models.MapRecords
26 var isDisabled bool 97 var isDisabled bool
27 intID, err := strconv.Atoi(id) 98 intID, err := strconv.Atoi(id)
28 if err != nil { 99 if err != nil {
@@ -30,8 +101,12 @@ func FetchMap(c *gin.Context) {
30 return 101 return
31 } 102 }
32 mapData.ID = intID 103 mapData.ID = intID
33 sql := `SELECT map_name, wr_score, wr_time, is_coop, is_disabled FROM maps WHERE id = $1;` 104 sql := `SELECT g.name, c.name, m.name, is_disabled
34 err = database.DB.QueryRow(sql, id).Scan(&mapData.Name, &mapData.ScoreWR, &mapData.TimeWR, &mapData.IsCoop, &isDisabled) 105 FROM maps m
106 INNER JOIN games g ON m.game_id = g.id
107 INNER JOIN chapters c ON m.chapter_id = c.id
108 WHERE m.id = $1;`
109 err = database.DB.QueryRow(sql, id).Scan(&mapData.GameName, &mapData.ChapterName, &mapData.MapName, &isDisabled)
35 if err != nil { 110 if err != nil {
36 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 111 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
37 return 112 return
@@ -40,13 +115,14 @@ func FetchMap(c *gin.Context) {
40 c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards.")) 115 c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards."))
41 return 116 return
42 } 117 }
118 // TODO: avatar and names for host & partner
43 // Get records from the map 119 // Get records from the map
44 if mapData.IsCoop { 120 if mapData.GameName == "Portal 2 - Cooperative" {
45 var records []models.RecordMP 121 var records []models.RecordMP
46 sql = `SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date 122 sql = `SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date
47 FROM ( 123 FROM (
48 SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date, 124 SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date,
49 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score_count, score_time) AS rn 125 ROW_NUMBER() OVER (PARTITION BY host_id, partner_id ORDER BY score_count, score_time) AS rn
50 FROM records_mp 126 FROM records_mp
51 WHERE map_id = $1 127 WHERE map_id = $1
52 ) sub 128 ) sub
@@ -60,7 +136,7 @@ func FetchMap(c *gin.Context) {
60 ties := 0 136 ties := 0
61 for rows.Next() { 137 for rows.Next() {
62 var record models.RecordMP 138 var record models.RecordMP
63 err := rows.Scan(&record.RecordID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) 139 err := rows.Scan(&record.RecordID, &record.HostID, &record.HostName, &record.HostAvatar, &record.PartnerID, &record.PartnerName, &record.PartnerAvatar, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate)
64 if err != nil { 140 if err != nil {
65 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 141 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
66 return 142 return
@@ -74,16 +150,17 @@ func FetchMap(c *gin.Context) {
74 records = append(records, record) 150 records = append(records, record)
75 placement++ 151 placement++
76 } 152 }
77 mapData.Records = records 153 mapRecordsData.Records = records
78 } else { 154 } else {
79 var records []models.RecordSP 155 var records []models.RecordSP
80 sql = `SELECT id, user_id, score_count, score_time, demo_id, record_date 156 sql = `SELECT id, user_id, users.user_name, users.avatar_link, score_count, score_time, demo_id, record_date
81 FROM ( 157 FROM (
82 SELECT id, user_id, score_count, score_time, demo_id, record_date, 158 SELECT id, user_id, score_count, score_time, demo_id, record_date,
83 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score_count, score_time) AS rn 159 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score_count, score_time) AS rn
84 FROM records_sp 160 FROM records_sp
85 WHERE map_id = $1 161 WHERE map_id = $1
86 ) sub 162 ) sub
163 INNER JOIN users ON user_id = users.steam_id
87 WHERE rn = 1;` 164 WHERE rn = 1;`
88 rows, err := database.DB.Query(sql, id) 165 rows, err := database.DB.Query(sql, id)
89 if err != nil { 166 if err != nil {
@@ -94,7 +171,7 @@ func FetchMap(c *gin.Context) {
94 ties := 0 171 ties := 0
95 for rows.Next() { 172 for rows.Next() {
96 var record models.RecordSP 173 var record models.RecordSP
97 err := rows.Scan(&record.RecordID, &record.UserID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate) 174 err := rows.Scan(&record.RecordID, &record.UserID, &record.UserName, &record.UserAvatar, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate)
98 if err != nil { 175 if err != nil {
99 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) 176 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
100 return 177 return
@@ -108,16 +185,13 @@ func FetchMap(c *gin.Context) {
108 records = append(records, record) 185 records = append(records, record)
109 placement++ 186 placement++
110 } 187 }
111 mapData.Records = records 188 mapRecordsData.Records = records
112 } 189 }
190 mapData.Data = mapRecordsData
113 // Return response 191 // Return response
114 c.JSON(http.StatusOK, models.Response{ 192 c.JSON(http.StatusOK, models.Response{
115 Success: true, 193 Success: true,
116 Message: "Successfully retrieved map data.", 194 Message: "Successfully retrieved map leaderboards.",
117 Data: mapData, 195 Data: mapData,
118 }) 196 })
119} 197}
120
121func CreateMapCommunity(c *gin.Context) {
122
123}