JCS-pub/client/internal/http/v1/pub_shards.go

113 lines
3.2 KiB
Go

package http
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"gitlink.org.cn/cloudream/common/pkgs/logger"
"gitlink.org.cn/cloudream/jcs-pub/client/internal/http/types"
cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1"
"gitlink.org.cn/cloudream/jcs-pub/common/ecode"
stgglb "gitlink.org.cn/cloudream/jcs-pub/common/globals"
corrpc "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/rpc/coordinator"
jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
)
type PubShardsService struct {
*Server
}
func (s *Server) PubShards() *PubShardsService {
return &PubShardsService{s}
}
func (s *PubShardsService) Create(ctx *gin.Context) {
log := logger.WithField("HTTP", "PubShards.Create")
req, err := types.ShouldBindJSONEx[cliapi.PubShardsCreate](ctx)
if err != nil {
log.Warnf("binding body: %s", err.Error())
ctx.JSON(http.StatusBadRequest, types.Failed(ecode.BadArgument, "%v", err))
return
}
if stgglb.StandaloneMode {
ctx.JSON(http.StatusOK, types.Failed(ecode.OperationFailed, "client is not online"))
return
}
corCli := stgglb.CoordinatorRPCPool.Get()
defer corCli.Release()
resp, cerr := corCli.CreatePubShards(ctx.Request.Context(), &corrpc.CreatePubShards{
Password: req.Password,
MasterHub: req.MasterHub,
Name: req.Name,
Storage: req.Storage,
Credential: req.Credential,
ShardStore: req.ShardStore,
Features: req.Features,
WorkingDir: jcstypes.PathFromJcsPathString(req.WorkingDir),
})
if cerr != nil {
ctx.JSON(http.StatusOK, types.Failed(ecode.ErrorCode(cerr.Code), cerr.Message))
return
}
ctx.JSON(http.StatusOK, types.OK(cliapi.PubShardsCreateResp{
PubShards: resp.PubShardStore,
}))
}
func (s *PubShardsService) Join(ctx *gin.Context) {
log := logger.WithField("HTTP", "PubShards.Join")
var req cliapi.PubShardsJoin
if err := ctx.ShouldBindJSON(&req); err != nil {
log.Warnf("binding body: %s", err.Error())
ctx.JSON(http.StatusBadRequest, types.Failed(ecode.BadArgument, "%v", err))
return
}
if stgglb.StandaloneMode {
ctx.JSON(http.StatusOK, types.Failed(ecode.OperationFailed, "client is not online"))
return
}
corCli := stgglb.CoordinatorRPCPool.Get()
defer corCli.Release()
resp, cerr := corCli.UserGetPubShards(ctx.Request.Context(), &corrpc.UserGetPubShards{
PubShardsID: req.PubShardsID,
Password: req.Password,
})
if cerr != nil {
ctx.JSON(http.StatusOK, types.Failed(ecode.ErrorCode(cerr.Code), cerr.Message))
return
}
resp2, cerr2 := s.svc.UserSpaceSvc().Create(cliapi.UserSpaceCreate{
Name: req.Name,
Storage: &jcstypes.PubShardsType{
Type: "PubShards",
Base: resp.PubShards.Storage,
PubShardsID: req.PubShardsID,
Password: req.Password,
MasterHub: resp.MasterHub.HubID,
},
Credential: resp.PubShards.Credential,
ShardStore: &resp.PubShards.ShardStore,
Features: resp.PubShards.Features,
WorkingDir: resp.PubShards.WorkingDir.ConcatCompsNew("parts", fmt.Sprintf("%v", s.svc.AccToken.GetToken().UserID)).String(),
})
if cerr2 != nil {
ctx.JSON(http.StatusOK, types.Failed(ecode.ErrorCode(cerr2.Code), cerr2.Message))
return
}
ctx.JSON(http.StatusOK, types.OK(cliapi.PubShardsJoinResp{
PubShards: resp.PubShards,
UserSpace: resp2.UserSpace,
}))
}