diff --git a/drivers/template/driver.go b/drivers/template/driver.go new file mode 100644 index 00000000..a597702a --- /dev/null +++ b/drivers/template/driver.go @@ -0,0 +1,149 @@ +package template + +import ( + "github.com/Xhofe/alist/conf" + "github.com/Xhofe/alist/drivers/base" + "github.com/Xhofe/alist/model" + "github.com/Xhofe/alist/utils" + "path/filepath" +) + +type Template struct { +} + +func (driver Template) Config() base.DriverConfig { + return base.DriverConfig{ + Name: "Template", + OnlyProxy: false, + OnlyLocal: false, + ApiProxy: false, + NoNeedSetLink: false, + NoCors: false, + LocalSort: false, + } +} + +func (driver Template) Items() []base.Item { + // TODO fill need info + return []base.Item{ + { + Name: "refresh_token", + Label: "refresh token", + Type: base.TypeString, + Required: true, + }, + { + Name: "root_folder", + Label: "root folder path", + Type: base.TypeString, + Default: "/", + Required: true, + }, + } +} + +func (driver Template) Save(account *model.Account, old *model.Account) error { + // TODO test available or init + return nil +} + +func (driver Template) File(path string, account *model.Account) (*model.File, error) { + path = utils.ParsePath(path) + if path == "/" { + return &model.File{ + Id: account.RootFolder, + Name: account.Name, + Size: 0, + Type: conf.FOLDER, + Driver: driver.Config().Name, + UpdatedAt: account.UpdatedAt, + }, nil + } + dir, name := filepath.Split(path) + files, err := driver.Files(dir, account) + if err != nil { + return nil, err + } + for _, file := range files { + if file.Name == name { + return &file, nil + } + } + return nil, base.ErrPathNotFound +} + +func (driver Template) Files(path string, account *model.Account) ([]model.File, error) { + path = utils.ParsePath(path) + cache, err := base.GetCache(path, account) + if err == nil { + files, _ := cache.([]model.File) + return files, nil + } + var files []model.File + // TODO get files + if err != nil { + return nil, err + } + if len(files) > 0 { + _ = base.SetCache(path, files, account) + } + return files, nil +} + +func (driver Template) Link(args base.Args, account *model.Account) (*base.Link, error) { + // TODO get file link + return nil, base.ErrNotImplement +} + +func (driver Template) Path(path string, account *model.Account) (*model.File, []model.File, error) { + path = utils.ParsePath(path) + file, err := driver.File(path, account) + if err != nil { + return nil, nil, err + } + if !file.IsDir() { + return file, nil, nil + } + files, err := driver.Files(path, account) + if err != nil { + return nil, nil, err + } + return nil, files, nil +} + +func (driver Template) Preview(path string, account *model.Account) (interface{}, error) { + //TODO preview interface if driver support + return nil, base.ErrNotImplement +} + +func (driver Template) MakeDir(path string, account *model.Account) error { + //TODO make dir + return base.ErrNotImplement +} + +func (driver Template) Move(src string, dst string, account *model.Account) error { + //TODO move file/dir + return base.ErrNotImplement +} + +func (driver Template) Rename(src string, dst string, account *model.Account) error { + //TODO rename file/dir + return base.ErrNotImplement +} + +func (driver Template) Copy(src string, dst string, account *model.Account) error { + //TODO copy file/dir + return base.ErrNotImplement +} + +func (driver Template) Delete(path string, account *model.Account) error { + //TODO delete file/dir + return base.ErrNotImplement +} + +func (driver Template) Upload(file *model.FileStream, account *model.Account) error { + //TODO upload file + return base.ErrNotImplement +} + +var _ base.Driver = (*Template)(nil) diff --git a/drivers/template/template.go b/drivers/template/template.go new file mode 100644 index 00000000..3fa3733f --- /dev/null +++ b/drivers/template/template.go @@ -0,0 +1,90 @@ +package template + +import ( + "errors" + "github.com/Xhofe/alist/conf" + "github.com/Xhofe/alist/drivers/base" + "github.com/Xhofe/alist/model" + "github.com/Xhofe/alist/utils" + "github.com/go-resty/resty/v2" + "path" +) + +func LoginOrRefreshToken(account *model.Account) error { + return nil +} + +func Request(u string, method int, headers, query, form map[string]string, data interface{}, resp interface{}, account *model.Account) ([]byte, error) { + req := base.RestyClient.R() + req.SetHeaders(map[string]string{ + "Authorization": "Bearer" + account.AccessToken, + "Accept": "application/json, text/plain, */*", + }) + if headers != nil { + req.SetHeaders(headers) + } + if query != nil { + req.SetQueryParams(query) + } + if form != nil { + req.SetFormData(form) + } + if data != nil { + req.SetBody(data) + } + if resp != nil { + req.SetResult(resp) + } + var e Resp + var err error + var res *resty.Response + req.SetError(&e) + switch method { + case base.Get: + res, err = req.Get(u) + case base.Post: + res, err = req.Post(u) + case base.Delete: + res, err = req.Delete(u) + case base.Patch: + res, err = req.Patch(u) + case base.Put: + res, err = req.Put(u) + default: + return nil, base.ErrNotSupport + } + if err != nil { + return nil, err + } + if e.Code >= 400 { + if e.Code == 401 { + err = LoginOrRefreshToken(account) + if err != nil { + return nil, err + } + return Request(u, method, headers, query, form, data, resp, account) + } + return nil, errors.New(e.Message) + } + return res.Body(), nil +} + +func (driver Template) formatFile(f *File) *model.File { + file := model.File{ + Id: f.Id, + Name: f.FileName, + Size: f.Size, + Driver: driver.Config().Name, + UpdatedAt: f.UpdatedAt, + } + if f.File { + file.Type = utils.GetFileType(path.Ext(f.FileName)) + } else { + file.Type = conf.FOLDER + } + return &file +} + +func init() { + base.RegisterDriver(&Template{}) +} diff --git a/drivers/template/types.go b/drivers/template/types.go new file mode 100644 index 00000000..fbcc8268 --- /dev/null +++ b/drivers/template/types.go @@ -0,0 +1,18 @@ +package template + +import "time" + +// write all struct here + +type Resp struct { + Code int `json:"code"` + Message string `json:"message"` +} + +type File struct { + Id string `json:"id"` + FileName string `json:"file_name"` + Size int64 `json:"size"` + File bool `json:"file"` + UpdatedAt *time.Time `json:"updated_at"` +} diff --git a/drivers/template/util.go b/drivers/template/util.go new file mode 100644 index 00000000..914c349f --- /dev/null +++ b/drivers/template/util.go @@ -0,0 +1,3 @@ +package template + +// write util func here, such as cal sign