aboutsummaryrefslogtreecommitdiff
path: root/backend/controllers/homeController.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/controllers/homeController.go')
-rw-r--r--backend/controllers/homeController.go284
1 files changed, 0 insertions, 284 deletions
diff --git a/backend/controllers/homeController.go b/backend/controllers/homeController.go
deleted file mode 100644
index c94590a..0000000
--- a/backend/controllers/homeController.go
+++ /dev/null
@@ -1,284 +0,0 @@
1package controllers
2
3import (
4 "log"
5 "net/http"
6 "strings"
7
8 "github.com/gin-gonic/gin"
9 "github.com/pektezol/leastportalshub/backend/database"
10 "github.com/pektezol/leastportalshub/backend/models"
11)
12
13func Home(c *gin.Context) {
14 user, exists := c.Get("user")
15 if !exists {
16 c.JSON(200, "no id, not auth")
17 } else {
18 c.JSON(200, gin.H{
19 "output": user,
20 })
21 }
22}
23
24// GET Rankings
25//
26// @Description Get rankings of every player.
27// @Tags rankings
28// @Produce json
29// @Success 200 {object} models.Response{data=models.RankingsResponse}
30// @Failure 400 {object} models.Response
31// @Router /rankings [get]
32func Rankings(c *gin.Context) {
33 rows, err := database.DB.Query(`SELECT steam_id, user_name FROM users`)
34 if err != nil {
35 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
36 return
37 }
38 var spRankings []models.UserRanking
39 var mpRankings []models.UserRanking
40 for rows.Next() {
41 var userID, username string
42 err := rows.Scan(&userID, &username)
43 if err != nil {
44 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
45 return
46 }
47 // Getting all sp records for each user
48 var uniqueSingleUserRecords, totalSingleMaps int
49 sql := `SELECT COUNT(DISTINCT map_id), (SELECT COUNT(map_name) FROM maps
50 WHERE is_coop = FALSE AND is_disabled = false) FROM records_sp WHERE user_id = $1`
51 err = database.DB.QueryRow(sql, userID).Scan(&uniqueSingleUserRecords, &totalSingleMaps)
52 if err != nil {
53 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
54 return
55 }
56 // Has all singleplayer records
57 if uniqueSingleUserRecords == totalSingleMaps {
58 var ranking models.UserRanking
59 ranking.UserID = userID
60 ranking.UserName = username
61 sql := `SELECT DISTINCT map_id, score_count FROM records_sp WHERE user_id = $1 ORDER BY map_id, score_count`
62 rows, err := database.DB.Query(sql, userID)
63 if err != nil {
64 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
65 return
66 }
67 totalScore := 0
68 var maps []int
69 for rows.Next() {
70 var mapID, scoreCount int
71 rows.Scan(&mapID, &scoreCount)
72 if len(maps) != 0 && maps[len(maps)-1] == mapID {
73 continue
74 }
75 totalScore += scoreCount
76 maps = append(maps, mapID)
77 }
78 ranking.TotalScore = totalScore
79 spRankings = append(spRankings, ranking)
80 }
81 // Getting all mp records for each user
82 var uniqueMultiUserRecords, totalMultiMaps int
83 sql = `SELECT COUNT(DISTINCT map_id), (SELECT COUNT(map_name) FROM maps
84 WHERE is_coop = TRUE AND is_disabled = false) FROM records_mp WHERE host_id = $1 OR partner_id = $2`
85 err = database.DB.QueryRow(sql, userID, userID).Scan(&uniqueMultiUserRecords, &totalMultiMaps)
86 if err != nil {
87 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
88 return
89 }
90 // Has all singleplayer records
91 if uniqueMultiUserRecords == totalMultiMaps {
92 var ranking models.UserRanking
93 ranking.UserID = userID
94 ranking.UserName = username
95 sql := `SELECT DISTINCT map_id, score_count FROM records_mp WHERE host_id = $1 OR partner_id = $2 ORDER BY map_id, score_count`
96 rows, err := database.DB.Query(sql, userID, userID)
97 if err != nil {
98 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
99 return
100 }
101 totalScore := 0
102 var maps []int
103 for rows.Next() {
104 var mapID, scoreCount int
105 rows.Scan(&mapID, &scoreCount)
106 if len(maps) != 0 && maps[len(maps)-1] == mapID {
107 continue
108 }
109 totalScore += scoreCount
110 maps = append(maps, mapID)
111 }
112 ranking.TotalScore = totalScore
113 mpRankings = append(mpRankings, ranking)
114 }
115 }
116 c.JSON(http.StatusOK, models.Response{
117 Success: true,
118 Message: "Successfully retrieved rankings.",
119 Data: models.RankingsResponse{
120 RankingsSP: spRankings,
121 RankingsMP: mpRankings,
122 },
123 })
124}
125
126// GET Search With Query
127//
128// @Description Get all user and map data matching to the query.
129// @Tags search
130// @Produce json
131// @Param q query string false "Search user or map name."
132// @Success 200 {object} models.Response{data=models.SearchResponse}
133// @Failure 400 {object} models.Response
134// @Router /search [get]
135func SearchWithQuery(c *gin.Context) {
136 query := c.Query("q")
137 query = strings.ToLower(query)
138 log.Println(query)
139 var response models.SearchResponse
140 // Cache all maps for faster response
141 var maps = []models.MapShort{
142 {ID: 1, Name: "Container Ride"},
143 {ID: 2, Name: "Portal Carousel"},
144 {ID: 3, Name: "Portal Gun"},
145 {ID: 4, Name: "Smooth Jazz"},
146 {ID: 5, Name: "Cube Momentum"},
147 {ID: 6, Name: "Future Starter"},
148 {ID: 7, Name: "Secret Panel"},
149 {ID: 8, Name: "Wakeup"},
150 {ID: 9, Name: "Incinerator"},
151 {ID: 10, Name: "Laser Intro"},
152 {ID: 11, Name: "Laser Stairs"},
153 {ID: 12, Name: "Dual Lasers"},
154 {ID: 13, Name: "Laser Over Goo"},
155 {ID: 14, Name: "Catapult Intro"},
156 {ID: 15, Name: "Trust Fling"},
157 {ID: 16, Name: "Pit Flings"},
158 {ID: 17, Name: "Fizzler Intro"},
159 {ID: 18, Name: "Ceiling Catapult"},
160 {ID: 19, Name: "Ricochet"},
161 {ID: 20, Name: "Bridge Intro"},
162 {ID: 21, Name: "Bridge The Gap"},
163 {ID: 22, Name: "Turret Intro"},
164 {ID: 23, Name: "Laser Relays"},
165 {ID: 24, Name: "Turret Blocker"},
166 {ID: 25, Name: "Laser vs Turret"},
167 {ID: 26, Name: "Pull The Rug"},
168 {ID: 27, Name: "Column Blocker"},
169 {ID: 28, Name: "Laser Chaining"},
170 {ID: 29, Name: "Triple Laser"},
171 {ID: 30, Name: "Jail Break"},
172 {ID: 31, Name: "Escape"},
173 {ID: 32, Name: "Turret Factory"},
174 {ID: 33, Name: "Turret Sabotage"},
175 {ID: 34, Name: "Neurotoxin Sabotage"},
176 {ID: 35, Name: "Core"},
177 {ID: 36, Name: "Underground"},
178 {ID: 37, Name: "Cave Johnson"},
179 {ID: 38, Name: "Repulsion Intro"},
180 {ID: 39, Name: "Bomb Flings"},
181 {ID: 40, Name: "Crazy Box"},
182 {ID: 41, Name: "PotatOS"},
183 {ID: 42, Name: "Propulsion Intro"},
184 {ID: 43, Name: "Propulsion Flings"},
185 {ID: 44, Name: "Conversion Intro"},
186 {ID: 45, Name: "Three Gels"},
187 {ID: 46, Name: "Test"},
188 {ID: 47, Name: "Funnel Intro"},
189 {ID: 48, Name: "Ceiling Button"},
190 {ID: 49, Name: "Wall Button"},
191 {ID: 50, Name: "Polarity"},
192 {ID: 51, Name: "Funnel Catch"},
193 {ID: 52, Name: "Stop The Box"},
194 {ID: 53, Name: "Laser Catapult"},
195 {ID: 54, Name: "Laser Platform"},
196 {ID: 55, Name: "Propulsion Catch"},
197 {ID: 56, Name: "Repulsion Polarity"},
198 {ID: 57, Name: "Finale 1"},
199 {ID: 58, Name: "Finale 2"},
200 {ID: 59, Name: "Finale 3"},
201 {ID: 60, Name: "Finale 4"},
202 {ID: 61, Name: "Calibration"},
203 {ID: 62, Name: "Hub"},
204 {ID: 63, Name: "Doors"},
205 {ID: 64, Name: "Buttons"},
206 {ID: 65, Name: "Lasers"},
207 {ID: 66, Name: "Rat Maze"},
208 {ID: 67, Name: "Laser Crusher"},
209 {ID: 68, Name: "Behind The Scenes"},
210 {ID: 69, Name: "Flings"},
211 {ID: 70, Name: "Infinifling"},
212 {ID: 71, Name: "Team Retrieval"},
213 {ID: 72, Name: "Vertical Flings"},
214 {ID: 73, Name: "Catapults"},
215 {ID: 74, Name: "Multifling"},
216 {ID: 75, Name: "Fling Crushers"},
217 {ID: 76, Name: "Industrial Fan"},
218 {ID: 77, Name: "Cooperative Bridges"},
219 {ID: 78, Name: "Bridge Swap"},
220 {ID: 79, Name: "Fling Block"},
221 {ID: 80, Name: "Catapult Block"},
222 {ID: 81, Name: "Bridge Fling"},
223 {ID: 82, Name: "Turret Walls"},
224 {ID: 83, Name: "Turret Assasin"},
225 {ID: 84, Name: "Bridge Testing"},
226 {ID: 85, Name: "Cooperative Funnels"},
227 {ID: 86, Name: "Funnel Drill"},
228 {ID: 87, Name: "Funnel Catch"},
229 {ID: 88, Name: "Funnel Laser"},
230 {ID: 89, Name: "Cooperative Polarity"},
231 {ID: 90, Name: "Funnel Hop"},
232 {ID: 91, Name: "Advanced Polarity"},
233 {ID: 92, Name: "Funnel Maze"},
234 {ID: 93, Name: "Turret Warehouse"},
235 {ID: 94, Name: "Repulsion Jumps"},
236 {ID: 95, Name: "Double Bounce"},
237 {ID: 96, Name: "Bridge Repulsion"},
238 {ID: 97, Name: "Wall Repulsion"},
239 {ID: 98, Name: "Propulsion Crushers"},
240 {ID: 99, Name: "Turret Ninja"},
241 {ID: 100, Name: "Propulsion Retrieval"},
242 {ID: 101, Name: "Vault Entrance"},
243 {ID: 102, Name: "Seperation"},
244 {ID: 103, Name: "Triple Axis"},
245 {ID: 104, Name: "Catapult Catch"},
246 {ID: 105, Name: "Bridge Gels"},
247 {ID: 106, Name: "Maintenance"},
248 {ID: 107, Name: "Bridge Catch"},
249 {ID: 108, Name: "Double Lift"},
250 {ID: 109, Name: "Gel Maze"},
251 {ID: 110, Name: "Crazier Box"},
252 }
253 var filteredMaps []models.MapShort
254 for _, m := range maps {
255 if strings.Contains(strings.ToLower(m.Name), strings.ToLower(query)) {
256 filteredMaps = append(filteredMaps, m)
257 }
258 }
259 response.Maps = filteredMaps
260 if len(response.Maps) == 0 {
261 response.Maps = []models.MapShort{}
262 }
263 rows, err := database.DB.Query("SELECT steam_id, user_name FROM users WHERE lower(user_name) LIKE $1", "%"+query+"%")
264 if err != nil {
265 log.Fatal(err)
266 }
267 defer rows.Close()
268 for rows.Next() {
269 var user models.UserShort
270 if err := rows.Scan(&user.SteamID, &user.UserName); err != nil {
271 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
272 return
273 }
274 response.Players = append(response.Players, user)
275 }
276 if len(response.Players) == 0 {
277 response.Players = []models.UserShort{}
278 }
279 c.JSON(http.StatusOK, models.Response{
280 Success: true,
281 Message: "Search successfully retrieved.",
282 Data: response,
283 })
284}