JCS-pub/client/internal/http/package.go

194 lines
5.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package http
import (
"mime/multipart"
"net/http"
"github.com/gin-gonic/gin"
"gitlink.org.cn/cloudream/common/consts/errorcode"
"gitlink.org.cn/cloudream/common/pkgs/iterator"
"gitlink.org.cn/cloudream/common/pkgs/logger"
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
stgiter "gitlink.org.cn/cloudream/storage/common/pkgs/iterator"
)
// PackageService 包服务负责处理包相关的HTTP请求。
type PackageService struct {
*Server
}
// Package 返回PackageService的实例。
func (s *Server) Package() *PackageService {
return &PackageService{
Server: s,
}
}
// PackageGetReq 包含获取包信息请求所需的参数。
type PackageGetReq struct {
UserID *cdssdk.UserID `form:"userID" binding:"required"`
PackageID *cdssdk.PackageID `form:"packageID" binding:"required"`
}
// PackageGetResp 包含获取包信息响应的结果。
type PackageGetResp struct {
model.Package
}
// Get 处理获取包信息的HTTP请求。
func (s *PackageService) Get(ctx *gin.Context) {
log := logger.WithField("HTTP", "Package.Get")
var req PackageGetReq
if err := ctx.ShouldBindQuery(&req); err != nil {
log.Warnf("binding body: %s", err.Error())
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
return
}
pkg, err := s.svc.PackageSvc().Get(*req.UserID, *req.PackageID)
if err != nil {
log.Warnf("getting package: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package failed"))
return
}
ctx.JSON(http.StatusOK, OK(PackageGetResp{Package: *pkg}))
}
// Create 处理创建新包的HTTP请求。
func (s *PackageService) Create(ctx *gin.Context) {
log := logger.WithField("HTTP", "Package.Create")
var req cdssdk.PackageCreateReq
if err := ctx.ShouldBindJSON(&req); err != nil {
log.Warnf("binding body: %s", err.Error())
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
return
}
pkgID, err := s.svc.PackageSvc().Create(req.UserID, req.BucketID, req.Name)
if err != nil {
log.Warnf("creating package: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "create package failed"))
return
}
ctx.JSON(http.StatusOK, OK(cdssdk.PackageCreateResp{
PackageID: pkgID,
}))
}
// PackageDeleteReq 包含删除包请求所需的参数。
type PackageDeleteReq struct {
UserID *cdssdk.UserID `json:"userID" binding:"required"`
PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
}
// Delete 处理删除包的HTTP请求。
func (s *PackageService) Delete(ctx *gin.Context) {
log := logger.WithField("HTTP", "Package.Delete")
var req PackageDeleteReq
if err := ctx.ShouldBindJSON(&req); err != nil {
log.Warnf("binding body: %s", err.Error())
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
return
}
err := s.svc.PackageSvc().DeletePackage(*req.UserID, *req.PackageID)
if err != nil {
log.Warnf("deleting package: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "delete package failed"))
return
}
ctx.JSON(http.StatusOK, OK(nil))
}
// GetCachedNodesReq 包含获取缓存节点请求所需的参数。
type GetCachedNodesReq struct {
UserID *cdssdk.UserID `json:"userID" binding:"required"`
PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
}
// GetCachedNodesResp 包含获取缓存节点响应的结果。
type GetCachedNodesResp struct {
cdssdk.PackageCachingInfo
}
// GetCachedNodes 处理获取包的缓存节点的HTTP请求。
func (s *PackageService) GetCachedNodes(ctx *gin.Context) {
log := logger.WithField("HTTP", "Package.GetCachedNodes")
var req GetCachedNodesReq
if err := ctx.ShouldBindJSON(&req); err != nil {
log.Warnf("binding body: %s", err.Error())
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
return
}
resp, err := s.svc.PackageSvc().GetCachedNodes(*req.UserID, *req.PackageID)
if err != nil {
log.Warnf("get package cached nodes failed: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package cached nodes failed"))
return
}
ctx.JSON(http.StatusOK, OK(GetCachedNodesResp{resp}))
}
// GetLoadedNodesReq 包含获取加载节点请求所需的参数。
type GetLoadedNodesReq struct {
UserID *cdssdk.UserID `json:"userID" binding:"required"`
PackageID *cdssdk.PackageID `json:"packageID" binding:"required"`
}
// GetLoadedNodesResp 包含获取加载节点响应的结果。
type GetLoadedNodesResp struct {
NodeIDs []cdssdk.NodeID `json:"nodeIDs"`
}
// GetLoadedNodes 处理获取包的加载节点的HTTP请求。
func (s *PackageService) GetLoadedNodes(ctx *gin.Context) {
log := logger.WithField("HTTP", "Package.GetLoadedNodes")
var req GetLoadedNodesReq
if err := ctx.ShouldBindJSON(&req); err != nil {
log.Warnf("binding body: %s", err.Error())
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
return
}
nodeIDs, err := s.svc.PackageSvc().GetLoadedNodes(*req.UserID, *req.PackageID)
if err != nil {
log.Warnf("get package loaded nodes failed: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get package loaded nodes failed"))
return
}
ctx.JSON(http.StatusOK, OK(GetLoadedNodesResp{
NodeIDs: nodeIDs,
}))
}
// mapMultiPartFileToUploadingObject 将multipart文件转换为上传对象的迭代器。
func mapMultiPartFileToUploadingObject(files []*multipart.FileHeader) stgiter.UploadingObjectIterator {
return iterator.Map[*multipart.FileHeader](
iterator.Array(files...),
func(file *multipart.FileHeader) (*stgiter.IterUploadingObject, error) {
stream, err := file.Open()
if err != nil {
return nil, err
}
return &stgiter.IterUploadingObject{
Path: file.Filename,
Size: file.Size,
File: stream,
}, nil
},
)
}