Files
fs/service/service.go

108 lines
2.5 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 s.metadataHandler.DeleteManifest(bucket, key)
}
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()
}
func (s *ObjectService) CreateMultipartUpload(bucket, key string) (*models.MultipartUpload, error) {
return s.metadataHandler.CreateMultipartUpload(bucket, key)
}
func (s *ObjectService) PutMultipartObject(bucket, key, uploadId string, input io.Reader) (*models.MultipartUpload, error) {
return nil, nil
}