mirror of
https://github.com/kevin-DL/services.git
synced 2026-01-11 19:04:35 +00:00
Space updates (#299)
* updates for timestamps and storing meta for quick retrieval * fix up head vis
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
"github.com/micro/micro/v3/service/config"
|
||||
"github.com/micro/micro/v3/service/errors"
|
||||
log "github.com/micro/micro/v3/service/logger"
|
||||
"github.com/micro/micro/v3/service/store"
|
||||
"github.com/micro/services/pkg/tenant"
|
||||
pb "github.com/micro/services/space/proto"
|
||||
"github.com/minio/minio-go/v7/pkg/s3utils"
|
||||
@@ -34,6 +35,8 @@ const (
|
||||
|
||||
visibilityPrivate = "private"
|
||||
visibilityPublic = "public"
|
||||
|
||||
prefixByUser = "byUser"
|
||||
)
|
||||
|
||||
type Space struct {
|
||||
@@ -51,6 +54,12 @@ type conf struct {
|
||||
BaseURL string `json:"base_url"`
|
||||
}
|
||||
|
||||
type meta struct {
|
||||
Visibility string
|
||||
CreateTime string
|
||||
ModifiedTime string
|
||||
}
|
||||
|
||||
func NewSpace(srv *service.Service) *Space {
|
||||
var c conf
|
||||
val, err := config.Get("micro.space")
|
||||
@@ -119,7 +128,7 @@ func (s Space) upsert(ctx context.Context, object []byte, name, visibility, meth
|
||||
return "", errors.BadRequest(method, "Object already exists")
|
||||
}
|
||||
|
||||
createTime := aws.String(fmt.Sprintf("%d", time.Now().Unix()))
|
||||
createTime := aws.String(time.Now().Format(time.RFC3339Nano))
|
||||
if exists {
|
||||
createTime = hoo.Metadata[mdCreated]
|
||||
}
|
||||
@@ -146,8 +155,19 @@ func (s Space) upsert(ctx context.Context, object []byte, name, visibility, meth
|
||||
return "", errors.InternalServerError(method, "Error creating object")
|
||||
}
|
||||
|
||||
// TODO fix the url
|
||||
return fmt.Sprintf("%s/%s", s.conf.BaseURL, objectName), nil
|
||||
// store the metadata for easy retrieval for listing
|
||||
if err := store.Write(store.NewRecord(
|
||||
fmt.Sprintf("%s/%s", prefixByUser, objectName),
|
||||
meta{Visibility: visibility, CreateTime: *createTime, ModifiedTime: time.Now().Format(time.RFC3339Nano)})); err != nil {
|
||||
log.Errorf("Error writing object to store %s", err)
|
||||
return "", errors.InternalServerError(method, "Error creating object")
|
||||
}
|
||||
retUrl := ""
|
||||
if visibility == "public" {
|
||||
retUrl = fmt.Sprintf("%s/%s", s.conf.BaseURL, objectName)
|
||||
}
|
||||
|
||||
return retUrl, nil
|
||||
|
||||
}
|
||||
|
||||
@@ -174,6 +194,10 @@ func (s Space) Delete(ctx context.Context, request *pb.DeleteRequest, response *
|
||||
log.Errorf("Error deleting object %s", err)
|
||||
return errors.InternalServerError(method, "Error deleting object")
|
||||
}
|
||||
if err := store.Delete(fmt.Sprintf("%s/%s", prefixByUser, objectName)); err != nil {
|
||||
log.Errorf("Error deleting store record %s", err)
|
||||
return errors.InternalServerError(method, "Error deleting object")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -192,12 +216,38 @@ func (s Space) List(ctx context.Context, request *pb.ListRequest, response *pb.L
|
||||
log.Errorf("Error listing objects %s", err)
|
||||
return errors.InternalServerError(method, "Error listing objects")
|
||||
}
|
||||
|
||||
recs, err := store.Read(fmt.Sprintf("%s/%s", prefixByUser, objectName), store.ReadPrefix())
|
||||
if err != nil {
|
||||
log.Errorf("Error listing objects %s", err)
|
||||
return errors.InternalServerError(method, "Error listing objects")
|
||||
}
|
||||
md := map[string]meta{}
|
||||
for _, r := range recs {
|
||||
var m meta
|
||||
if err := json.Unmarshal(r.Value, &m); err != nil {
|
||||
log.Errorf("Error unmarshaling meta %s", err)
|
||||
return errors.InternalServerError(method, "Error listing objects")
|
||||
}
|
||||
md[strings.TrimPrefix(r.Key, prefixByUser+"/")] = m
|
||||
}
|
||||
response.Objects = []*pb.ListObject{}
|
||||
for _, oi := range rsp.Contents {
|
||||
m, ok := md[*oi.Key]
|
||||
if !ok {
|
||||
// hack for now
|
||||
m = meta{}
|
||||
}
|
||||
url := ""
|
||||
if m.Visibility == "public" {
|
||||
url = fmt.Sprintf("%s/%s", s.conf.BaseURL, *oi.Key)
|
||||
}
|
||||
response.Objects = append(response.Objects, &pb.ListObject{
|
||||
Name: strings.TrimPrefix(*oi.Key, tnt+"/"),
|
||||
Modified: oi.LastModified.Unix(),
|
||||
Url: fmt.Sprintf("%s/%s", s.conf.BaseURL, *oi.Key),
|
||||
Name: strings.TrimPrefix(*oi.Key, tnt+"/"),
|
||||
Modified: oi.LastModified.Format(time.RFC3339Nano),
|
||||
Url: url,
|
||||
Visibility: m.Visibility,
|
||||
Created: m.CreateTime,
|
||||
})
|
||||
}
|
||||
return nil
|
||||
@@ -231,20 +281,31 @@ func (s Space) Head(ctx context.Context, request *pb.HeadRequest, response *pb.H
|
||||
if md, ok := goo.Metadata[mdVisibility]; ok && len(*md) > 0 {
|
||||
vis = *md
|
||||
}
|
||||
var created int64
|
||||
var created string
|
||||
if md, ok := goo.Metadata[mdCreated]; ok && len(*md) > 0 {
|
||||
created, err = strconv.ParseInt(*md, 10, 64)
|
||||
t, err := time.Parse(time.RFC3339Nano, *md)
|
||||
if err != nil {
|
||||
log.Errorf("Error %s", err)
|
||||
// try as unix ts
|
||||
createdI, err := strconv.ParseInt(*md, 10, 64)
|
||||
if err != nil {
|
||||
log.Errorf("Error %s", err)
|
||||
} else {
|
||||
t = time.Unix(createdI, 0)
|
||||
}
|
||||
}
|
||||
created = t.Format(time.RFC3339Nano)
|
||||
}
|
||||
|
||||
url := ""
|
||||
if vis == "public" {
|
||||
url = fmt.Sprintf("%s/%s", s.conf.BaseURL, objectName)
|
||||
}
|
||||
response.Object = &pb.HeadObject{
|
||||
Name: request.Name,
|
||||
Modified: goo.LastModified.Unix(),
|
||||
Modified: goo.LastModified.Format(time.RFC3339Nano),
|
||||
Created: created,
|
||||
Visibility: vis,
|
||||
Url: fmt.Sprintf("%s/%s", s.conf.BaseURL, objectName),
|
||||
Url: url,
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user