aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/database/history.sql1
-rw-r--r--backend/database/route.sql1
-rw-r--r--backend/handlers/user.go102
3 files changed, 92 insertions, 12 deletions
diff --git a/backend/database/history.sql b/backend/database/history.sql
index 96bde3d..cadb30c 100644
--- a/backend/database/history.sql
+++ b/backend/database/history.sql
@@ -25,6 +25,7 @@ INSERT INTO map_history(map_id,category_id,user_name,score_count,record_date) VA
25(13,1,'LookLikeAKango',3,'2011-10-05'), 25(13,1,'LookLikeAKango',3,'2011-10-05'),
26(13,1,'Imanex',2,'2011-12-08'), 26(13,1,'Imanex',2,'2011-12-08'),
27(13,1,'jyjey',0,'2012-08-22'), 27(13,1,'jyjey',0,'2012-08-22'),
28(14,0,'?',0,'2011-04-19'),
28(15,1,'Tyronis',2,'2011-10-05'), 29(15,1,'Tyronis',2,'2011-10-05'),
29(16,1,'LookLikeAKango',2,'2011-10-05'), 30(16,1,'LookLikeAKango',2,'2011-10-05'),
30(16,1,'jyjey',0,'2012-08-25'), 31(16,1,'jyjey',0,'2012-08-25'),
diff --git a/backend/database/route.sql b/backend/database/route.sql
index 45941a5..8b23a8c 100644
--- a/backend/database/route.sql
+++ b/backend/database/route.sql
@@ -25,6 +25,7 @@ INSERT INTO map_routes(map_id,category_id,score_count,description,showcase) VALU
25(13,1,3,'',''), 25(13,1,3,'',''),
26(13,1,2,'',''), 26(13,1,2,'',''),
27(13,1,0,'',''), 27(13,1,0,'',''),
28(14,1,0,'',''),
28(15,1,2,'',''), 29(15,1,2,'',''),
29(16,1,2,'',''), 30(16,1,2,'',''),
30(16,1,0,'',''), 31(16,1,0,'',''),
diff --git a/backend/handlers/user.go b/backend/handlers/user.go
index 777d60c..6b090a0 100644
--- a/backend/handlers/user.go
+++ b/backend/handlers/user.go
@@ -40,10 +40,12 @@ type ProfileRecords struct {
40 MapID int `json:"map_id"` 40 MapID int `json:"map_id"`
41 MapName string `json:"map_name"` 41 MapName string `json:"map_name"`
42 MapWRCount int `json:"map_wr_count"` 42 MapWRCount int `json:"map_wr_count"`
43 Placement int `json:"placement"`
43 Scores []ProfileScores `json:"scores"` 44 Scores []ProfileScores `json:"scores"`
44} 45}
45 46
46type ProfileScores struct { 47type ProfileScores struct {
48 RecordID int `json:"record_id"`
47 DemoID string `json:"demo_id"` 49 DemoID string `json:"demo_id"`
48 ScoreCount int `json:"score_count"` 50 ScoreCount int `json:"score_count"`
49 ScoreTime int `json:"score_time"` 51 ScoreTime int `json:"score_time"`
@@ -290,13 +292,28 @@ func Profile(c *gin.Context) {
290 } 292 }
291 records := []ProfileRecords{} 293 records := []ProfileRecords{}
292 // Get singleplayer records 294 // Get singleplayer records
293 sql = `SELECT m.game_id, m.chapter_id, sp.map_id, m."name", (SELECT mr.score_count FROM map_routes mr WHERE mr.map_id = sp.map_id ORDER BY mr.score_count ASC LIMIT 1) AS wr_count, sp.score_count, sp.score_time, sp.demo_id, sp.record_date 295 sql = `SELECT sp.id, m.game_id, m.chapter_id, sp.map_id, m."name", (SELECT mr.score_count FROM map_routes mr WHERE mr.map_id = sp.map_id ORDER BY mr.score_count ASC LIMIT 1) AS wr_count, sp.score_count, sp.score_time, sp.demo_id, sp.record_date
294 FROM records_sp sp INNER JOIN maps m ON sp.map_id = m.id WHERE sp.user_id = $1 ORDER BY sp.map_id, sp.score_count, sp.score_time;` 296 FROM records_sp sp INNER JOIN maps m ON sp.map_id = m.id WHERE sp.user_id = $1 ORDER BY sp.map_id, sp.score_count, sp.score_time`
295 rows, err = database.DB.Query(sql, user.(models.User).SteamID) 297 rows, err = database.DB.Query(sql, user.(models.User).SteamID)
296 if err != nil { 298 if err != nil {
297 c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) 299 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
298 return 300 return
299 } 301 }
302 sql = `WITH map_records AS (SELECT sp.user_id, sp.map_id,
303 RANK() OVER (PARTITION BY sp.map_id ORDER BY sp.score_count, sp.score_time) AS placement
304 FROM records_sp sp) SELECT DISTINCT ON (map_id) placement FROM map_records WHERE user_id = $1`
305 placementsRows, err := database.DB.Query(sql, user.(models.User).SteamID)
306 if err != nil {
307 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
308 return
309 }
310 placements := []int{}
311 placementIndex := 0
312 for placementsRows.Next() {
313 var placement int
314 placementsRows.Scan(&placement)
315 placements = append(placements, placement)
316 }
300 for rows.Next() { 317 for rows.Next() {
301 var gameID int 318 var gameID int
302 var categoryID int 319 var categoryID int
@@ -304,7 +321,11 @@ func Profile(c *gin.Context) {
304 var mapName string 321 var mapName string
305 var mapWR int 322 var mapWR int
306 score := ProfileScores{} 323 score := ProfileScores{}
307 rows.Scan(&gameID, &categoryID, &mapID, &mapName, &mapWR, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date) 324 err = rows.Scan(&score.RecordID, &gameID, &categoryID, &mapID, &mapName, &mapWR, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date)
325 if err != nil {
326 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
327 return
328 }
308 // More than one record in one map 329 // More than one record in one map
309 if len(records) != 0 && mapID == records[len(records)-1].MapID { 330 if len(records) != 0 && mapID == records[len(records)-1].MapID {
310 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score) 331 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score)
@@ -317,18 +338,35 @@ func Profile(c *gin.Context) {
317 MapID: mapID, 338 MapID: mapID,
318 MapName: mapName, 339 MapName: mapName,
319 MapWRCount: mapWR, 340 MapWRCount: mapWR,
341 Placement: placements[placementIndex],
320 Scores: []ProfileScores{}, 342 Scores: []ProfileScores{},
321 }) 343 })
344 placementIndex++
322 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score) 345 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score)
323 } 346 }
324 // Get multiplayer records 347 // Get multiplayer records
325 sql = `SELECT m.game_id, m.chapter_id, mp.map_id, m."name", (SELECT mr.score_count FROM map_routes mr WHERE mr.map_id = mp.map_id ORDER BY mr.score_count ASC LIMIT 1) AS wr_count, mp.score_count, mp.score_time, CASE WHEN host_id = $1 THEN mp.host_demo_id WHEN partner_id = $1 THEN mp.partner_demo_id END demo_id, mp.record_date 348 sql = `SELECT mp.id, m.game_id, m.chapter_id, mp.map_id, m."name", (SELECT mr.score_count FROM map_routes mr WHERE mr.map_id = mp.map_id ORDER BY mr.score_count ASC LIMIT 1) AS wr_count, mp.score_count, mp.score_time, CASE WHEN host_id = $1 THEN mp.host_demo_id WHEN partner_id = $1 THEN mp.partner_demo_id END demo_id, mp.record_date
326 FROM records_mp mp INNER JOIN maps m ON mp.map_id = m.id WHERE mp.host_id = $1 OR mp.partner_id = $1 ORDER BY mp.map_id, mp.score_count, mp.score_time;` 349 FROM records_mp mp INNER JOIN maps m ON mp.map_id = m.id WHERE mp.host_id = $1 OR mp.partner_id = $1 ORDER BY mp.map_id, mp.score_count, mp.score_time`
327 rows, err = database.DB.Query(sql, user.(models.User).SteamID) 350 rows, err = database.DB.Query(sql, user.(models.User).SteamID)
328 if err != nil { 351 if err != nil {
329 c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) 352 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
330 return 353 return
331 } 354 }
355 sql = `WITH map_records AS (SELECT mp.host_id, mp.partner_id, mp.map_id,
356 RANK() OVER (PARTITION BY mp.map_id ORDER BY mp.score_count, mp.score_time) AS placement
357 FROM records_mp mp) SELECT DISTINCT ON (map_id) placement FROM map_records WHERE host_id = $1 OR partner_id = $1`
358 placementsRows, err = database.DB.Query(sql, user.(models.User).SteamID)
359 if err != nil {
360 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
361 return
362 }
363 placements = []int{}
364 placementIndex = 0
365 for placementsRows.Next() {
366 var placement int
367 placementsRows.Scan(&placement)
368 placements = append(placements, placement)
369 }
332 for rows.Next() { 370 for rows.Next() {
333 var gameID int 371 var gameID int
334 var categoryID int 372 var categoryID int
@@ -336,7 +374,7 @@ func Profile(c *gin.Context) {
336 var mapName string 374 var mapName string
337 var mapWR int 375 var mapWR int
338 score := ProfileScores{} 376 score := ProfileScores{}
339 rows.Scan(&gameID, &categoryID, &mapID, &mapName, &mapWR, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date) 377 rows.Scan(&score.RecordID, &gameID, &categoryID, &mapID, &mapName, &mapWR, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date)
340 // More than one record in one map 378 // More than one record in one map
341 if len(records) != 0 && mapID == records[len(records)-1].MapID { 379 if len(records) != 0 && mapID == records[len(records)-1].MapID {
342 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score) 380 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score)
@@ -349,8 +387,10 @@ func Profile(c *gin.Context) {
349 MapID: mapID, 387 MapID: mapID,
350 MapName: mapName, 388 MapName: mapName,
351 MapWRCount: mapWR, 389 MapWRCount: mapWR,
390 Placement: placements[placementIndex],
352 Scores: []ProfileScores{}, 391 Scores: []ProfileScores{},
353 }) 392 })
393 placementIndex++
354 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score) 394 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score)
355 } 395 }
356 c.JSON(http.StatusOK, models.Response{ 396 c.JSON(http.StatusOK, models.Response{
@@ -612,13 +652,28 @@ func FetchUser(c *gin.Context) {
612 } 652 }
613 records := []ProfileRecords{} 653 records := []ProfileRecords{}
614 // Get singleplayer records 654 // Get singleplayer records
615 sql = `SELECT m.game_id, m.chapter_id, sp.map_id, m."name", (SELECT mr.score_count FROM map_routes mr WHERE mr.map_id = sp.map_id ORDER BY mr.score_count ASC LIMIT 1) AS wr_count, sp.score_count, sp.score_time, sp.demo_id, sp.record_date 655 sql = `SELECT sp.id, m.game_id, m.chapter_id, sp.map_id, m."name", (SELECT mr.score_count FROM map_routes mr WHERE mr.map_id = sp.map_id ORDER BY mr.score_count ASC LIMIT 1) AS wr_count, sp.score_count, sp.score_time, sp.demo_id, sp.record_date
616 FROM records_sp sp INNER JOIN maps m ON sp.map_id = m.id WHERE sp.user_id = $1 ORDER BY sp.map_id, sp.score_count, sp.score_time;` 656 FROM records_sp sp INNER JOIN maps m ON sp.map_id = m.id WHERE sp.user_id = $1 ORDER BY sp.map_id, sp.score_count, sp.score_time`
617 rows, err = database.DB.Query(sql, user.SteamID) 657 rows, err = database.DB.Query(sql, user.SteamID)
618 if err != nil { 658 if err != nil {
619 c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) 659 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
620 return 660 return
621 } 661 }
662 sql = `WITH map_records AS (SELECT sp.user_id, sp.map_id,
663 RANK() OVER (PARTITION BY sp.map_id ORDER BY sp.score_count, sp.score_time) AS placement
664 FROM records_sp sp) SELECT DISTINCT ON (map_id) placement FROM map_records WHERE user_id = $1`
665 placementsRows, err := database.DB.Query(sql, user.SteamID)
666 if err != nil {
667 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
668 return
669 }
670 placements := []int{}
671 placementIndex := 0
672 for placementsRows.Next() {
673 var placement int
674 placementsRows.Scan(&placement)
675 placements = append(placements, placement)
676 }
622 for rows.Next() { 677 for rows.Next() {
623 var gameID int 678 var gameID int
624 var categoryID int 679 var categoryID int
@@ -626,7 +681,11 @@ func FetchUser(c *gin.Context) {
626 var mapName string 681 var mapName string
627 var mapWR int 682 var mapWR int
628 score := ProfileScores{} 683 score := ProfileScores{}
629 rows.Scan(&gameID, &categoryID, &mapID, &mapName, &mapWR, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date) 684 err = rows.Scan(&score.RecordID, &gameID, &categoryID, &mapID, &mapName, &mapWR, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date)
685 if err != nil {
686 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
687 return
688 }
630 // More than one record in one map 689 // More than one record in one map
631 if len(records) != 0 && mapID == records[len(records)-1].MapID { 690 if len(records) != 0 && mapID == records[len(records)-1].MapID {
632 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score) 691 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score)
@@ -639,18 +698,35 @@ func FetchUser(c *gin.Context) {
639 MapID: mapID, 698 MapID: mapID,
640 MapName: mapName, 699 MapName: mapName,
641 MapWRCount: mapWR, 700 MapWRCount: mapWR,
701 Placement: placements[placementIndex],
642 Scores: []ProfileScores{}, 702 Scores: []ProfileScores{},
643 }) 703 })
704 placementIndex++
644 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score) 705 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score)
645 } 706 }
646 // Get multiplayer records 707 // Get multiplayer records
647 sql = `SELECT m.game_id, m.chapter_id, mp.map_id, m."name", (SELECT mr.score_count FROM map_routes mr WHERE mr.map_id = mp.map_id ORDER BY mr.score_count ASC LIMIT 1) AS wr_count, mp.score_count, mp.score_time, CASE WHEN host_id = $1 THEN mp.host_demo_id WHEN partner_id = $1 THEN mp.partner_demo_id END demo_id, mp.record_date 708 sql = `SELECT mp.id, m.game_id, m.chapter_id, mp.map_id, m."name", (SELECT mr.score_count FROM map_routes mr WHERE mr.map_id = mp.map_id ORDER BY mr.score_count ASC LIMIT 1) AS wr_count, mp.score_count, mp.score_time, CASE WHEN host_id = $1 THEN mp.host_demo_id WHEN partner_id = $1 THEN mp.partner_demo_id END demo_id, mp.record_date
648 FROM records_mp mp INNER JOIN maps m ON mp.map_id = m.id WHERE mp.host_id = $1 OR mp.partner_id = $1 ORDER BY mp.map_id, mp.score_count, mp.score_time;` 709 FROM records_mp mp INNER JOIN maps m ON mp.map_id = m.id WHERE mp.host_id = $1 OR mp.partner_id = $1 ORDER BY mp.map_id, mp.score_count, mp.score_time`
649 rows, err = database.DB.Query(sql, user.SteamID) 710 rows, err = database.DB.Query(sql, user.SteamID)
650 if err != nil { 711 if err != nil {
651 c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) 712 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
652 return 713 return
653 } 714 }
715 sql = `WITH map_records AS (SELECT mp.host_id, mp.partner_id, mp.map_id,
716 RANK() OVER (PARTITION BY mp.map_id ORDER BY mp.score_count, mp.score_time) AS placement
717 FROM records_mp mp) SELECT DISTINCT ON (map_id) placement FROM map_records WHERE host_id = $1 OR partner_id = $1`
718 placementsRows, err = database.DB.Query(sql, user.SteamID)
719 if err != nil {
720 c.JSON(http.StatusOK, models.ErrorResponse(err.Error()))
721 return
722 }
723 placements = []int{}
724 placementIndex = 0
725 for placementsRows.Next() {
726 var placement int
727 placementsRows.Scan(&placement)
728 placements = append(placements, placement)
729 }
654 for rows.Next() { 730 for rows.Next() {
655 var gameID int 731 var gameID int
656 var categoryID int 732 var categoryID int
@@ -658,7 +734,7 @@ func FetchUser(c *gin.Context) {
658 var mapName string 734 var mapName string
659 var mapWR int 735 var mapWR int
660 score := ProfileScores{} 736 score := ProfileScores{}
661 rows.Scan(&gameID, &categoryID, &mapID, &mapName, &mapWR, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date) 737 rows.Scan(&score.RecordID, &gameID, &categoryID, &mapID, &mapName, &mapWR, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date)
662 // More than one record in one map 738 // More than one record in one map
663 if len(records) != 0 && mapID == records[len(records)-1].MapID { 739 if len(records) != 0 && mapID == records[len(records)-1].MapID {
664 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score) 740 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score)
@@ -671,8 +747,10 @@ func FetchUser(c *gin.Context) {
671 MapID: mapID, 747 MapID: mapID,
672 MapName: mapName, 748 MapName: mapName,
673 MapWRCount: mapWR, 749 MapWRCount: mapWR,
750 Placement: placements[placementIndex],
674 Scores: []ProfileScores{}, 751 Scores: []ProfileScores{},
675 }) 752 })
753 placementIndex++
676 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score) 754 records[len(records)-1].Scores = append(records[len(records)-1].Scores, score)
677 } 755 }
678 c.JSON(http.StatusOK, models.Response{ 756 c.JSON(http.StatusOK, models.Response{