github.com/esnet/gdg@v0.6.1-0.20240412190737-6b6eba9c14d8/internal/service/storage_local.go (about)

     1  package service
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"log/slog"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"gocloud.dev/blob"
    11  	"gocloud.dev/blob/fileblob"
    12  )
    13  
    14  // LocalStorage default storage engine
    15  type LocalStorage struct {
    16  	ctx context.Context
    17  }
    18  
    19  // ReadFile returns a byte array of file content
    20  func (s *LocalStorage) ReadFile(filename string) ([]byte, error) {
    21  	mb, err := s.getBucket(filepath.Dir(filename))
    22  	if err != nil {
    23  		return nil, err
    24  	}
    25  	f := filepath.Base(filename)
    26  	data, err := mb.ReadAll(s.ctx, f)
    27  	if err != nil || len(data) == 0 {
    28  		return nil, errors.New("unable to read file")
    29  	}
    30  	return data, nil
    31  }
    32  
    33  func (s *LocalStorage) getBucket(baseFolder string) (*blob.Bucket, error) {
    34  	if _, err := os.Stat(baseFolder); err != nil {
    35  		_ = os.Mkdir(baseFolder, 0750)
    36  	}
    37  	opts := fileblob.Options{
    38  		NoTempDir: true,
    39  	}
    40  	return fileblob.OpenBucket(baseFolder, &opts)
    41  }
    42  
    43  // WriteFile writes file to disk and returns an error if operation failed
    44  func (s *LocalStorage) WriteFile(filename string, data []byte) error {
    45  	mb, err := s.getBucket(filepath.Dir(filename))
    46  	if err != nil {
    47  		return err
    48  	}
    49  	f := filepath.Base(filename)
    50  	err = mb.WriteAll(s.ctx, f, data, nil)
    51  	if err == nil {
    52  		//Remove attribute file being generated by local storage
    53  		attrFile := filename + ".attrs"
    54  		slog.Debug("Removing file", "file", attrFile)
    55  		defer os.Remove(attrFile)
    56  
    57  	}
    58  	return err
    59  }
    60  
    61  func (s *LocalStorage) Name() string {
    62  	return "LocalStorage"
    63  }
    64  
    65  func (s *LocalStorage) FindAllFiles(folder string, fullPath bool) ([]string, error) {
    66  	mb, err := s.getBucket(folder)
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  
    71  	var fileList []string
    72  	iterator := mb.List(nil)
    73  	for {
    74  		obj, err := iterator.Next(s.ctx)
    75  		if err != nil {
    76  			break
    77  		}
    78  		if fullPath {
    79  			fileList = append(fileList, filepath.Join(folder, obj.Key))
    80  		} else {
    81  			fileList = append(fileList, filepath.Base(obj.Key))
    82  		}
    83  	}
    84  
    85  	return fileList, nil
    86  }
    87  
    88  func NewLocalStorage(ctx context.Context) Storage {
    89  	return &LocalStorage{ctx: ctx}
    90  }