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 }