api_folder.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package httpd
  2. import (
  3. "errors"
  4. "net/http"
  5. "strconv"
  6. "github.com/go-chi/render"
  7. "github.com/drakkan/sftpgo/dataprovider"
  8. "github.com/drakkan/sftpgo/vfs"
  9. )
  10. func getFolders(w http.ResponseWriter, r *http.Request) {
  11. var err error
  12. limit := 100
  13. offset := 0
  14. order := dataprovider.OrderASC
  15. folderPath := ""
  16. if _, ok := r.URL.Query()["limit"]; ok {
  17. limit, err = strconv.Atoi(r.URL.Query().Get("limit"))
  18. if err != nil {
  19. err = errors.New("Invalid limit")
  20. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  21. return
  22. }
  23. if limit > 500 {
  24. limit = 500
  25. }
  26. }
  27. if _, ok := r.URL.Query()["offset"]; ok {
  28. offset, err = strconv.Atoi(r.URL.Query().Get("offset"))
  29. if err != nil {
  30. err = errors.New("Invalid offset")
  31. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  32. return
  33. }
  34. }
  35. if _, ok := r.URL.Query()["order"]; ok {
  36. order = r.URL.Query().Get("order")
  37. if order != dataprovider.OrderASC && order != dataprovider.OrderDESC {
  38. err = errors.New("Invalid order")
  39. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  40. return
  41. }
  42. }
  43. if _, ok := r.URL.Query()["folder_path"]; ok {
  44. folderPath = r.URL.Query().Get("folder_path")
  45. }
  46. folders, err := dataprovider.GetFolders(dataProvider, limit, offset, order, folderPath)
  47. if err == nil {
  48. render.JSON(w, r, folders)
  49. } else {
  50. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  51. }
  52. }
  53. func addFolder(w http.ResponseWriter, r *http.Request) {
  54. r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
  55. var folder vfs.BaseVirtualFolder
  56. err := render.DecodeJSON(r.Body, &folder)
  57. if err != nil {
  58. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  59. return
  60. }
  61. err = dataprovider.AddFolder(dataProvider, folder)
  62. if err == nil {
  63. folder, err = dataprovider.GetFolderByPath(dataProvider, folder.MappedPath)
  64. if err == nil {
  65. render.JSON(w, r, folder)
  66. } else {
  67. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  68. }
  69. } else {
  70. sendAPIResponse(w, r, err, "", getRespStatus(err))
  71. }
  72. }
  73. func deleteFolderByPath(w http.ResponseWriter, r *http.Request) {
  74. var folderPath string
  75. if _, ok := r.URL.Query()["folder_path"]; ok {
  76. folderPath = r.URL.Query().Get("folder_path")
  77. }
  78. if len(folderPath) == 0 {
  79. err := errors.New("a non-empty folder path is required")
  80. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  81. return
  82. }
  83. folder, err := dataprovider.GetFolderByPath(dataProvider, folderPath)
  84. if _, ok := err.(*dataprovider.RecordNotFoundError); ok {
  85. sendAPIResponse(w, r, err, "", http.StatusNotFound)
  86. return
  87. } else if err != nil {
  88. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  89. return
  90. }
  91. err = dataprovider.DeleteFolder(dataProvider, folder)
  92. if err != nil {
  93. sendAPIResponse(w, r, err, "", http.StatusInternalServerError)
  94. } else {
  95. sendAPIResponse(w, r, err, "Folder deleted", http.StatusOK)
  96. }
  97. }