From 14e5580efd51c7b9e70d304715e512a2ea2a1b21 Mon Sep 17 00:00:00 2001 From: "Gabriel A. Giovanini" Date: Fri, 1 Dec 2023 00:26:06 +0100 Subject: feat: Add option to download file --- pkg/service/filesystem.go | 28 ++++++++++++++++++---------- pkg/view/filesystem.go | 21 ++++++++++++++++++++- templates/fs.qtpl | 4 ++-- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/pkg/service/filesystem.go b/pkg/service/filesystem.go index b4479ea..1364fd8 100644 --- a/pkg/service/filesystem.go +++ b/pkg/service/filesystem.go @@ -85,24 +85,32 @@ func getHistory(filepath string) []*DirectoryParam { return result } -func (self *FileSystemController) GetPage(ctx context.Context, userID uint, filepath string) (*Page, error) { - userPath, err := self.userRepository.GetPathFromUserID(ctx, userID) +func (f *FileSystemController) GetFullpath(ctx context.Context, userID uint, filepath string) (string, error) { + userPath, err := f.userRepository.GetPathFromUserID(ctx, userID) if err != nil { - return nil, err + return "", err } - decodedPath, err := url.QueryUnescape(filepath) + + return path.Join(userPath, filepath), nil +} + +func (f *FileSystemController) IsFile(ctx context.Context, fullPath string) (bool, error) { + inf, err := f.fsRepository.Stat(fullPath) if err != nil { - return nil, err + return false, err } - fullPath := path.Join(userPath, decodedPath) - files, err := self.fsRepository.List(fullPath) + return !inf.IsDir(), nil +} + +func (f *FileSystemController) GetPage(ctx context.Context, filename string, fullPath string) (*Page, error) { + + files, err := f.fsRepository.List(fullPath) if err != nil { return nil, err } - params := list.Map(files, func(info fs.FileInfo) *FileParam { - fullPath := path.Join(decodedPath, info.Name()) + fullPath := path.Join(filename, info.Name()) scapedFullPath := url.QueryEscape(fullPath) return &FileParam{ Info: info, @@ -112,6 +120,6 @@ func (self *FileSystemController) GetPage(ctx context.Context, userID uint, file return &Page{ Files: params, - History: getHistory(decodedPath), + History: getHistory(filename), }, nil } diff --git a/pkg/view/filesystem.go b/pkg/view/filesystem.go index 9071ec0..f78f8a6 100644 --- a/pkg/view/filesystem.go +++ b/pkg/view/filesystem.go @@ -1,7 +1,9 @@ package view import ( + "mime" "net/http" + "path/filepath" "git.sr.ht/~gabrielgio/img/pkg/database/repository" "git.sr.ht/~gabrielgio/img/pkg/ext" @@ -37,7 +39,24 @@ func (self *FileSystemView) Index(w http.ResponseWriter, r *http.Request) error user = ext.GetUserFromCtx(r) ) - page, err := self.fsService.GetPage(r.Context(), user.ID, pathValue) + fullpath, err := self.fsService.GetFullpath(r.Context(), user.ID, pathValue) + if err != nil { + return err + } + + isFile, err := self.fsService.IsFile(r.Context(), fullpath) + if err != nil { + return err + } + + if isFile { + mimetype := mime.TypeByExtension(filepath.Ext(fullpath)) + w.Header().Set("Content-Type", mimetype) + http.ServeFile(w, r, fullpath) + return nil + } + + page, err := self.fsService.GetPage(r.Context(), pathValue, fullpath) if err != nil { return err } diff --git a/templates/fs.qtpl b/templates/fs.qtpl index 3dc2c5a..7ffc39c 100644 --- a/templates/fs.qtpl +++ b/templates/fs.qtpl @@ -25,11 +25,11 @@ type FilePage struct { {% if p.ShowMode %}{%s f.Info.Mode().String() %} {% endif %} {% if p.ShowOwner %}{%d f.GetGid() %}:{%d f.GetUid() %} {% endif %} - {% if f.Info.IsDir() %} + {% if f.Info.IsDir() %} {%s f.Info.Name() %}/ {% else %} - {%s f.Info.Name() %} + {%s f.Info.Name() %} {% endif %}
{%dl f.Info.Size() %} B
-- cgit v1.2.3