aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/go.mod1
-rw-r--r--backend/go.sum2
-rw-r--r--backend/handlers/user.go40
-rw-r--r--backend/main.go28
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
10require ( 10require (
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
31github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 31github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
32github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= 32github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
33github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= 33github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
34github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
35github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E=
34github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= 36github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
35github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= 37github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
36github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 38github.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}