diff --git a/drivers/local/driver.go b/drivers/local/driver.go index e4b007a3..10d7baa0 100644 --- a/drivers/local/driver.go +++ b/drivers/local/driver.go @@ -44,42 +44,42 @@ func (d *Driver) GetAddition() driver.Additional { return d.Addition } -func (d *Driver) List(ctx context.Context, dir model.Object) ([]model.Object, error) { +func (d *Driver) List(ctx context.Context, dir model.Obj) ([]model.Obj, error) { //TODO implement me panic("implement me") } -func (d *Driver) Link(ctx context.Context, file model.Object, args model.LinkArgs) (*model.Link, error) { +func (d *Driver) Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) { //TODO implement me panic("implement me") } -func (d *Driver) MakeDir(ctx context.Context, parentDir model.Object, dirName string) error { +func (d *Driver) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error { //TODO implement me panic("implement me") } -func (d *Driver) Move(ctx context.Context, srcObject, dstDir model.Object) error { +func (d *Driver) Move(ctx context.Context, srcObj, dstDir model.Obj) error { //TODO implement me panic("implement me") } -func (d *Driver) Rename(ctx context.Context, srcObject model.Object, newName string) error { +func (d *Driver) Rename(ctx context.Context, srcObj model.Obj, newName string) error { //TODO implement me panic("implement me") } -func (d *Driver) Copy(ctx context.Context, srcObject, dstDir model.Object) error { +func (d *Driver) Copy(ctx context.Context, srcObj, dstDir model.Obj) error { //TODO implement me panic("implement me") } -func (d *Driver) Remove(ctx context.Context, object model.Object) error { +func (d *Driver) Remove(ctx context.Context, obj model.Obj) error { //TODO implement me panic("implement me") } -func (d *Driver) Put(ctx context.Context, parentDir model.Object, stream model.FileStreamer) error { +func (d *Driver) Put(ctx context.Context, parentDir model.Obj, stream model.FileStreamer) error { //TODO implement me panic("implement me") } diff --git a/internal/driver/driver.go b/internal/driver/driver.go index 73807775..c328a82b 100644 --- a/internal/driver/driver.go +++ b/internal/driver/driver.go @@ -29,22 +29,26 @@ type Other interface { } type Reader interface { - List(ctx context.Context, dir model.Object) ([]model.Object, error) - Link(ctx context.Context, file model.Object, args model.LinkArgs) (*model.Link, error) + // List list files in the path + // if identify files by path, need to set ID with path,like stdpath.Join(dir.GetID(), obj.GetName()) + // if identify files by id, need to set ID with corresponding id + List(ctx context.Context, dir model.Obj) ([]model.Obj, error) + // Link get url/filepath/reader of file + Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error) //Get(ctx context.Context, path string) (FileInfo, error) // maybe not need } type Writer interface { // MakeDir make a folder named `dirName` in `parentDir` - MakeDir(ctx context.Context, parentDir model.Object, dirName string) error + MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error // Move move `srcObject` to `dstDir` - Move(ctx context.Context, srcObject, dstDir model.Object) error + Move(ctx context.Context, srcObj, dstDir model.Obj) error // Rename rename `srcObject` to `newName` - Rename(ctx context.Context, srcObject model.Object, newName string) error + Rename(ctx context.Context, srcObj model.Obj, newName string) error // Copy copy `srcObject` to `dstDir` - Copy(ctx context.Context, srcObject, dstDir model.Object) error + Copy(ctx context.Context, srcObj, dstDir model.Obj) error // Remove remove `object` - Remove(ctx context.Context, object model.Object) error + Remove(ctx context.Context, obj model.Obj) error // Put put `stream` to `parentDir` - Put(ctx context.Context, parentDir model.Object, stream model.FileStreamer) error + Put(ctx context.Context, parentDir model.Obj, stream model.FileStreamer) error } diff --git a/internal/fs/read.go b/internal/fs/read.go index ce9d9393..5c472b22 100644 --- a/internal/fs/read.go +++ b/internal/fs/read.go @@ -15,7 +15,7 @@ import ( // List files // TODO: hide // TODO: sort -func List(ctx context.Context, path string) ([]model.Object, error) { +func List(ctx context.Context, path string) ([]model.Obj, error) { account, actualPath, err := operations.GetAccountAndActualPath(path) virtualFiles := operations.GetAccountVirtualFilesByPath(path) if err != nil { @@ -40,7 +40,7 @@ func List(ctx context.Context, path string) ([]model.Object, error) { return files, nil } -func Get(ctx context.Context, path string) (model.Object, error) { +func Get(ctx context.Context, path string) (model.Obj, error) { path = utils.StandardizationPath(path) // maybe a virtual file if path != "/" { @@ -55,7 +55,7 @@ func Get(ctx context.Context, path string) (model.Object, error) { if err != nil { // if there are no account prefix with path, maybe root folder if path == "/" { - return model.File{ + return model.Object{ Name: "root", Size: 0, Modified: time.Time{}, diff --git a/internal/fs/util.go b/internal/fs/util.go index bf7c571e..4e328d63 100644 --- a/internal/fs/util.go +++ b/internal/fs/util.go @@ -12,7 +12,7 @@ import ( "github.com/pkg/errors" ) -func containsByName(files []model.Object, file model.Object) bool { +func containsByName(files []model.Obj, file model.Obj) bool { for _, f := range files { if f.GetName() == file.GetName() { return true @@ -23,7 +23,7 @@ func containsByName(files []model.Object, file model.Object) bool { var httpClient = &http.Client{} -func getFileStreamFromLink(file model.Object, link *model.Link) (model.FileStreamer, error) { +func getFileStreamFromLink(file model.Obj, link *model.Link) (model.FileStreamer, error) { var rc io.ReadCloser mimetype := mime.TypeByExtension(stdpath.Ext(file.GetName())) if link.Data != nil { @@ -57,7 +57,7 @@ func getFileStreamFromLink(file model.Object, link *model.Link) (model.FileStrea mimetype = "application/octet-stream" } stream := model.FileStream{ - Object: file, + Obj: file, ReadCloser: rc, Mimetype: mimetype, } diff --git a/internal/model/file.go b/internal/model/file.go deleted file mode 100644 index e8753c07..00000000 --- a/internal/model/file.go +++ /dev/null @@ -1,31 +0,0 @@ -package model - -import "time" - -type File struct { - ID string - Name string - Size uint64 - Modified time.Time - IsFolder bool -} - -func (f File) GetName() string { - return f.Name -} - -func (f File) GetSize() uint64 { - return f.Size -} - -func (f File) ModTime() time.Time { - return f.Modified -} - -func (f File) IsDir() bool { - return f.IsFolder -} - -func (f File) GetID() string { - return f.ID -} diff --git a/internal/model/obj.go b/internal/model/obj.go new file mode 100644 index 00000000..1314c286 --- /dev/null +++ b/internal/model/obj.go @@ -0,0 +1,28 @@ +package model + +import ( + "io" + "time" +) + +type Obj interface { + GetSize() uint64 + GetName() string + ModTime() time.Time + IsDir() bool + GetID() string +} + +type FileStreamer interface { + io.ReadCloser + Obj + GetMimetype() string +} + +type URL interface { + URL() string +} + +type Thumbnail interface { + Thumbnail() string +} diff --git a/internal/model/object.go b/internal/model/object.go index 951aed18..463d21a4 100644 --- a/internal/model/object.go +++ b/internal/model/object.go @@ -1,28 +1,31 @@ package model -import ( - "io" - "time" -) +import "time" -type Object interface { - GetSize() uint64 - GetName() string - ModTime() time.Time - IsDir() bool - GetID() string +type Object struct { + ID string + Name string + Size uint64 + Modified time.Time + IsFolder bool } -type FileStreamer interface { - io.ReadCloser - Object - GetMimetype() string +func (f Object) GetName() string { + return f.Name } -type URL interface { - URL() string +func (f Object) GetSize() uint64 { + return f.Size } -type Thumbnail interface { - Thumbnail() string +func (f Object) ModTime() time.Time { + return f.Modified +} + +func (f Object) IsDir() bool { + return f.IsFolder +} + +func (f Object) GetID() string { + return f.ID } diff --git a/internal/model/stream.go b/internal/model/stream.go index 90fbe991..43a0a200 100644 --- a/internal/model/stream.go +++ b/internal/model/stream.go @@ -5,7 +5,7 @@ import ( ) type FileStream struct { - Object + Obj io.ReadCloser Mimetype string } diff --git a/internal/operations/account.go b/internal/operations/account.go index 2b949a5d..97b83f88 100644 --- a/internal/operations/account.go +++ b/internal/operations/account.go @@ -136,8 +136,8 @@ func getAccountsByPath(path string) []driver.Driver { // GetAccountVirtualFilesByPath Obtain the virtual file generated by the account according to the path // for example, there are: /a/b,/a/c,/a/d/e,/a/b.balance1,/av // GetAccountVirtualFilesByPath(/a) => b,c,d -func GetAccountVirtualFilesByPath(prefix string) []model.Object { - files := make([]model.Object, 0) +func GetAccountVirtualFilesByPath(prefix string) []model.Obj { + files := make([]model.Obj, 0) accounts := accountsMap.Values() sort.Slice(accounts, func(i, j int) bool { if accounts[i].GetAccount().Index == accounts[j].GetAccount().Index { @@ -165,7 +165,7 @@ func GetAccountVirtualFilesByPath(prefix string) []model.Object { if _, ok := set[name]; ok { continue } - files = append(files, model.File{ + files = append(files, model.Object{ Name: name, Size: 0, Modified: v.GetAccount().Modified, diff --git a/internal/operations/fs.go b/internal/operations/fs.go index 6163b343..4a2466bf 100644 --- a/internal/operations/fs.go +++ b/internal/operations/fs.go @@ -16,11 +16,11 @@ import ( // In order to facilitate adding some other things before and after file operations -var filesCache = cache.NewMemCache(cache.WithShards[[]model.Object](64)) -var filesG singleflight.Group[[]model.Object] +var filesCache = cache.NewMemCache(cache.WithShards[[]model.Obj](64)) +var filesG singleflight.Group[[]model.Obj] // List files in storage, not contains virtual file -func List(ctx context.Context, account driver.Driver, path string) ([]model.Object, error) { +func List(ctx context.Context, account driver.Driver, path string) ([]model.Obj, error) { dir, err := Get(ctx, account, path) if err != nil { return nil, errors.WithMessage(err, "failed get dir") @@ -32,13 +32,13 @@ func List(ctx context.Context, account driver.Driver, path string) ([]model.Obje if files, ok := filesCache.Get(key); ok { return files, nil } - files, err, _ := filesG.Do(key, func() ([]model.Object, error) { + files, err, _ := filesG.Do(key, func() ([]model.Obj, error) { files, err := account.List(ctx, dir) if err != nil { return nil, errors.WithMessage(err, "failed to list files") } // TODO: maybe can get duration from account's config - filesCache.Set(key, files, cache.WithEx[[]model.Object](time.Minute*time.Duration(conf.Conf.CaCheExpiration))) + filesCache.Set(key, files, cache.WithEx[[]model.Obj](time.Minute*time.Duration(conf.Conf.CaCheExpiration))) return files, nil }) return files, err @@ -46,10 +46,10 @@ func List(ctx context.Context, account driver.Driver, path string) ([]model.Obje // Get get object from list of files // TODO: maybe should set object ID with path here -func Get(ctx context.Context, account driver.Driver, path string) (model.Object, error) { +func Get(ctx context.Context, account driver.Driver, path string) (model.Obj, error) { // is root folder if r, ok := account.GetAddition().(driver.IRootFolderId); ok && utils.PathEqual(path, "/") { - return model.File{ + return model.Object{ ID: r.GetRootFolderId(), Name: "root", Size: 0, @@ -58,7 +58,7 @@ func Get(ctx context.Context, account driver.Driver, path string) (model.Object, }, nil } if r, ok := account.GetAddition().(driver.IRootFolderPath); ok && utils.PathEqual(path, r.GetRootFolderPath()) { - return model.File{ + return model.Object{ ID: r.GetRootFolderPath(), Name: "root", Size: 0, @@ -138,34 +138,34 @@ func MakeDir(ctx context.Context, account driver.Driver, path string) error { } func Move(ctx context.Context, account driver.Driver, srcPath, dstPath string) error { - srcObject, err := Get(ctx, account, srcPath) + srcObj, err := Get(ctx, account, srcPath) if err != nil { return errors.WithMessage(err, "failed to get src object") } dstDir, err := Get(ctx, account, stdpath.Dir(dstPath)) - return account.Move(ctx, srcObject, dstDir) + return account.Move(ctx, srcObj, dstDir) } func Rename(ctx context.Context, account driver.Driver, srcPath, dstName string) error { - srcObject, err := Get(ctx, account, srcPath) + srcObj, err := Get(ctx, account, srcPath) if err != nil { return errors.WithMessage(err, "failed to get src object") } - return account.Rename(ctx, srcObject, dstName) + return account.Rename(ctx, srcObj, dstName) } // Copy Just copy file[s] in an account func Copy(ctx context.Context, account driver.Driver, srcPath, dstPath string) error { - srcObject, err := Get(ctx, account, srcPath) + srcObj, err := Get(ctx, account, srcPath) if err != nil { return errors.WithMessage(err, "failed to get src object") } dstDir, err := Get(ctx, account, stdpath.Dir(dstPath)) - return account.Copy(ctx, srcObject, dstDir) + return account.Copy(ctx, srcObj, dstDir) } func Remove(ctx context.Context, account driver.Driver, path string) error { - object, err := Get(ctx, account, path) + obj, err := Get(ctx, account, path) if err != nil { // if object not found, it's ok if driver.IsErrObjectNotFound(err) { @@ -173,7 +173,7 @@ func Remove(ctx context.Context, account driver.Driver, path string) error { } return errors.WithMessage(err, "failed to get object") } - return account.Remove(ctx, object) + return account.Remove(ctx, obj) } func Put(ctx context.Context, account driver.Driver, parentPath string, file model.FileStreamer) error {