From 408bb88cb89a1fe16ebeff98108a8c5d0f8c78c6 Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Sun, 9 Jul 2023 19:09:54 +0200 Subject: [PATCH] renaming and cleanup --- app/repository/interfaces.go | 7 +++++++ domain/model/binary_file.go | 17 +++++++++++++++++ domain/model/binary_file_test.go | 13 +++++++++++++ infra/binary_file_repository.go | 11 +++++++++++ web/app.go | 3 +-- web/media_handler.go | 2 +- 6 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 domain/model/binary_file_test.go diff --git a/app/repository/interfaces.go b/app/repository/interfaces.go index 6c34079..ae51e39 100644 --- a/app/repository/interfaces.go +++ b/app/repository/interfaces.go @@ -14,11 +14,18 @@ type EntryRepository interface { } type BinaryRepository interface { + // Create creates a new binary file + // The name is the original file name, and is not unique + // BinaryFile.Id is a unique identifier Create(name string, data []byte) (*model.BinaryFile, error) FindById(id string) (*model.BinaryFile, error) } type AuthorRepository interface { + // Create creates a new author + // It returns an error if the name is already taken Create(name string, passwordHash string) (*model.Author, error) + // FindByName finds an author by name + // It returns an error if the author is not found FindByName(name string) (*model.Author, error) } diff --git a/domain/model/binary_file.go b/domain/model/binary_file.go index 0c9da91..50450e8 100644 --- a/domain/model/binary_file.go +++ b/domain/model/binary_file.go @@ -1,7 +1,24 @@ package model +import ( + "mime" + "strings" +) + type BinaryFile struct { Id string Name string Data []byte } + +func (b *BinaryFile) Mime() string { + parts := strings.Split(b.Name, ".") + if len(parts) < 2 { + return "application/octet-stream" + } + t := mime.TypeByExtension("." + parts[len(parts)-1]) + if t == "" { + return "application/octet-stream" + } + return t +} diff --git a/domain/model/binary_file_test.go b/domain/model/binary_file_test.go new file mode 100644 index 0000000..1d5afaf --- /dev/null +++ b/domain/model/binary_file_test.go @@ -0,0 +1,13 @@ +package model_test + +import ( + "owl-blogs/domain/model" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMimeType(t *testing.T) { + bin := model.BinaryFile{Name: "test.jpg"} + require.Equal(t, "image/jpeg", bin.Mime()) +} diff --git a/infra/binary_file_repository.go b/infra/binary_file_repository.go index 361539c..0adba28 100644 --- a/infra/binary_file_repository.go +++ b/infra/binary_file_repository.go @@ -3,6 +3,7 @@ package infra import ( "owl-blogs/app/repository" "owl-blogs/domain/model" + "strings" "github.com/google/uuid" "github.com/jmoiron/sqlx" @@ -18,6 +19,8 @@ type DefaultBinaryFileRepo struct { db *sqlx.DB } +// NewBinaryFileRepo creates a new binary file repository +// It creates the table if not exists func NewBinaryFileRepo(db Database) repository.BinaryRepository { sqlxdb := db.Get() @@ -33,8 +36,15 @@ func NewBinaryFileRepo(db Database) repository.BinaryRepository { return &DefaultBinaryFileRepo{db: sqlxdb} } +// Create implements repository.BinaryRepository func (repo *DefaultBinaryFileRepo) Create(name string, data []byte) (*model.BinaryFile, error) { id := uuid.New().String() + parts := strings.Split(name, ".") + if len(parts) > 1 { + ext := parts[len(parts)-1] + id = id + "." + ext + } + _, err := repo.db.Exec("INSERT INTO binary_files (id, name, data) VALUES (?, ?, ?)", id, name, data) if err != nil { return nil, err @@ -42,6 +52,7 @@ func (repo *DefaultBinaryFileRepo) Create(name string, data []byte) (*model.Bina return &model.BinaryFile{Id: id, Name: name, Data: data}, nil } +// FindById implements repository.BinaryRepository func (repo *DefaultBinaryFileRepo) FindById(id string) (*model.BinaryFile, error) { var sqlFile sqlBinaryFile err := repo.db.Get(&sqlFile, "SELECT * FROM binary_files WHERE id = ?", id) diff --git a/web/app.go b/web/app.go index 583683e..9ee3d12 100644 --- a/web/app.go +++ b/web/app.go @@ -47,12 +47,11 @@ func NewWebApp( app.Get("/", indexHandler.Handle) app.Get("/lists/:list/", listHandler.Handle) // Media - app.Get("/media/:id", mediaHandler.Handle) + app.Get("/media/+", mediaHandler.Handle) // RSS app.Get("/index.xml", rssHandler.Handle) // Posts app.Get("/posts/:post/", entryHandler.Handle) - app.Get("/posts/:post/media/*filepath", mediaHandler.Handle) // Webmention // app.Post("/webmention/", userWebmentionHandler(repo)) // Micropub diff --git a/web/media_handler.go b/web/media_handler.go index 7fb7e5f..3ee211e 100644 --- a/web/media_handler.go +++ b/web/media_handler.go @@ -15,7 +15,7 @@ func NewMediaHandler(binaryService *app.BinaryService) *MediaHandler { } func (h *MediaHandler) Handle(c *fiber.Ctx) error { - id := c.Params("id") + id := c.Params("+") binary, err := h.binaryService.FindById(id) if err != nil { return err