mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-07 14:50:55 +03:00
virtual folders: change dataprovider structure
This way we no longer depend on the local file system path and so we can add support for cloud backends in future updates
This commit is contained in:
@@ -2,9 +2,7 @@ package httpd
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/go-chi/render"
|
||||
|
||||
@@ -13,42 +11,12 @@ import (
|
||||
)
|
||||
|
||||
func getFolders(w http.ResponseWriter, r *http.Request) {
|
||||
var err error
|
||||
limit := 100
|
||||
offset := 0
|
||||
order := dataprovider.OrderASC
|
||||
folderPath := ""
|
||||
if _, ok := r.URL.Query()["limit"]; ok {
|
||||
limit, err = strconv.Atoi(r.URL.Query().Get("limit"))
|
||||
if err != nil {
|
||||
err = errors.New("Invalid limit")
|
||||
sendAPIResponse(w, r, err, "", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
if limit > 500 {
|
||||
limit = 500
|
||||
}
|
||||
limit, offset, order, err := getSearchFilters(w, r)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if _, ok := r.URL.Query()["offset"]; ok {
|
||||
offset, err = strconv.Atoi(r.URL.Query().Get("offset"))
|
||||
if err != nil {
|
||||
err = errors.New("Invalid offset")
|
||||
sendAPIResponse(w, r, err, "", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
}
|
||||
if _, ok := r.URL.Query()["order"]; ok {
|
||||
order = r.URL.Query().Get("order")
|
||||
if order != dataprovider.OrderASC && order != dataprovider.OrderDESC {
|
||||
err = errors.New("Invalid order")
|
||||
sendAPIResponse(w, r, err, "", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
}
|
||||
if _, ok := r.URL.Query()["folder-path"]; ok {
|
||||
folderPath = r.URL.Query().Get("folder-path")
|
||||
}
|
||||
folders, err := dataprovider.GetFolders(limit, offset, order, folderPath)
|
||||
|
||||
folders, err := dataprovider.GetFolders(limit, offset, order)
|
||||
if err == nil {
|
||||
render.JSON(w, r, folders)
|
||||
} else {
|
||||
@@ -69,31 +37,57 @@ func addFolder(w http.ResponseWriter, r *http.Request) {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
}
|
||||
renderFolder(w, r, folder.MappedPath)
|
||||
renderFolder(w, r, folder.Name, http.StatusCreated)
|
||||
}
|
||||
|
||||
func renderFolder(w http.ResponseWriter, r *http.Request, mappedPath string) {
|
||||
folder, err := dataprovider.GetFolderByPath(mappedPath)
|
||||
func updateFolder(w http.ResponseWriter, r *http.Request) {
|
||||
r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
|
||||
var err error
|
||||
|
||||
name := getURLParam(r, "name")
|
||||
folder, err := dataprovider.GetFolderByName(name)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
}
|
||||
ctx := context.WithValue(r.Context(), render.StatusCtxKey, http.StatusCreated)
|
||||
render.JSON(w, r.WithContext(ctx), folder)
|
||||
}
|
||||
|
||||
func deleteFolderByPath(w http.ResponseWriter, r *http.Request) {
|
||||
var folderPath string
|
||||
if _, ok := r.URL.Query()["folder-path"]; ok {
|
||||
folderPath = r.URL.Query().Get("folder-path")
|
||||
}
|
||||
if folderPath == "" {
|
||||
err := errors.New("a non-empty folder path is required")
|
||||
folderID := folder.ID
|
||||
err = render.DecodeJSON(r.Body, &folder)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
folder.ID = folderID
|
||||
folder.Name = name
|
||||
err = dataprovider.UpdateFolder(&folder)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
}
|
||||
sendAPIResponse(w, r, nil, "Folder updated", http.StatusOK)
|
||||
}
|
||||
|
||||
err := dataprovider.DeleteFolder(folderPath)
|
||||
func renderFolder(w http.ResponseWriter, r *http.Request, name string, status int) {
|
||||
folder, err := dataprovider.GetFolderByName(name)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
}
|
||||
if status != http.StatusOK {
|
||||
ctx := context.WithValue(r.Context(), render.StatusCtxKey, status)
|
||||
render.JSON(w, r.WithContext(ctx), folder)
|
||||
} else {
|
||||
render.JSON(w, r, folder)
|
||||
}
|
||||
}
|
||||
|
||||
func getFolderByName(w http.ResponseWriter, r *http.Request) {
|
||||
name := getURLParam(r, "name")
|
||||
renderFolder(w, r, name, http.StatusOK)
|
||||
}
|
||||
|
||||
func deleteFolder(w http.ResponseWriter, r *http.Request) {
|
||||
name := getURLParam(r, "name")
|
||||
err := dataprovider.DeleteFolder(name)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user