feat: images

This commit is contained in:
2026-02-23 09:50:42 +01:00
parent 3f321f0836
commit 6f98d730bb
21 changed files with 518 additions and 29 deletions
+49
View File
@@ -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
}
+18
View File
@@ -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 -7
View File
@@ -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 -3
View File
@@ -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)