| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | package localimport (	"io/fs"	"log"	"os"	"path/filepath"	"strings"	"github.com/langgenius/dify-plugin-daemon/internal/oss")type LocalStorage struct {	root string}func NewLocalStorage(root string) oss.OSS {	if err := os.MkdirAll(root, 0o755); err != nil {		log.Panicf("Failed to create storage path: %s", err)	}	return &LocalStorage{root: root}}func (l *LocalStorage) Save(key string, data []byte) error {	path := filepath.Join(l.root, key)	filePath := filepath.Dir(path)	if err := os.MkdirAll(filePath, 0o755); err != nil {		return err	}	return os.WriteFile(path, data, 0o644)}func (l *LocalStorage) Load(key string) ([]byte, error) {	path := filepath.Join(l.root, key)	return os.ReadFile(path)}func (l *LocalStorage) Exists(key string) (bool, error) {	path := filepath.Join(l.root, key)	_, err := os.Stat(path)	return err == nil, nil}func (l *LocalStorage) State(key string) (oss.OSSState, error) {	path := filepath.Join(l.root, key)	info, err := os.Stat(path)	if err != nil {		return oss.OSSState{}, err	}	return oss.OSSState{Size: info.Size(), LastModified: info.ModTime()}, nil}func (l *LocalStorage) List(prefix string) ([]oss.OSSPath, error) {	paths := make([]oss.OSSPath, 0)	// check if the patch exists	exists, err := l.Exists(prefix)	if err != nil {		return nil, err	}	if !exists {		return paths, nil	}	prefix = filepath.Join(l.root, prefix)	err = filepath.WalkDir(prefix, func(path string, d fs.DirEntry, err error) error {		if err != nil {			return err		}		// remove prefix		path = strings.TrimPrefix(path, prefix)		if path == "" {			return nil		}		// remove leading slash		path = strings.TrimPrefix(path, "/")		paths = append(paths, oss.OSSPath{			Path:  path,			IsDir: d.IsDir(),		})		return nil	})	if err != nil {		return nil, err	}	return paths, nil}func (l *LocalStorage) Delete(key string) error {	path := filepath.Join(l.root, key)	return os.RemoveAll(path)}
 |