package storage import ( "crypto/sha256" "encoding/hex" "fmt" "io" "os" "path/filepath" "mstore/app/logger" "mstore/pkg/auxuuid" ) type Storage struct { basepath string logg *logger.Logger } func NewStorage(basepath string) *Storage { res := &Storage{ basepath: basepath, } res.logg = logger.NewLogger("storage") return res } func (store *Storage) GetFileReader(collection, filename string) (io.ReadCloser, error) { var err error var res io.ReadCloser filename = filepath.Join(store.basepath, collection, filename) file, err := os.OpenFile(filename, os.O_RDONLY, 0) if err != nil { return res, err } res = file return res, err } func (store *Storage) HardlinkFile(tmpname, collection, filename string) error { var err error dirname := filepath.Join(store.basepath, collection) err = os.MkdirAll(dirname, 0750) if err != nil { return err } filename = filepath.Join(store.basepath, collection, filename) os.Remove(filename) // TODO err = os.Link(tmpname, filename) if err != nil { return err } err = os.Remove(tmpname) if err != nil { return err } return err } func (store *Storage) WriteTempFile(source io.Reader) (string, int64, string, error) { var err error var size int64 var digest string tmpname := auxuuid.NewUUID() tmpname = fmt.Sprintf("file-%s.tmp", tmpname) tmppath := filepath.Join(store.basepath, tmpname) file, err := os.OpenFile(tmppath, os.O_WRONLY|os.O_CREATE, 0640) if err != nil { return tmppath, size, digest, err } defer file.Close() hasher := sha256.New() writer := io.MultiWriter(file, hasher) size, err = io.Copy(writer, source) if err != nil { return tmppath, size, digest, err } digest = hex.EncodeToString(hasher.Sum(nil)) digest = fmt.Sprintf("sha256:%s", digest) return tmppath, size, digest, err } func (store *Storage) DeleteFile(collection, filename string) error { var err error filename = filepath.Join(store.basepath, collection, filename) err = os.Remove(filename) if err != nil { return err } dirname := filepath.Join(store.basepath, collection) err = os.RemoveAll(dirname) if err != nil { return err } return err }