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

388 lines
10 KiB
Go

package http
/*
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/samber/lo"
"gitlink.org.cn/cloudream/common/consts/errorcode"
"gitlink.org.cn/cloudream/common/pkgs/logger"
"gitlink.org.cn/cloudream/jcs-pub/client/types"
)
type TempService struct {
*Server
}
func (s *Server) Temp() *TempService {
return &TempService{
Server: s,
}
}
type TempListDetailsResp struct {
Buckets []BucketDetail `json:"buckets"`
}
type BucketDetail struct {
BucketID types.BucketID `json:"bucketID"`
Name string `json:"name"`
ObjectCount int `json:"objectCount"`
}
func (s *TempService) ListDetails(ctx *gin.Context) {
log := logger.WithField("HTTP", "Bucket.ListBucketsDetails")
bkts, err := s.svc.BucketSvc().GetUserBuckets(1)
if err != nil {
log.Warnf("getting user buckets: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get user buckets failed"))
return
}
details := make([]BucketDetail, len(bkts))
for i := range bkts {
details[i].BucketID = bkts[i].BucketID
details[i].Name = bkts[i].Name
objs, err := s.getBucketObjects(bkts[i].BucketID)
if err != nil {
log.Warnf("getting bucket objects: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get bucket objects failed"))
return
}
details[i].ObjectCount = len(objs)
}
ctx.JSON(http.StatusOK, OK(TempListDetailsResp{
Buckets: details,
}))
}
type TempGetObjects struct {
BucketID types.BucketID `form:"bucketID"`
}
type BucketGetObjectsResp struct {
Objects []types.Object `json:"objects"`
}
func (s *TempService) GetObjects(ctx *gin.Context) {
log := logger.WithField("HTTP", "Bucket.ListBucketsDetails")
var req TempGetObjects
if err := ctx.ShouldBindQuery(&req); err != nil {
log.Warnf("binding query: %s", err.Error())
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
return
}
objs, err := s.getBucketObjects(req.BucketID)
if err != nil {
log.Warnf("getting bucket objects: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get bucket objects failed"))
return
}
ctx.JSON(http.StatusOK, OK(BucketGetObjectsResp{
Objects: objs,
}))
}
type TempGetObjectDetail struct {
ObjectID types.ObjectID `form:"objectID"`
}
type TempGetObjectDetailResp struct {
Blocks []ObjectBlockDetail `json:"blocks"`
}
type ObjectBlockDetail struct {
ObjectID types.ObjectID `json:"objectID"`
Type string `json:"type"`
FileHash types.FileHash `json:"fileHash"`
LocationType string `json:"locationType"`
LocationName string `json:"locationName"`
}
func (s *TempService) GetObjectDetail(ctx *gin.Context) {
log := logger.WithField("HTTP", "Object.GetObjectDetail")
var req TempGetObjectDetail
if err := ctx.ShouldBindQuery(&req); err != nil {
log.Warnf("binding query: %s", err.Error())
ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument"))
return
}
details, err := s.svc.ObjectSvc().GetObjectDetail(req.ObjectID)
if err != nil {
log.Warnf("getting object detail: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get object detail failed"))
return
}
if details == nil {
log.Warnf("object not found")
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "object not found"))
return
}
var allSpaceIDs []types.UserSpaceID
allSpaceIDs = append(allSpaceIDs, details.PinnedAt...)
for _, b := range details.Blocks {
allSpaceIDs = append(allSpaceIDs, b.UserSpaceID)
}
allSpaceIDs = lo.Uniq(allSpaceIDs)
getStgs, err := s.svc.StorageSvc().GetDetails(allSpaceIDs)
if err != nil {
log.Warnf("getting nodes: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed"))
return
}
allStgs := make(map[types.UserSpaceID]types.UserSpace)
for _, n := range getStgs {
if n != nil {
allStgs[n.Storage.UserSpaceID] = n.UserSpace
}
}
var blocks []ObjectBlockDetail
for _, spaceID := range details.PinnedAt {
blocks = append(blocks, ObjectBlockDetail{
Type: "Rep",
FileHash: details.Object.FileHash,
LocationType: "Agent",
LocationName: allStgs[spaceID].Name,
})
}
switch details.Object.Redundancy.(type) {
case *types.NoneRedundancy:
for _, blk := range details.Blocks {
if !lo.Contains(details.PinnedAt, blk.UserSpaceID) {
blocks = append(blocks, ObjectBlockDetail{
Type: "Rep",
FileHash: blk.FileHash,
LocationType: "Agent",
LocationName: allStgs[blk.UserSpaceID].Name,
})
}
}
case *types.RepRedundancy:
for _, blk := range details.Blocks {
if !lo.Contains(details.PinnedAt, blk.UserSpaceID) {
blocks = append(blocks, ObjectBlockDetail{
Type: "Rep",
FileHash: blk.FileHash,
LocationType: "Agent",
LocationName: allStgs[blk.UserSpaceID].Name,
})
}
}
case *types.ECRedundancy:
for _, blk := range details.Blocks {
blocks = append(blocks, ObjectBlockDetail{
Type: "Block",
FileHash: blk.FileHash,
LocationType: "Agent",
LocationName: allStgs[blk.UserSpaceID].Name,
})
}
}
ctx.JSON(http.StatusOK, OK(TempGetObjectDetailResp{
Blocks: blocks,
}))
}
func (s *TempService) getBucketObjects(bktID types.BucketID) ([]types.Object, error) {
pkgs, err := s.svc.PackageSvc().GetBucketPackages(1, bktID)
if err != nil {
return nil, err
}
var allObjs []types.Object
for _, pkg := range pkgs {
objs, err := s.svc.ObjectSvc().GetPackageObjects(1, pkg.PackageID)
if err != nil {
return nil, err
}
allObjs = append(allObjs, objs...)
}
return allObjs, nil
}
type TempGetDatabaseAll struct {
}
type TempGetDatabaseAllResp struct {
Buckets []BucketDetail `json:"buckets"`
Objects []BucketObject `json:"objects"`
Blocks []ObjectBlockDetail `json:"blocks"`
}
type BucketObject struct {
types.Object
BucketID types.BucketID `json:"bucketID"`
}
func (s *TempService) GetDatabaseAll(ctx *gin.Context) {
log := logger.WithField("HTTP", "Temp.GetDatabaseAll")
db, err := s.svc.ObjectSvc().GetDatabaseAll()
if err != nil {
log.Warnf("getting database all: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get database all failed"))
return
}
var allSpaceIDs []types.UserSpaceID
for _, obj := range db.Objects {
allSpaceIDs = append(allSpaceIDs, obj.PinnedAt...)
for _, blk := range obj.Blocks {
allSpaceIDs = append(allSpaceIDs, blk.UserSpaceID)
}
}
getStgs, err := s.svc.StorageSvc().GetDetails(allSpaceIDs)
if err != nil {
log.Warnf("getting nodes: %s", err.Error())
ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get nodes failed"))
return
}
allStgs := make(map[types.UserSpaceID]types.Storage)
for _, n := range getStgs {
if n != nil {
allStgs[n.Storage.UserSpaceID] = n.Storage
}
}
bkts := make(map[types.BucketID]*BucketDetail)
for _, bkt := range db.Buckets {
bkts[bkt.BucketID] = &BucketDetail{
BucketID: bkt.BucketID,
Name: bkt.Name,
ObjectCount: 0,
}
}
type PackageDetail struct {
Package types.Package
// Loaded []types.Node
}
pkgs := make(map[types.PackageID]*PackageDetail)
for _, pkg := range db.Packages {
p := PackageDetail{
Package: pkg,
// Loaded: make([]types.Node, 0),
}
// loaded, err := s.svc.PackageSvc().GetLoadedNodes(1, pkg.PackageID)
// if err != nil {
// log.Warnf("getting loaded nodes: %s", err.Error())
// ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, "get loaded nodes failed"))
// return
// }
// for _, hubID := range loaded {
// p.Loaded = append(p.Loaded, allNodes[hubID])
// }
pkgs[pkg.PackageID] = &p
}
var objs []BucketObject
for _, obj := range db.Objects {
o := BucketObject{
Object: obj.Object,
BucketID: pkgs[obj.Object.PackageID].Package.BucketID,
}
objs = append(objs, o)
}
var blocks []ObjectBlockDetail
for _, obj := range db.Objects {
bkts[pkgs[obj.Object.PackageID].Package.BucketID].ObjectCount++
for _, hubID := range obj.PinnedAt {
blocks = append(blocks, ObjectBlockDetail{
ObjectID: obj.Object.ObjectID,
Type: "Rep",
FileHash: obj.Object.FileHash,
LocationType: "Agent",
LocationName: allStgs[hubID].Name,
})
}
switch obj.Object.Redundancy.(type) {
case *types.NoneRedundancy:
for _, blk := range obj.Blocks {
if !lo.Contains(obj.PinnedAt, blk.UserSpaceID) {
blocks = append(blocks, ObjectBlockDetail{
ObjectID: obj.Object.ObjectID,
Type: "Rep",
FileHash: blk.FileHash,
LocationType: "Agent",
LocationName: allStgs[blk.UserSpaceID].Name,
})
}
}
case *types.RepRedundancy:
for _, blk := range obj.Blocks {
if !lo.Contains(obj.PinnedAt, blk.UserSpaceID) {
blocks = append(blocks, ObjectBlockDetail{
ObjectID: obj.Object.ObjectID,
Type: "Rep",
FileHash: blk.FileHash,
LocationType: "Agent",
LocationName: allStgs[blk.UserSpaceID].Name,
})
}
}
case *types.ECRedundancy:
for _, blk := range obj.Blocks {
blocks = append(blocks, ObjectBlockDetail{
ObjectID: obj.Object.ObjectID,
Type: "Block",
FileHash: blk.FileHash,
LocationType: "Agent",
LocationName: allStgs[blk.UserSpaceID].Name,
})
}
}
// for _, node := range pkgs[obj.Object.PackageID].Loaded {
// blocks = append(blocks, ObjectBlockDetail{
// ObjectID: obj.Object.ObjectID,
// Type: "Rep",
// FileHash: obj.Object.FileHash,
// LocationType: "Storage",
// LocationName: allNodes[node.HubID].Name,
// })
// }
}
ctx.JSON(http.StatusOK, OK(TempGetDatabaseAllResp{
Buckets: lo.Map(lo.Values(bkts), func(b *BucketDetail, _ int) BucketDetail { return *b }),
Objects: objs,
Blocks: blocks,
}))
}
func initTemp(rt gin.IRoutes, s *Server) {
rt.GET("/bucket/listDetails", s.Temp().ListDetails)
rt.GET("/bucket/getObjects", s.Temp().GetObjects)
rt.GET("/object/getDetail", s.Temp().GetObjectDetail)
rt.GET("/temp/getDatabaseAll", s.Temp().GetDatabaseAll)
}
func auth(ctx *gin.Context) {
token := ctx.Request.Header.Get("X-CDS-Auth")
if token != "cloudream@123" {
ctx.AbortWithStatus(http.StatusUnauthorized)
}
}
*/