diff --git a/internal/server/controllers/browse.go b/internal/server/controllers/browse.go new file mode 100644 index 0000000..6277053 --- /dev/null +++ b/internal/server/controllers/browse.go @@ -0,0 +1,12 @@ +package controllers + +import ( + "git.zervo.org/zervo/fileserver/internal/config" + "github.com/kataras/iris/v12" +) + +// BrowseRoute registers all routes under '/b' (aka browse). +func BrowseRoute(app *iris.Application, cfg *config.Config) { + party := app.Party("/b") + party.Get("/{directory}/{path:path}") +} diff --git a/internal/server/controllers/directories.go b/internal/server/controllers/directories.go index deb97f7..847218a 100644 --- a/internal/server/controllers/directories.go +++ b/internal/server/controllers/directories.go @@ -6,7 +6,7 @@ import ( "github.com/kataras/iris/v12" ) -// DirectoriesRoute registers all routes under /directories +// DirectoriesRoute registers all routes under '/directories'. func DirectoriesRoute(app *iris.Application, cfg *config.Config) { party := app.Party("/directories") diff --git a/internal/server/views/browse.go b/internal/server/views/browse.go new file mode 100644 index 0000000..a921e4a --- /dev/null +++ b/internal/server/views/browse.go @@ -0,0 +1,24 @@ +package views + +import ( + "fmt" + + "git.zervo.org/zervo/fileserver/internal/config" + "git.zervo.org/zervo/fileserver/internal/util/data" + "github.com/kataras/iris/v12" +) + +type browsepage struct { +} + +func BrowseView(ctx iris.Context, cfg *config.Config) { + ctx.CompressWriter(true) + ctx.ViewData("", data.LayoutData{ + ServerName: cfg.ServerName, + ServerVersion: "0.0.1", + }) + if err := ctx.View("browse.html"); err != nil { + errorView(ctx, fmt.Errorf("Failed to render BrowseView: %v", err)) + return + } +} diff --git a/internal/util/fs.go b/internal/util/fs.go new file mode 100644 index 0000000..4ba923b --- /dev/null +++ b/internal/util/fs.go @@ -0,0 +1,15 @@ +package util + +import "os" + +// FileExists returns whether the given file or directory exists. +func FileExists(path string) (bool, error) { + _, err := os.Stat(path) + if err != nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} diff --git a/internal/validation/directories.go b/internal/validation/directories.go new file mode 100644 index 0000000..d7dec4f --- /dev/null +++ b/internal/validation/directories.go @@ -0,0 +1,20 @@ +package validation + +import ( + "fmt" + + "git.zervo.org/zervo/fileserver/internal/config" + "git.zervo.org/zervo/fileserver/internal/util" +) + +// ValidateDirectories ensure the given directories meet the required criteria to be served. +// Any directory that doesn't meet the requirements gets removed from the slice. +func ValidateDirectories(dirs []config.Directory) { + for i, dir := range dirs { + exists, err := util.FileExists(dir.Path) + if !exists { + fmt.Printf("WARNING: The directory '%s' does not exist and will be delisted. %v", dir.Id, err) + dirs[i] = nil + } + } +}