forked from TrueCloudLab/frostfs-rest-gw
[#1] Add route to get object info
Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
parent
d9798cbce8
commit
066656ac48
14 changed files with 1032 additions and 70 deletions
|
@ -4,6 +4,10 @@ import (
|
|||
"encoding/base64"
|
||||
"fmt"
|
||||
|
||||
"github.com/nspcc-dev/neofs-sdk-go/object/address"
|
||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
||||
"go.uber.org/zap"
|
||||
|
||||
"github.com/go-openapi/runtime/middleware"
|
||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
||||
|
@ -18,6 +22,7 @@ import (
|
|||
|
||||
// PutObjects handler that uploads object to NeoFS.
|
||||
func (a *API) PutObjects(params operations.PutObjectParams, principal *models.Principal) middleware.Responder {
|
||||
errorResponse := operations.NewPutObjectBadRequest()
|
||||
ctx := params.HTTPRequest.Context()
|
||||
|
||||
bt := &BearerToken{
|
||||
|
@ -28,17 +33,18 @@ func (a *API) PutObjects(params operations.PutObjectParams, principal *models.Pr
|
|||
|
||||
btoken, err := prepareBearerToken(bt)
|
||||
if err != nil {
|
||||
return operations.NewPutObjectBadRequest().WithPayload(models.Error(err.Error()))
|
||||
return errorResponse.WithPayload(models.Error(err.Error()))
|
||||
}
|
||||
|
||||
var cnrID cid.ID
|
||||
if err = cnrID.Parse(*params.Object.ContainerID); err != nil {
|
||||
return operations.NewPutObjectBadRequest().WithPayload(models.Error(err.Error()))
|
||||
a.log.Error("invalid container id", zap.Error(err))
|
||||
return errorResponse.WithPayload("invalid container id")
|
||||
}
|
||||
|
||||
payload, err := base64.StdEncoding.DecodeString(params.Object.Payload)
|
||||
if err != nil {
|
||||
return operations.NewPutObjectBadRequest().WithPayload(models.Error(err.Error()))
|
||||
return errorResponse.WithPayload(models.Error(err.Error()))
|
||||
}
|
||||
|
||||
prm := PrmAttributes{
|
||||
|
@ -47,7 +53,7 @@ func (a *API) PutObjects(params operations.PutObjectParams, principal *models.Pr
|
|||
}
|
||||
attributes, err := GetObjectAttributes(ctx, params.HTTPRequest.Header, a.pool, prm)
|
||||
if err != nil {
|
||||
return operations.NewPutObjectBadRequest().WithPayload(models.Error(err.Error()))
|
||||
return errorResponse.WithPayload(models.Error(err.Error()))
|
||||
}
|
||||
|
||||
obj := object.New()
|
||||
|
@ -62,7 +68,7 @@ func (a *API) PutObjects(params operations.PutObjectParams, principal *models.Pr
|
|||
|
||||
objID, err := a.pool.PutObject(ctx, prmPut)
|
||||
if err != nil {
|
||||
return operations.NewPutObjectBadRequest().WithPayload(models.Error(err.Error()))
|
||||
return errorResponse.WithPayload(NewError(err))
|
||||
}
|
||||
|
||||
var resp operations.PutObjectOKBody
|
||||
|
@ -72,6 +78,61 @@ func (a *API) PutObjects(params operations.PutObjectParams, principal *models.Pr
|
|||
return operations.NewPutObjectOK().WithPayload(&resp)
|
||||
}
|
||||
|
||||
// GetObjectInfo handler that get object info.
|
||||
func (a *API) GetObjectInfo(params operations.GetObjectInfoParams, principal *models.Principal) middleware.Responder {
|
||||
errorResponse := operations.NewGetObjectInfoBadRequest()
|
||||
ctx := params.HTTPRequest.Context()
|
||||
|
||||
var cnrID cid.ID
|
||||
if err := cnrID.Parse(params.ContainerID); err != nil {
|
||||
a.log.Error("invalid container id", zap.Error(err))
|
||||
return errorResponse.WithPayload("invalid container id")
|
||||
}
|
||||
var objID oid.ID
|
||||
if err := objID.Parse(params.ObjectID); err != nil {
|
||||
a.log.Error("invalid object id", zap.Error(err))
|
||||
return errorResponse.WithPayload("invalid object id")
|
||||
}
|
||||
|
||||
bt := &BearerToken{
|
||||
Token: string(*principal),
|
||||
Signature: params.XNeofsTokenSignature,
|
||||
Key: params.XNeofsTokenSignatureKey,
|
||||
}
|
||||
|
||||
btoken, err := prepareBearerToken(bt)
|
||||
if err != nil {
|
||||
return errorResponse.WithPayload(NewError(err))
|
||||
}
|
||||
|
||||
var prm pool.PrmObjectHead
|
||||
addr := address.NewAddress()
|
||||
addr.SetContainerID(&cnrID)
|
||||
addr.SetObjectID(&objID)
|
||||
prm.SetAddress(*addr)
|
||||
prm.UseBearer(btoken)
|
||||
|
||||
objInfo, err := a.pool.HeadObject(ctx, prm)
|
||||
if err != nil {
|
||||
return errorResponse.WithPayload(NewError(err))
|
||||
}
|
||||
|
||||
var resp models.ObjectInfo
|
||||
resp.ContainerID = NewString(params.ContainerID)
|
||||
resp.ObjectID = NewString(params.ObjectID)
|
||||
resp.OwnerID = NewString(objInfo.OwnerID().String())
|
||||
resp.Attributes = make([]*models.Attribute, len(objInfo.Attributes()))
|
||||
|
||||
for i, attr := range objInfo.Attributes() {
|
||||
resp.Attributes[i] = &models.Attribute{
|
||||
Key: NewString(attr.Key()),
|
||||
Value: NewString(attr.Value()),
|
||||
}
|
||||
}
|
||||
|
||||
return operations.NewGetObjectInfoOK().WithPayload(&resp)
|
||||
}
|
||||
|
||||
func prepareBearerToken(bt *BearerToken) (*token.BearerToken, error) {
|
||||
btoken, err := getBearerToken(bt.Token)
|
||||
if err != nil {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue