From 728f53c38f73850ed8086cc10bf534880f5f6289 Mon Sep 17 00:00:00 2001 From: Roman Zipp Date: Mon, 14 Feb 2022 15:08:55 +0100 Subject: [PATCH] Add get files endpoint --- controllers/file.go | 50 +++++++++++++++++++++++++++++++++++++++++++++ main.go | 6 ++++++ main_test.go | 35 +++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 controllers/file.go diff --git a/controllers/file.go b/controllers/file.go new file mode 100644 index 0000000..5384780 --- /dev/null +++ b/controllers/file.go @@ -0,0 +1,50 @@ +package controllers + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "time" + + "github.com/geplauder/lithium/pipelines" + "github.com/geplauder/lithium/settings" + "github.com/geplauder/lithium/storage" +) + +type File struct { + Bucket string `json:"bucket"` + FileName string `json:"file_name"` + Size int `json:"size"` + ModifiedAt time.Time `json:"modified_at"` +} + +func FileHandler(w http.ResponseWriter, r *http.Request, pipes []pipelines.IPipeline, storageProvider storage.IStorageProvider, appSettings settings.Settings) { + buckets, err := ioutil.ReadDir("./files/" + appSettings.StorageProvider.BasePath) + if err != nil { + json.NewEncoder(w).Encode(struct { + Files []File `json:"files"` + }{}) + return + } + + var files []File + + for _, b := range buckets { + bucketFiles, err := ioutil.ReadDir("./files/" + appSettings.StorageProvider.BasePath + "/" + b.Name()) + if err != nil { + writeError(w, 500, "Base path not found") + return + } + + for _, f := range bucketFiles { + files = append(files, File{b.Name(), f.Name(), int(f.Size()), f.ModTime()}) + } + } + + err = json.NewEncoder(w).Encode(struct { + Files []File `json:"files"` + }{files}) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + } +} diff --git a/main.go b/main.go index ad1a0f9..6bc9aa2 100644 --- a/main.go +++ b/main.go @@ -29,6 +29,11 @@ func RegisterRoutes(r *mux.Router, appSettings settings.Settings, pipelines []pi controllers.UploadHandler(w, r, pipelines, storageProvider) }) + files := r.Methods(http.MethodGet).Subrouter() + files.HandleFunc("/files", func(w http.ResponseWriter, r *http.Request) { + controllers.FileHandler(w, r, pipelines, storageProvider, appSettings) + }) + pipeline := r.Methods(http.MethodGet).Subrouter() pipeline.HandleFunc("/pipelines/{pipeline}", func(w http.ResponseWriter, r *http.Request) { for _, pipeline := range pipelines { @@ -45,6 +50,7 @@ func RegisterRoutes(r *mux.Router, appSettings settings.Settings, pipelines []pi authMiddleware := middlewares.CreateAuthenticationMiddleware(appSettings.Authentication.Token) upload.Use(authMiddleware.Middleware) + files.Use(authMiddleware.Middleware) pipeline.Use(authMiddleware.Middleware) } } diff --git a/main_test.go b/main_test.go index fe7a5c9..dd5af58 100644 --- a/main_test.go +++ b/main_test.go @@ -6,6 +6,7 @@ import ( "net/http" "net/http/httptest" "testing" + "time" "github.com/geplauder/lithium/controllers" @@ -141,3 +142,37 @@ func TestUploadRoute(t *testing.T) { assert.JSONEq(t, string(str), responseRecorder.Body.String()) }) } + +func TestFilesRoute(t *testing.T) { + data := pipelines.Pipeline{} + err := faker.FakeData(&data) + assert.Nil(t, err) + + t.Run("Files endpoint returns files", func(t *testing.T) { + router := mux.NewRouter() + fs := storage.GetMemoryStorageProvider() + appSettings, _ := settings.LoadSettings(afero.NewMemMapFs()) + + RegisterRoutes(router, appSettings, []pipelines.IPipeline{data}, fs) + + request, _ := http.NewRequest("GET", "/files", nil) + responseRecorder := httptest.NewRecorder() + + router.ServeHTTP(responseRecorder, request) + + type responseBody struct { + Files []struct { + Bucket string `json:"bucket"` + FileName string `json:"file_name"` + Size int `json:"size"` + ModifiedAt time.Time `json:"modified_at"` + } `json:"files"` + } + + var res responseBody + + assert.Equal(t, 200, responseRecorder.Code) + err := json.Unmarshal(responseRecorder.Body.Bytes(), &res) + assert.Nil(t, err) + }) +}