service.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package dropboxfs
  2. import (
  3. "io"
  4. "os"
  5. "strings"
  6. "time"
  7. "dev.hexasoftware.com/hxs/cloudmount/internal/fs/basefs"
  8. "github.com/dropbox/dropbox-sdk-go-unofficial/dropbox"
  9. dbfiles "github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/files"
  10. )
  11. // Service basefs Service implementation
  12. type Service struct {
  13. dbconfig dropbox.Config
  14. }
  15. func (s *Service) Changes() error {
  16. log.Println("Checking changes")
  17. fileService := dbfiles.New(s.dbconfig)
  18. if fileService == nil {
  19. log.Println("File service is nill")
  20. return nil
  21. }
  22. res, err := fileService.ListFolderLongpoll(dbfiles.NewListFolderLongpollArg(""))
  23. if err != nil {
  24. log.Println("Err in longpoll", err)
  25. return nil
  26. }
  27. log.Println("Has Changes:", res.Changes)
  28. log.Println("Backoff:", res.Backoff)
  29. return nil
  30. }
  31. // ListAll implementation
  32. func (s *Service) ListAll() ([]*basefs.File, error) {
  33. fileService := dbfiles.New(s.dbconfig)
  34. // Some how list all files from Dropbox
  35. log.Println("Loading meta data")
  36. ret := []*basefs.File{}
  37. var err error
  38. var res *dbfiles.ListFolderResult
  39. res, err = fileService.ListFolder(&dbfiles.ListFolderArg{Recursive: true, Path: "/test", IncludeDeleted: false, IncludeMediaInfo: false})
  40. if err != nil {
  41. log.Println("Error listing:", err)
  42. return nil, err
  43. }
  44. log.Println("Loaded: res.Entries", len(res.Entries))
  45. for _, e := range res.Entries {
  46. ret = append(ret, File(e))
  47. }
  48. for res.HasMore {
  49. res, err = fileService.ListFolderContinue(&dbfiles.ListFolderContinueArg{Cursor: res.Cursor})
  50. log.Println("Loaded: res.Entries", len(res.Entries))
  51. for _, e := range res.Entries {
  52. ret = append(ret, File(e))
  53. }
  54. }
  55. return ret, nil
  56. }
  57. // Create file implementation
  58. func (s *Service) Create(parent *basefs.File, name string, isDir bool) (*basefs.File, error) {
  59. fileService := dbfiles.New(s.dbconfig)
  60. if isDir {
  61. data, err := fileService.CreateFolder(&dbfiles.CreateFolderArg{
  62. Autorename: false,
  63. Path: parent.ID + "/" + name,
  64. })
  65. if err != nil {
  66. return nil, err
  67. }
  68. return File(data), nil
  69. }
  70. newPath := parent.ID + "/" + name
  71. // For file we create Local entry but do nothing, since dropbox does not upload local empty files
  72. metadata := &dbfiles.FileMetadata{}
  73. metadata.Id = newPath
  74. metadata.Name = name
  75. metadata.ServerModified = time.Now().UTC()
  76. metadata.PathLower = strings.ToLower(newPath)
  77. return File(metadata), nil
  78. }
  79. // Upload file implementation
  80. func (s *Service) Upload(reader io.Reader, file *basefs.File) (*basefs.File, error) {
  81. fileService := dbfiles.New(s.dbconfig)
  82. data, err := fileService.Upload(&dbfiles.CommitInfo{
  83. Path: file.ID, // ???
  84. Autorename: false,
  85. Mode: &dbfiles.WriteMode{Tagged: dropbox.Tagged{Tag: dbfiles.WriteModeOverwrite}},
  86. //ClientModified: time.Now().UTC(),
  87. }, reader.(io.Reader))
  88. if err != nil {
  89. log.Println("Upload Error:", err)
  90. return nil, err
  91. }
  92. return File(data), nil
  93. }
  94. // DownloadTo implementation
  95. func (s *Service) DownloadTo(w io.Writer, file *basefs.File) error {
  96. fileService := dbfiles.New(s.dbconfig)
  97. _, content, err := fileService.Download(&dbfiles.DownloadArg{Path: file.ID})
  98. if err != nil {
  99. return err
  100. }
  101. defer content.Close()
  102. io.Copy(w, content)
  103. return nil
  104. }
  105. // Move and Rename file implementation
  106. func (s *Service) Move(file *basefs.File, newParent *basefs.File, name string) (*basefs.File, error) {
  107. fileService := dbfiles.New(s.dbconfig)
  108. res, err := fileService.Move(&dbfiles.RelocationArg{
  109. RelocationPath: dbfiles.RelocationPath{
  110. FromPath: file.ID,
  111. ToPath: newParent.ID + "/" + name,
  112. },
  113. })
  114. if err != nil {
  115. return nil, err
  116. }
  117. return File(res), nil
  118. }
  119. // Delete deletes a file entry (including Dir)
  120. func (s *Service) Delete(file *basefs.File) error {
  121. fileService := dbfiles.New(s.dbconfig)
  122. _, err := fileService.Delete(&dbfiles.DeleteArg{Path: file.ID})
  123. if err != nil {
  124. return err
  125. }
  126. return nil
  127. }
  128. // File Metadata to File Converter
  129. func File(metadata dbfiles.IsMetadata) *basefs.File {
  130. var ID string
  131. var name string
  132. var modifiedTime time.Time
  133. var mode = os.FileMode(0644)
  134. var size uint64
  135. //var parentID string
  136. switch t := metadata.(type) {
  137. case *dbfiles.FileMetadata:
  138. ID = t.PathLower
  139. name = t.Name
  140. modifiedTime = t.ServerModified
  141. size = t.Size
  142. case *dbfiles.FolderMetadata:
  143. ID = t.PathLower
  144. name = t.Name
  145. mode = os.FileMode(0755) | os.ModeDir
  146. modifiedTime = time.Now()
  147. //parentID = t.SharedFolderId
  148. }
  149. createdTime := modifiedTime
  150. //log.Println("ParentID:", parentID)
  151. pathParts := strings.Split(ID, "/")
  152. parentID := strings.Join(pathParts[:len(pathParts)-1], "/")
  153. parents := []string{}
  154. if parentID != "" {
  155. parents = []string{parentID}
  156. }
  157. file := &basefs.File{
  158. ID: ID,
  159. Name: name,
  160. Parents: parents,
  161. Size: size,
  162. CreatedTime: createdTime,
  163. ModifiedTime: modifiedTime,
  164. AccessedTime: modifiedTime,
  165. Mode: mode,
  166. }
  167. //log.Println("FileID is:", file.ID)
  168. return file
  169. }