diff options
| -rw-r--r-- | backend/database/history.sql | 1 | ||||
| -rw-r--r-- | backend/database/route.sql | 1 | ||||
| -rw-r--r-- | backend/handlers/user.go | 102 |
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 | ||
| 46 | type ProfileScores struct { | 47 | type 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{ |