ref(file_handling): moved template logic out of handler

This commit is contained in:
Kristian Borgwarth 2026-04-06 23:04:17 +02:00
parent aa9232fd07
commit a2a6c2743c
5 changed files with 43 additions and 62 deletions

View file

@ -15,15 +15,7 @@ type FrontMatter struct {
Author string `yaml:"author"`
}
func ParseTags(file []byte) ([]string, error) {
fm, err := parseFrontMatter(file)
if err != nil {
return nil, err
}
return fm.Tags, nil
}
func parseFrontMatter(file []byte) (*FrontMatter, error) {
func ParseFrontMatter(file []byte) (*FrontMatter, error) {
content := bytes.TrimSpace(file)
if bytes.HasPrefix(content, []byte("---")) {
content = bytes.TrimSpace(content[3:])

View file

@ -4,9 +4,42 @@ import (
"os"
"strings"
"time"
"github.com/KristianJBorgwarth/dendrite.daemon/persistence/store"
)
func RenderTemplate(templatePath string, title string, slug string) ([]byte, error) {
type Template struct {
Content []byte
Title string
Slug string
FrontMatter *FrontMatter
}
func NewTemplate(templateName string, title string) (*Template, error) {
var templatePath string
if templateName != "" {
templatePath = store.GetVaultStore().GetTemplatePath(templateName)
}
slug := Slugify(title)
content, err := renderTemplate(templatePath, title, slug)
if err != nil {
return nil, err
}
fm, err := ParseFrontMatter(content)
if err != nil {
return nil, err
}
return &Template{
Content: content,
Title: title,
Slug: slug,
FrontMatter: fm,
}, nil
}
func renderTemplate(templatePath string, title string, slug string) ([]byte, error) {
template, err := readTemplate(templatePath, title)
if err != nil {
return nil, err

View file

@ -33,24 +33,12 @@ func (h *CreateNoteHandler) Handle(ctx context.Context, raw json.RawMessage) (an
return nil, err
}
slug := filehandling.Slugify(cmd.Title)
var templatePath string
if cmd.TemplateName != "" {
templatePath = store.GetVaultStore().GetTemplatePath(cmd.TemplateName)
}
notePath := filepath.Join(store.GetVaultStore().Config.VaultPath(), cmd.Directory, slug+".md")
data, err := filehandling.RenderTemplate(templatePath, cmd.Title, slug)
template, err := filehandling.NewTemplate(cmd.TemplateName, cmd.Title)
if err != nil {
return nil, err
}
tags, err := filehandling.ParseTags(data)
if err != nil {
return nil, err
}
notePath := filepath.Join(store.GetVaultStore().Config.VaultPath(), cmd.Directory, template.Slug+".md")
tx, err := h.uow.Begin()
if err != nil {
@ -62,12 +50,12 @@ func (h *CreateNoteHandler) Handle(ctx context.Context, raw json.RawMessage) (an
tagRepo := repositories.NewTagRepository(tx)
noteRepo := repositories.NewNoteRepository(tx)
dbTags, err := tagRepo.GetByNames(ctx, tags)
dbTags, err := tagRepo.GetByNames(ctx, template.FrontMatter.Tags)
if err != nil {
return nil, err
}
newTags := utils.Filter(tags, func(name string) bool {
newTags := utils.Filter(template.FrontMatter.Tags, func(name string) bool {
for _, t := range dbTags {
if t.Name() == name {
return false
@ -87,7 +75,7 @@ func (h *CreateNoteHandler) Handle(ctx context.Context, raw json.RawMessage) (an
tagModels = append(tagModels, dbTags...)
note := models.CreateNote(notePath, cmd.Title, slug)
note := models.CreateNote(notePath, cmd.Title, template.Slug)
if err = noteRepo.Upsert(ctx, note); err != nil {
return nil, err
@ -97,7 +85,7 @@ func (h *CreateNoteHandler) Handle(ctx context.Context, raw json.RawMessage) (an
return nil, err
}
h.uow.FileStore.Stage(notePath, data)
h.uow.FileStore.Stage(notePath, template.Content)
if err = h.uow.Commit(); err != nil {
return nil, err

View file

@ -2,8 +2,8 @@
test: test-unit test-integration
test-unit:
go test ./test/test_unit/...
#test-unit:
#go test ./test/test_unit/...
test-integration:
go test ./test/test_integration/...

View file

@ -1,32 +0,0 @@
package frontmatter_test
import (
"testing"
"github.com/KristianJBorgwarth/dendrite.daemon/core/frontmatter"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestParseTags_ValidFrontMatter_ReturnsTags(t *testing.T) {
input := `---
title: My Note
tags: ["test", "note"]
---
This is the content of the note.`
result, err := frontmatter.ParseTags([]byte(input))
require.NoError(t, err)
assert.Equal(t, []string{"test", "note"}, result)
}
func TestParseTags_MissingDelimiter_ReturnsError(t *testing.T) {
input := `title: My Note
tags: ["test", "note"]
This is the content of the note.`
_, err := frontmatter.ParseTags([]byte(input))
assert.ErrorContains(t, err, "missing front matter delimiter")
}