diff --git a/backend/controllers/frame.go b/backend/controllers/frame.go index 254d133..aef2730 100644 --- a/backend/controllers/frame.go +++ b/backend/controllers/frame.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "math" "net/http" "strconv" @@ -18,7 +19,33 @@ func ListFrame(writer http.ResponseWriter, request *http.Request, params httprou var frame []models.Frame - result := gdb.Model(&models.Frame{}).Order("ID asc").Find(&frame) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.Frame{}).Order("ID asc").Limit(limit).Offset(offset).Find(&frame) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/game.go b/backend/controllers/game.go index dd94eb1..c41cfb3 100644 --- a/backend/controllers/game.go +++ b/backend/controllers/game.go @@ -4,6 +4,7 @@ import ( "compress/gzip" "encoding/base64" "encoding/json" + "math" "net/http" "strconv" @@ -20,7 +21,33 @@ func ListGame(writer http.ResponseWriter, request *http.Request, params httprout var games []models.Game - result := gdb.Model(&models.Game{}).Order("ID asc").Find(&games) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.Game{}).Order("ID asc").Limit(limit).Offset(offset).Find(&games) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/godot_version.go b/backend/controllers/godot_version.go index 5741d7b..9c5e9c7 100644 --- a/backend/controllers/godot_version.go +++ b/backend/controllers/godot_version.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "math" "net/http" "strconv" @@ -18,7 +19,33 @@ func ListGodotVersion(writer http.ResponseWriter, request *http.Request, params var godotVersion []models.GodotVersion - result := gdb.Model(&models.GodotVersion{}).Order("ID asc").Find(&godotVersion) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.GodotVersion{}).Order("ID asc").Limit(limit).Offset(offset).Find(&godotVersion) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/level.go b/backend/controllers/level.go index ace1af9..52bdf2c 100644 --- a/backend/controllers/level.go +++ b/backend/controllers/level.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "math" "net/http" "strconv" @@ -18,7 +19,33 @@ func ListLevel(writer http.ResponseWriter, request *http.Request, params httprou var level []models.Level - result := gdb.Model(&models.Level{}).Order("ID asc").Find(&level) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.Level{}).Order("ID asc").Limit(limit).Offset(offset).Find(&level) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/object.go b/backend/controllers/object.go index 485e1af..69f746b 100644 --- a/backend/controllers/object.go +++ b/backend/controllers/object.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "math" "net/http" "strconv" @@ -18,7 +19,33 @@ func ListObject(writer http.ResponseWriter, request *http.Request, params httpro var object []models.Object - result := gdb.Model(&models.Object{}).Order("ID asc").Find(&object) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.Object{}).Order("ID asc").Limit(limit).Offset(offset).Find(&object) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/object_name.go b/backend/controllers/object_name.go index c525bd7..b767147 100644 --- a/backend/controllers/object_name.go +++ b/backend/controllers/object_name.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "math" "net/http" "strconv" @@ -18,7 +19,33 @@ func ListObjectName(writer http.ResponseWriter, request *http.Request, params ht var objectName []models.ObjectName - result := gdb.Model(&models.ObjectName{}).Order("ID asc").Find(&objectName) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.ObjectName{}).Order("ID asc").Limit(limit).Offset(offset).Find(&objectName) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/object_state.go b/backend/controllers/object_state.go index 3ce4d26..d42ce65 100644 --- a/backend/controllers/object_state.go +++ b/backend/controllers/object_state.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "math" "net/http" "strconv" @@ -18,7 +19,33 @@ func ListObjectState(writer http.ResponseWriter, request *http.Request, params h var objectState []models.ObjectState - result := gdb.Model(&models.ObjectState{}).Order("ID asc").Find(&objectState) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.ObjectState{}).Order("ID asc").Limit(limit).Offset(offset).Find(&objectState) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/os.go b/backend/controllers/os.go index 71ae808..64ed4a3 100644 --- a/backend/controllers/os.go +++ b/backend/controllers/os.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "math" "net/http" "strconv" @@ -18,7 +19,33 @@ func ListOS(writer http.ResponseWriter, request *http.Request, params httprouter var os []models.OS - result := gdb.Model(&models.OS{}).Order("ID asc").Find(&os) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.OS{}).Order("ID asc").Limit(limit).Offset(offset).Find(&os) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/player.go b/backend/controllers/player.go index e1a5b8b..6288559 100644 --- a/backend/controllers/player.go +++ b/backend/controllers/player.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "math" "net/http" "strconv" @@ -18,7 +19,33 @@ func ListPlayer(writer http.ResponseWriter, request *http.Request, params httpro var player []models.Player - result := gdb.Model(&models.Player{}).Order("ID asc").Find(&player) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.Player{}).Order("ID asc").Limit(limit).Offset(offset).Find(&player) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return diff --git a/backend/controllers/user.go b/backend/controllers/user.go index 489a874..d0e9418 100644 --- a/backend/controllers/user.go +++ b/backend/controllers/user.go @@ -3,6 +3,7 @@ package controllers import ( "encoding/json" "errors" + "math" "net/http" "strconv" @@ -71,7 +72,33 @@ func ListUser(writer http.ResponseWriter, request *http.Request, params httprout var users []models.User - result := gdb.Model(&models.User{}).Order("ID asc").Find(&users) + queryParams := request.URL.Query() + + limit := 50 + if queryParams.Get("limit") != "" { + var err error + limit, err = strconv.Atoi(queryParams.Get("limit")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + limit = int(math.Min(float64(500), float64(limit))) + limit = int(math.Max(float64(1), float64(limit))) + } + + offset := 0 + if queryParams.Get("offset") != "" { + var err error + offset, err = strconv.Atoi(queryParams.Get("offset")) + if err != nil { + utils.JSONErrorOutput(writer, http.StatusBadRequest, err.Error()) + return + } + offset = int(math.Min(float64(9223372036854775807), float64(offset))) + offset = int(math.Max(float64(0), float64(offset))) + } + + result := gdb.Model(&models.User{}).Order("ID asc").Limit(limit).Offset(offset).Find(&users) if result.Error != nil { utils.JSONErrorOutput(writer, http.StatusBadRequest, result.Error.Error()) return