194 lines
5.9 KiB
Go
194 lines
5.9 KiB
Go
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
|
||
},
|
||
)
|
||
}
|