70 lines
1.9 KiB
Go
70 lines
1.9 KiB
Go
package storage
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/mayswind/ezbookkeeping/pkg/core"
|
|
"github.com/mayswind/ezbookkeeping/pkg/settings"
|
|
"github.com/mayswind/ezbookkeeping/pkg/utils"
|
|
)
|
|
|
|
// LocalFileSystemObjectStorage represents local file system object storage
|
|
type LocalFileSystemObjectStorage struct {
|
|
rootPath string
|
|
}
|
|
|
|
// NewLocalFileSystemObjectStorage returns a local file system object storage
|
|
func NewLocalFileSystemObjectStorage(config *settings.Config, pathPrefix string) (*LocalFileSystemObjectStorage, error) {
|
|
storage := &LocalFileSystemObjectStorage{
|
|
rootPath: filepath.Join(config.LocalFileSystemPath, pathPrefix),
|
|
}
|
|
|
|
if err := os.MkdirAll(storage.rootPath, os.ModePerm); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return storage, nil
|
|
}
|
|
|
|
// Exists returns whether the file exists
|
|
func (s *LocalFileSystemObjectStorage) Exists(ctx core.Context, path string) (bool, error) {
|
|
return utils.IsExists(s.getFinalPath(path))
|
|
}
|
|
|
|
// Read returns the object instance according to specified the file path
|
|
func (s *LocalFileSystemObjectStorage) Read(ctx core.Context, path string) (ObjectInStorage, error) {
|
|
return os.Open(s.getFinalPath(path))
|
|
}
|
|
|
|
// Save returns whether save the object instance successfully
|
|
func (s *LocalFileSystemObjectStorage) Save(ctx core.Context, path string, object ObjectInStorage) error {
|
|
finalPath := s.getFinalPath(path)
|
|
|
|
if err := os.MkdirAll(filepath.Dir(finalPath), os.ModePerm); err != nil {
|
|
return err
|
|
}
|
|
|
|
targetFile, err := os.Create(finalPath)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer targetFile.Close()
|
|
|
|
_, err = io.Copy(targetFile, object)
|
|
|
|
return err
|
|
}
|
|
|
|
// Delete returns whether delete the object according to specified the file path successfully
|
|
func (s *LocalFileSystemObjectStorage) Delete(ctx core.Context, path string) error {
|
|
return os.Remove(s.getFinalPath(path))
|
|
}
|
|
|
|
func (s *LocalFileSystemObjectStorage) getFinalPath(path string) string {
|
|
return filepath.Join(s.rootPath, path)
|
|
}
|