diff --git a/server/handlers/admin.go b/server/handlers/admin.go index e888199..34be56f 100644 --- a/server/handlers/admin.go +++ b/server/handlers/admin.go @@ -17,6 +17,7 @@ import ( "github.com/synctv-org/synctv/internal/settings" "github.com/synctv-org/synctv/internal/vendor" "github.com/synctv-org/synctv/server/model" + "github.com/synctv-org/synctv/utils" "golang.org/x/exp/maps" "google.golang.org/grpc/connectivity" "gorm.io/gorm" @@ -97,7 +98,7 @@ func AdminSettings(ctx *gin.Context) { func Users(ctx *gin.Context) { // user := ctx.MustGet("user").(*op.User) - page, pageSize, err := GetPageAndPageSize(ctx) + page, pageSize, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -176,7 +177,7 @@ func GetRoomUsers(ctx *gin.Context) { return } - page, pageSize, err := GetPageAndPageSize(ctx) + page, pageSize, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -331,7 +332,7 @@ func UnBanUser(ctx *gin.Context) { func Rooms(ctx *gin.Context) { // user := ctx.MustGet("user").(*op.User) - page, pageSize, err := GetPageAndPageSize(ctx) + page, pageSize, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -396,7 +397,7 @@ func GetUserRooms(ctx *gin.Context) { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("user id error")) return } - page, pageSize, err := GetPageAndPageSize(ctx) + page, pageSize, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -712,7 +713,7 @@ func AdminGetVendorBackends(ctx *gin.Context) { // user := ctx.MustGet("user").(*op.User) conns := vendor.LoadConns() - page, size, err := GetPageAndPageSize(ctx) + page, size, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return diff --git a/server/handlers/movie.go b/server/handlers/movie.go index 8cadc17..2ec9b29 100644 --- a/server/handlers/movie.go +++ b/server/handlers/movie.go @@ -30,20 +30,8 @@ import ( "golang.org/x/exp/maps" ) -func GetPageAndPageSize(ctx *gin.Context) (int, int, error) { - pageSize, err := strconv.Atoi(ctx.DefaultQuery("max", "10")) - if err != nil { - return 0, 0, errors.New("max must be a number") - } - page, err := strconv.Atoi(ctx.DefaultQuery("page", "1")) - if err != nil { - return 0, 0, errors.New("page must be a number") - } - return page, pageSize, nil -} - func GetPageItems[T any](ctx *gin.Context, items []T) ([]T, error) { - page, max, err := GetPageAndPageSize(ctx) + page, max, err := utils.GetPageAndMax(ctx) if err != nil { return nil, err } @@ -55,7 +43,7 @@ func MovieList(ctx *gin.Context) { room := ctx.MustGet("room").(*op.Room) user := ctx.MustGet("user").(*op.User) - page, max, err := GetPageAndPageSize(ctx) + page, max, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -147,7 +135,7 @@ func Movies(ctx *gin.Context) { room := ctx.MustGet("room").(*op.Room) user := ctx.MustGet("user").(*op.User) - page, max, err := GetPageAndPageSize(ctx) + page, max, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return diff --git a/server/handlers/room.go b/server/handlers/room.go index 7409ac0..dfc98ce 100644 --- a/server/handlers/room.go +++ b/server/handlers/room.go @@ -104,7 +104,7 @@ var roomHotCache = refreshcache.NewRefreshCache[[]*model.RoomListResp](func(cont }, time.Second*3) func RoomHotList(ctx *gin.Context) { - page, pageSize, err := GetPageAndPageSize(ctx) + page, pageSize, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -123,7 +123,7 @@ func RoomHotList(ctx *gin.Context) { } func RoomList(ctx *gin.Context) { - page, pageSize, err := GetPageAndPageSize(ctx) + page, pageSize, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return @@ -320,7 +320,7 @@ func SetRoomSetting(ctx *gin.Context) { func RoomUsers(ctx *gin.Context) { room := ctx.MustGet("room").(*op.Room) - page, pageSize, err := GetPageAndPageSize(ctx) + page, pageSize, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return diff --git a/server/handlers/user.go b/server/handlers/user.go index b06ac4f..2333519 100644 --- a/server/handlers/user.go +++ b/server/handlers/user.go @@ -11,6 +11,7 @@ import ( "github.com/synctv-org/synctv/internal/provider/providers" "github.com/synctv-org/synctv/server/middlewares" "github.com/synctv-org/synctv/server/model" + "github.com/synctv-org/synctv/utils" "gorm.io/gorm" ) @@ -73,7 +74,7 @@ func LogoutUser(ctx *gin.Context) { func UserRooms(ctx *gin.Context) { user := ctx.MustGet("user").(*op.User) - page, pageSize, err := GetPageAndPageSize(ctx) + page, pageSize, err := utils.GetPageAndMax(ctx) if err != nil { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) return diff --git a/server/handlers/vendors/vendorAlist/list.go b/server/handlers/vendors/vendorAlist/list.go index 1269f19..4187f1e 100644 --- a/server/handlers/vendors/vendorAlist/list.go +++ b/server/handlers/vendors/vendorAlist/list.go @@ -13,6 +13,7 @@ import ( "github.com/synctv-org/synctv/internal/op" "github.com/synctv-org/synctv/internal/vendor" "github.com/synctv-org/synctv/server/model" + "github.com/synctv-org/synctv/utils" "github.com/synctv-org/vendors/api/alist" ) @@ -58,6 +59,12 @@ func List(ctx *gin.Context) { return } + page, size, err := utils.GetPageAndMax(ctx) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + return + } + var cli = vendor.LoadAlistClient(ctx.Query("backend")) data, err := cli.FsList(ctx, &alist.FsListReq{ Token: aucd.Token, @@ -65,9 +72,11 @@ func List(ctx *gin.Context) { Path: req.Path, Host: aucd.Host, Refresh: req.Refresh, + Page: uint64(page), + PerPage: uint64(size), }) if err != nil { - ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return } diff --git a/server/handlers/vendors/vendorEmby/list.go b/server/handlers/vendors/vendorEmby/list.go index b1498ba..ae8177f 100644 --- a/server/handlers/vendors/vendorEmby/list.go +++ b/server/handlers/vendors/vendorEmby/list.go @@ -8,6 +8,7 @@ import ( "github.com/synctv-org/synctv/internal/op" "github.com/synctv-org/synctv/internal/vendor" "github.com/synctv-org/synctv/server/model" + "github.com/synctv-org/synctv/utils" "github.com/synctv-org/vendors/api/emby" ) @@ -41,14 +42,22 @@ func List(ctx *gin.Context) { return } + page, size, err := utils.GetPageAndMax(ctx) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + return + } + cli := vendor.LoadEmbyClient(ctx.Query("backend")) data, err := cli.FsList(ctx, &emby.FsListReq{ - Host: aucd.Host, - Path: req.Path, - Token: aucd.ApiKey, + Host: aucd.Host, + Path: req.Path, + Token: aucd.ApiKey, + Limit: uint64(size), + StartIndex: uint64((page - 1) * size), }) if err != nil { - ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) + ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) return } diff --git a/utils/utils.go b/utils/utils.go index 39a0a74..98a60ea 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -2,6 +2,7 @@ package utils import ( "encoding/hex" + "errors" "fmt" "math/rand" "net" @@ -14,6 +15,7 @@ import ( "sync" "sync/atomic" + "github.com/gin-gonic/gin" "github.com/google/uuid" "github.com/synctv-org/synctv/cmd/flags" "github.com/zijiren233/go-colorable" @@ -359,3 +361,23 @@ func ForceColor() bool { }) return needColor } + +func GetPageAndMax(ctx *gin.Context) (page int, max int, err error) { + max, err = strconv.Atoi(ctx.DefaultQuery("max", "10")) + if err != nil { + return 0, 0, errors.New("max must be a number") + } + page, err = strconv.Atoi(ctx.DefaultQuery("page", "1")) + if err != nil { + return 0, 0, errors.New("page must be a number") + } + if page <= 0 { + page = 1 + } + if max <= 0 { + max = 10 + } else if max > 100 { + max = 100 + } + return +}