mirror of
https://github.com/ferdzo/fs.git
synced 2026-04-05 01:36:25 +00:00
100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"fs/metadata"
|
|
"fs/models"
|
|
"fs/storage"
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
type ObjectService struct {
|
|
metadataHandler *metadata.MetadataHandler
|
|
}
|
|
|
|
func NewObjectService(metadataHandler *metadata.MetadataHandler) *ObjectService {
|
|
return &ObjectService{metadataHandler: metadataHandler}
|
|
}
|
|
|
|
func (s *ObjectService) PutObject(bucket, key, contentType string, input io.Reader) (*models.ObjectManifest, error) {
|
|
|
|
chunks, size, etag, err := storage.IngestStream(input)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
timestamp := time.Now().Unix()
|
|
|
|
manifest := &models.ObjectManifest{
|
|
Bucket: bucket,
|
|
Key: key,
|
|
Size: size,
|
|
ContentType: contentType,
|
|
ETag: etag,
|
|
Chunks: chunks,
|
|
CreatedAt: timestamp,
|
|
}
|
|
fmt.Println(manifest)
|
|
if err = s.metadataHandler.PutManifest(manifest); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return manifest, nil
|
|
}
|
|
|
|
func (s *ObjectService) GetObject(bucket, key string) (io.ReadCloser, *models.ObjectManifest, error) {
|
|
manifest, err := s.metadataHandler.GetManifest(bucket, key)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
pr, pw := io.Pipe()
|
|
|
|
go func() {
|
|
defer func(pw *io.PipeWriter) {
|
|
err := pw.Close()
|
|
if err != nil {
|
|
|
|
}
|
|
}(pw)
|
|
|
|
err := storage.AssembleStream(manifest.Chunks, pw)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}()
|
|
return pr, manifest, nil
|
|
}
|
|
|
|
func (s *ObjectService) HeadObject(bucket, key string) (models.ObjectManifest, error) {
|
|
manifest, err := s.metadataHandler.GetManifest(bucket, key)
|
|
if err != nil {
|
|
return models.ObjectManifest{}, err
|
|
}
|
|
return *manifest, nil
|
|
}
|
|
|
|
func (s *ObjectService) DeleteObject(bucket, key string) error {
|
|
return nil
|
|
}
|
|
|
|
func (s *ObjectService) ListObjects(bucket, prefix string) ([]*models.ObjectManifest, error) {
|
|
return s.metadataHandler.ListObjects(bucket, prefix)
|
|
}
|
|
|
|
func (s *ObjectService) CreateBucket(bucket string) error {
|
|
return s.metadataHandler.CreateBucket(bucket)
|
|
}
|
|
|
|
func (s *ObjectService) HeadBucket(bucket string) error {
|
|
_, err := s.metadataHandler.GetBucketManifest(bucket)
|
|
return err
|
|
}
|
|
|
|
func (s *ObjectService) DeleteBucket(bucket string) error {
|
|
return s.metadataHandler.DeleteBucket(bucket)
|
|
}
|
|
|
|
func (s *ObjectService) ListBuckets() ([]string, error) {
|
|
return s.metadataHandler.ListBuckets()
|
|
}
|