forked from TrueCloudLab/frostfs-http-gw
116 lines
2.7 KiB
Go
116 lines
2.7 KiB
Go
|
package services
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
|
||
|
"git.frostfs.info/TrueCloudLab/frostfs-http-gw/tokens"
|
||
|
"git.frostfs.info/TrueCloudLab/frostfs-http-gw/tree"
|
||
|
treepool "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/pool/tree"
|
||
|
grpcService "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/pool/tree/service"
|
||
|
)
|
||
|
|
||
|
type GetNodeByPathResponseInfoWrapper struct {
|
||
|
response *grpcService.GetNodeByPathResponse_Info
|
||
|
}
|
||
|
|
||
|
func (n GetNodeByPathResponseInfoWrapper) GetNodeID() uint64 {
|
||
|
return n.response.GetNodeId()
|
||
|
}
|
||
|
|
||
|
func (n GetNodeByPathResponseInfoWrapper) GetParentID() uint64 {
|
||
|
return n.response.GetParentId()
|
||
|
}
|
||
|
|
||
|
func (n GetNodeByPathResponseInfoWrapper) GetTimestamp() uint64 {
|
||
|
return n.response.GetTimestamp()
|
||
|
}
|
||
|
|
||
|
func (n GetNodeByPathResponseInfoWrapper) GetMeta() []tree.Meta {
|
||
|
res := make([]tree.Meta, len(n.response.Meta))
|
||
|
for i, value := range n.response.Meta {
|
||
|
res[i] = value
|
||
|
}
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
type GetSubTreeResponseBodyWrapper struct {
|
||
|
response *grpcService.GetSubTreeResponse_Body
|
||
|
}
|
||
|
|
||
|
func (n GetSubTreeResponseBodyWrapper) GetNodeID() uint64 {
|
||
|
return n.response.GetNodeId()
|
||
|
}
|
||
|
|
||
|
func (n GetSubTreeResponseBodyWrapper) GetParentID() uint64 {
|
||
|
return n.response.GetParentId()
|
||
|
}
|
||
|
|
||
|
func (n GetSubTreeResponseBodyWrapper) GetTimestamp() uint64 {
|
||
|
return n.response.GetTimestamp()
|
||
|
}
|
||
|
|
||
|
func (n GetSubTreeResponseBodyWrapper) GetMeta() []tree.Meta {
|
||
|
res := make([]tree.Meta, len(n.response.Meta))
|
||
|
for i, value := range n.response.Meta {
|
||
|
res[i] = value
|
||
|
}
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
type PoolWrapper struct {
|
||
|
p *treepool.Pool
|
||
|
}
|
||
|
|
||
|
func NewPoolWrapper(p *treepool.Pool) *PoolWrapper {
|
||
|
return &PoolWrapper{p: p}
|
||
|
}
|
||
|
|
||
|
func (w *PoolWrapper) GetNodes(ctx context.Context, prm *tree.GetNodesParams) ([]tree.NodeResponse, error) {
|
||
|
poolPrm := treepool.GetNodesParams{
|
||
|
CID: prm.CnrID,
|
||
|
TreeID: prm.TreeID,
|
||
|
Path: prm.Path,
|
||
|
Meta: prm.Meta,
|
||
|
PathAttribute: tree.FileNameKey,
|
||
|
LatestOnly: prm.LatestOnly,
|
||
|
AllAttrs: prm.AllAttrs,
|
||
|
BearerToken: getBearer(ctx),
|
||
|
}
|
||
|
|
||
|
nodes, err := w.p.GetNodes(ctx, poolPrm)
|
||
|
if err != nil {
|
||
|
return nil, handleError(err)
|
||
|
}
|
||
|
|
||
|
res := make([]tree.NodeResponse, len(nodes))
|
||
|
for i, info := range nodes {
|
||
|
res[i] = GetNodeByPathResponseInfoWrapper{info}
|
||
|
}
|
||
|
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func getBearer(ctx context.Context) []byte {
|
||
|
token, err := tokens.LoadBearerToken(ctx)
|
||
|
if err != nil {
|
||
|
return nil
|
||
|
}
|
||
|
return token.Marshal()
|
||
|
}
|
||
|
|
||
|
func handleError(err error) error {
|
||
|
if err == nil {
|
||
|
return nil
|
||
|
}
|
||
|
if errors.Is(err, treepool.ErrNodeNotFound) {
|
||
|
return fmt.Errorf("%w: %s", tree.ErrNodeNotFound, err.Error())
|
||
|
}
|
||
|
if errors.Is(err, treepool.ErrNodeAccessDenied) {
|
||
|
return fmt.Errorf("%w: %s", tree.ErrNodeAccessDenied, err.Error())
|
||
|
}
|
||
|
|
||
|
return err
|
||
|
}
|