113 lines
3.2 KiB
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,
|
|
}))
|
|
}
|