diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2024-10-19 16:28:00 +0300 |
|---|---|---|
| committer | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2024-10-19 16:28:00 +0300 |
| commit | be5313fa0092688cea04f7f1f115574765847c22 (patch) | |
| tree | d3760749ffb6942577afe92182f6fdbd3aa89d4b /backend | |
| parent | backend: optimize create record (diff) | |
| download | lphub-be5313fa0092688cea04f7f1f115574765847c22.tar.gz lphub-be5313fa0092688cea04f7f1f115574765847c22.tar.bz2 lphub-be5313fa0092688cea04f7f1f115574765847c22.zip | |
backend: fix run ranks
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/go.mod | 1 | ||||
| -rw-r--r-- | backend/go.sum | 2 | ||||
| -rw-r--r-- | backend/handlers/user.go | 40 | ||||
| -rw-r--r-- | backend/main.go | 28 |
4 files changed, 42 insertions, 29 deletions
diff --git a/backend/go.mod b/backend/go.mod index f6eef48..ae50685 100644 --- a/backend/go.mod +++ b/backend/go.mod | |||
| @@ -8,6 +8,7 @@ require ( | |||
| 8 | ) | 8 | ) |
| 9 | 9 | ||
| 10 | require ( | 10 | require ( |
| 11 | github.com/gin-contrib/cors v1.7.2 | ||
| 11 | github.com/golang-jwt/jwt/v4 v4.5.0 | 12 | github.com/golang-jwt/jwt/v4 v4.5.0 |
| 12 | github.com/google/uuid v1.6.0 | 13 | github.com/google/uuid v1.6.0 |
| 13 | github.com/pektezol/steam_go v1.1.2 | 14 | github.com/pektezol/steam_go v1.1.2 |
diff --git a/backend/go.sum b/backend/go.sum index 10504e4..f117b31 100644 --- a/backend/go.sum +++ b/backend/go.sum | |||
| @@ -31,6 +31,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 | |||
| 31 | github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= | 31 | github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= |
| 32 | github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= | 32 | github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= |
| 33 | github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= | 33 | github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= |
| 34 | github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw= | ||
| 35 | github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E= | ||
| 34 | github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= | 36 | github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= |
| 35 | github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= | 37 | github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= |
| 36 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= | 38 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= |
diff --git a/backend/handlers/user.go b/backend/handlers/user.go index 908063f..17a7819 100644 --- a/backend/handlers/user.go +++ b/backend/handlers/user.go | |||
| @@ -301,10 +301,12 @@ func Profile(c *gin.Context) { | |||
| 301 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 301 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| 302 | return | 302 | return |
| 303 | } | 303 | } |
| 304 | sql = `WITH best_scores AS (SELECT sp.user_id, sp.map_id, MIN(sp.score_count) AS best_score_count, MIN(sp.score_time) AS best_score_time | 304 | sql = `WITH best_scores AS (WITH RankedScores AS (SELECT sp.user_id, sp.map_id, sp.score_count, sp.score_time, ROW_NUMBER() OVER ( |
| 305 | FROM records_sp sp WHERE sp.is_deleted = false GROUP BY sp.user_id, sp.map_id) | 305 | PARTITION BY sp.user_id, sp.map_id ORDER BY sp.score_count ASC, sp.score_time ASC) AS rank FROM records_sp sp WHERE sp.is_deleted = false) |
| 306 | SELECT (SELECT COUNT(*) + 1 FROM best_scores AS inner_scores WHERE inner_scores.map_id = bs.map_id AND (inner_scores.best_score_count < bs.best_score_count OR (inner_scores.best_score_count = bs.best_score_count AND inner_scores.best_score_time < bs.best_score_time))) AS placement | 306 | SELECT user_id, map_id, score_count AS best_score_count, score_time AS best_score_time FROM RankedScores WHERE rank = 1) |
| 307 | FROM best_scores AS bs WHERE bs.user_id = $1 ORDER BY map_id, placement` | 307 | SELECT (SELECT COUNT(*) + 1 FROM best_scores AS inner_scores WHERE inner_scores.map_id = bs.map_id |
| 308 | AND (inner_scores.best_score_count < bs.best_score_count OR (inner_scores.best_score_count = bs.best_score_count | ||
| 309 | AND inner_scores.best_score_time < bs.best_score_time))) AS placement FROM best_scores AS bs WHERE bs.user_id = $1 ORDER BY map_id, placement` | ||
| 308 | placementsRows, err := database.DB.Query(sql, user.(models.User).SteamID) | 310 | placementsRows, err := database.DB.Query(sql, user.(models.User).SteamID) |
| 309 | if err != nil { | 311 | if err != nil { |
| 310 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 312 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| @@ -355,10 +357,12 @@ func Profile(c *gin.Context) { | |||
| 355 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 357 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| 356 | return | 358 | return |
| 357 | } | 359 | } |
| 358 | sql = `WITH best_scores AS (SELECT mp.host_id, mp.partner_id, mp.map_id, MIN(mp.score_count) AS best_score_count, MIN(mp.score_time) AS best_score_time | 360 | sql = `WITH best_scores AS (WITH RankedScores AS (SELECT mp.host_id, mp.partner_id, mp.map_id, mp.score_count, mp.score_time, ROW_NUMBER() OVER ( |
| 359 | FROM records_mp mp WHERE mp.is_deleted = false GROUP BY mp.host_id, mp.partner_id, mp.map_id) | 361 | PARTITION BY mp.host_id, mp.partner_id, mp.map_id ORDER BY mp.score_count ASC, mp.score_time ASC) AS rank FROM records_mp mp WHERE mp.is_deleted = false) |
| 360 | SELECT (SELECT COUNT(*) + 1 FROM best_scores AS inner_scores WHERE inner_scores.map_id = bs.map_id AND (inner_scores.best_score_count < bs.best_score_count OR (inner_scores.best_score_count = bs.best_score_count AND inner_scores.best_score_time < bs.best_score_time))) AS placement | 362 | SELECT host_id, partner_id, map_id, score_count AS best_score_count, score_time AS best_score_time FROM RankedScores WHERE rank = 1) |
| 361 | FROM best_scores AS bs WHERE bs.host_id = $1 or bs.partner_id = $1 ORDER BY map_id, placement` | 363 | SELECT (SELECT COUNT(*) + 1 FROM best_scores AS inner_scores WHERE inner_scores.map_id = bs.map_id |
| 364 | AND (inner_scores.best_score_count < bs.best_score_count OR (inner_scores.best_score_count = bs.best_score_count | ||
| 365 | AND inner_scores.best_score_time < bs.best_score_time))) AS placement FROM best_scores AS bs WHERE bs.host_id = $1 or bs.partner_id = $1 ORDER BY map_id, placement` | ||
| 362 | placementsRows, err = database.DB.Query(sql, user.(models.User).SteamID) | 366 | placementsRows, err = database.DB.Query(sql, user.(models.User).SteamID) |
| 363 | if err != nil { | 367 | if err != nil { |
| 364 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 368 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| @@ -675,10 +679,12 @@ func FetchUser(c *gin.Context) { | |||
| 675 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 679 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| 676 | return | 680 | return |
| 677 | } | 681 | } |
| 678 | sql = `WITH best_scores AS (SELECT sp.user_id, sp.map_id, MIN(sp.score_count) AS best_score_count, MIN(sp.score_time) AS best_score_time | 682 | sql = `WITH best_scores AS (WITH RankedScores AS (SELECT sp.user_id, sp.map_id, sp.score_count, sp.score_time, ROW_NUMBER() OVER ( |
| 679 | FROM records_sp sp WHERE sp.is_deleted = false GROUP BY sp.user_id, sp.map_id) | 683 | PARTITION BY sp.user_id, sp.map_id ORDER BY sp.score_count ASC, sp.score_time ASC) AS rank FROM records_sp sp WHERE sp.is_deleted = false) |
| 680 | SELECT (SELECT COUNT(*) + 1 FROM best_scores AS inner_scores WHERE inner_scores.map_id = bs.map_id AND (inner_scores.best_score_count < bs.best_score_count OR (inner_scores.best_score_count = bs.best_score_count AND inner_scores.best_score_time < bs.best_score_time))) AS placement | 684 | SELECT user_id, map_id, score_count AS best_score_count, score_time AS best_score_time FROM RankedScores WHERE rank = 1) |
| 681 | FROM best_scores AS bs WHERE bs.user_id = $1 ORDER BY map_id, placement` | 685 | SELECT (SELECT COUNT(*) + 1 FROM best_scores AS inner_scores WHERE inner_scores.map_id = bs.map_id |
| 686 | AND (inner_scores.best_score_count < bs.best_score_count OR (inner_scores.best_score_count = bs.best_score_count | ||
| 687 | AND inner_scores.best_score_time < bs.best_score_time))) AS placement FROM best_scores AS bs WHERE bs.user_id = $1 ORDER BY map_id, placement` | ||
| 682 | placementsRows, err := database.DB.Query(sql, user.SteamID) | 688 | placementsRows, err := database.DB.Query(sql, user.SteamID) |
| 683 | if err != nil { | 689 | if err != nil { |
| 684 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 690 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| @@ -729,10 +735,12 @@ func FetchUser(c *gin.Context) { | |||
| 729 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 735 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
| 730 | return | 736 | return |
| 731 | } | 737 | } |
| 732 | sql = `WITH best_scores AS (SELECT mp.host_id, mp.partner_id, mp.map_id, MIN(mp.score_count) AS best_score_count, MIN(mp.score_time) AS best_score_time | 738 | sql = `WITH best_scores AS (WITH RankedScores AS (SELECT mp.host_id, mp.partner_id, mp.map_id, mp.score_count, mp.score_time, ROW_NUMBER() OVER ( |
| 733 | FROM records_mp mp WHERE mp.is_deleted = false GROUP BY mp.host_id, mp.partner_id, mp.map_id) | 739 | PARTITION BY mp.host_id, mp.partner_id, mp.map_id ORDER BY mp.score_count ASC, mp.score_time ASC) AS rank FROM records_mp mp WHERE mp.is_deleted = false) |
| 734 | SELECT (SELECT COUNT(*) + 1 FROM best_scores AS inner_scores WHERE inner_scores.map_id = bs.map_id AND (inner_scores.best_score_count < bs.best_score_count OR (inner_scores.best_score_count = bs.best_score_count AND inner_scores.best_score_time < bs.best_score_time))) AS placement | 740 | SELECT host_id, partner_id, map_id, score_count AS best_score_count, score_time AS best_score_time FROM RankedScores WHERE rank = 1) |
| 735 | FROM best_scores AS bs WHERE bs.host_id = $1 or bs.partner_id = $1 ORDER BY map_id, placement` | 741 | SELECT (SELECT COUNT(*) + 1 FROM best_scores AS inner_scores WHERE inner_scores.map_id = bs.map_id |
| 742 | AND (inner_scores.best_score_count < bs.best_score_count OR (inner_scores.best_score_count = bs.best_score_count | ||
| 743 | AND inner_scores.best_score_time < bs.best_score_time))) AS placement FROM best_scores AS bs WHERE bs.host_id = $1 or bs.partner_id = $1 ORDER BY map_id, placement` | ||
| 736 | placementsRows, err = database.DB.Query(sql, user.SteamID) | 744 | placementsRows, err = database.DB.Query(sql, user.SteamID) |
| 737 | if err != nil { | 745 | if err != nil { |
| 738 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) | 746 | c.JSON(http.StatusOK, models.ErrorResponse(err.Error())) |
diff --git a/backend/main.go b/backend/main.go index a50be7e..6499b51 100644 --- a/backend/main.go +++ b/backend/main.go | |||
| @@ -4,11 +4,13 @@ import ( | |||
| 4 | "fmt" | 4 | "fmt" |
| 5 | "log" | 5 | "log" |
| 6 | "os" | 6 | "os" |
| 7 | "time" | ||
| 7 | 8 | ||
| 8 | "lphub/api" | 9 | "lphub/api" |
| 9 | "lphub/database" | 10 | "lphub/database" |
| 10 | _ "lphub/docs" | 11 | _ "lphub/docs" |
| 11 | 12 | ||
| 13 | "github.com/gin-contrib/cors" | ||
| 12 | "github.com/gin-gonic/gin" | 14 | "github.com/gin-gonic/gin" |
| 13 | "github.com/joho/godotenv" | 15 | "github.com/joho/godotenv" |
| 14 | ) | 16 | ) |
| @@ -34,19 +36,19 @@ func main() { | |||
| 34 | database.ConnectDB() | 36 | database.ConnectDB() |
| 35 | api.InitRoutes(router) | 37 | api.InitRoutes(router) |
| 36 | // for debugging | 38 | // for debugging |
| 37 | // router.Use(cors.New(cors.Config{ | 39 | router.Use(cors.New(cors.Config{ |
| 38 | // AllowOrigins: []string{"*"}, | 40 | AllowOrigins: []string{"*"}, |
| 39 | // AllowMethods: []string{"GET", "POST", "DELETE", "PUT", "PATCH"}, | 41 | AllowMethods: []string{"GET", "POST", "DELETE", "PUT", "PATCH"}, |
| 40 | // AllowHeaders: []string{"Origin"}, | 42 | AllowHeaders: []string{"Origin"}, |
| 41 | // ExposeHeaders: []string{"Content-Length"}, | 43 | ExposeHeaders: []string{"Content-Length"}, |
| 42 | // AllowCredentials: true, | 44 | AllowCredentials: true, |
| 43 | // MaxAge: 12 * time.Hour, | 45 | MaxAge: 12 * time.Hour, |
| 44 | // })) | 46 | })) |
| 45 | // router.Static("/static", "../frontend/build/static") | 47 | router.Static("/static", "../frontend/build/static") |
| 46 | // router.StaticFile("/", "../frontend/build/index.html") | 48 | router.StaticFile("/", "../frontend/build/index.html") |
| 47 | // router.NoRoute(func(c *gin.Context) { | 49 | router.NoRoute(func(c *gin.Context) { |
| 48 | // c.File("../frontend/build/index.html") | 50 | c.File("../frontend/build/index.html") |
| 49 | // }) | 51 | }) |
| 50 | router.MaxMultipartMemory = 200 << 20 // 200 mb limit for demos | 52 | router.MaxMultipartMemory = 200 << 20 // 200 mb limit for demos |
| 51 | router.Run(fmt.Sprintf(":%s", os.Getenv("PORT"))) | 53 | router.Run(fmt.Sprintf(":%s", os.Getenv("PORT"))) |
| 52 | } | 54 | } |