feat: images
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
package images
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var ErrNotAnImage = errors.New("not an image")
|
||||
|
||||
func (s *Service) getMime(path string) (mimeType string, err error) {
|
||||
info, err := s.fs.Stat(path)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("image file info could not be fetched")
|
||||
}
|
||||
|
||||
if mimer, ok := info.(interface{ ContentType() string }); ok {
|
||||
mimeType = mimer.ContentType()
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (s *Service) GetImage(ctx context.Context, uid string) (img io.Reader, mimeType string, err error) {
|
||||
path, err := PathFromUID(uid)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("could not get path: %w", err)
|
||||
return
|
||||
}
|
||||
mimeType, err = s.getMime(path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(mimeType, "image") {
|
||||
err = ErrNotAnImage
|
||||
return
|
||||
}
|
||||
|
||||
file, err := s.fs.Read(path)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("image file could not be fetched")
|
||||
}
|
||||
|
||||
return bytes.NewBuffer(file), mimeType, err
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package images
|
||||
|
||||
import "os"
|
||||
|
||||
type Service struct {
|
||||
fs fileSystem
|
||||
}
|
||||
|
||||
func New(fs fileSystem) *Service {
|
||||
return &Service{
|
||||
fs: fs,
|
||||
}
|
||||
}
|
||||
|
||||
type fileSystem interface {
|
||||
Read(path string) ([]byte, error)
|
||||
Stat(path string) (os.FileInfo, error)
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
|
||||
"git.schreifuchs.ch/schreifuchs/schreifuchs.ch/internal/components/images"
|
||||
"git.schreifuchs.ch/schreifuchs/schreifuchs.ch/internal/components/translate"
|
||||
"git.schreifuchs.ch/schreifuchs/schreifuchs.ch/internal/filesystem"
|
||||
"github.com/studio-b12/gowebdav"
|
||||
)
|
||||
|
||||
@@ -34,25 +35,28 @@ func (s *Service) getPageHeaders(ctx context.Context, uid string) (page PageHead
|
||||
|
||||
lang := translate.Language(ctx)
|
||||
|
||||
var coverImage *gowebdav.File
|
||||
var contentMD *gowebdav.File
|
||||
var coverImage filesystem.FileInfo
|
||||
var contentMD filesystem.FileInfo
|
||||
|
||||
for _, f := range info {
|
||||
file := f.(gowebdav.File)
|
||||
file, ok := f.(filesystem.FileInfo)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
if strings.HasPrefix(file.ContentType(), "image/") {
|
||||
coverImage = &file
|
||||
coverImage = file
|
||||
}
|
||||
|
||||
parts := strings.Split(file.Name(), ".")
|
||||
|
||||
// fallback content
|
||||
if contentMD == nil && len(parts) == 2 && parts[1] == "md" {
|
||||
contentMD = &file
|
||||
contentMD = file
|
||||
}
|
||||
// language content
|
||||
if len(parts) == 3 && parts[1] == lang && parts[2] == "md" {
|
||||
contentMD = &file
|
||||
contentMD = file
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +75,9 @@ func (s *Service) getPageHeaders(ctx context.Context, uid string) (page PageHead
|
||||
|
||||
page.UID = uid
|
||||
page.Title = title[1]
|
||||
page.CoverImageUID, err = images.UIDFromPath(coverImage.Path())
|
||||
if coverImage != nil {
|
||||
page.CoverImageUID, err = images.UIDFromPath(coverImage.Path())
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -3,14 +3,14 @@ package page
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"github.com/studio-b12/gowebdav"
|
||||
"git.schreifuchs.ch/schreifuchs/schreifuchs.ch/internal/filesystem"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
fs *gowebdav.Client
|
||||
fs filesystem.FS
|
||||
}
|
||||
|
||||
func New(fs *gowebdav.Client) *Service {
|
||||
func New(fs filesystem.FS) *Service {
|
||||
info, err := fs.ReadDir("/")
|
||||
if err != nil {
|
||||
slog.Error("could not read dir", "err", err)
|
||||
|
||||
Reference in New Issue
Block a user