From 87536b474a368b33ef76202ced40ebf586070fae Mon Sep 17 00:00:00 2001 From: Kristian <10348902@pm.me> Date: Sat, 30 May 2026 22:14:44 +0200 Subject: [PATCH] feat(cfe): add cfe on create (#44) --- cmd/main.go | 3 +- core/file_handling/frontmatter_parser.go | 12 +++--- core/handlers/note/create_note_handler.go | 16 +++++--- core/models/mappers.go | 18 ++++++++ core/services/cfe_service.go | 34 +++++++++++++++ makefile | 3 ++ persistence/config/vault_configuration.go | 2 +- persistence/repositories/cfe_repository.go | 41 +++++++++++++++++++ .../create_note_handler_test.go | 1 + 9 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 core/services/cfe_service.go create mode 100644 persistence/repositories/cfe_repository.go diff --git a/cmd/main.go b/cmd/main.go index acc6d09..2c2a0a5 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -30,12 +30,13 @@ func main() { tagService := services.NewTagService(tagRepo) linkService := services.NewLinkService(linkRepo) noteService := services.NewNoteService(tagRepo, linkRepo, noteRepo) + cfeSvc := services.NewCfeService(repositories.NewCfeRepository(persistence.NewReadContext())) idxr := services.NewIndexRebuilder(uow, noteRepo, linkRepo, tagRepo, indexRepo ) server.RegisterHandler("vault/init", vault.NewInitializeHandler(idxr, noteService)) server.RegisterHandler("vault/rebuild", vault.NewRebuildIndexHandler(idxr)) - server.RegisterHandler("note/create", note.NewCreateNoteHandler(uow, tagService, noteRepo)) + server.RegisterHandler("note/create", note.NewCreateNoteHandler(uow, tagService, noteRepo, cfeSvc)) server.RegisterHandler("note/save", note.NewSaveNoteHandler(uow, noteRepo, tagService, noteService, linkService)) server.RegisterHandler("note/delete", note.NewDeleteNoteHandler(uow, tagService, noteService)) server.RegisterHandler("note/goto", note.NewGotoNoteHandler(noteRepo)) diff --git a/core/file_handling/frontmatter_parser.go b/core/file_handling/frontmatter_parser.go index a306cbb..d663d9c 100644 --- a/core/file_handling/frontmatter_parser.go +++ b/core/file_handling/frontmatter_parser.go @@ -7,12 +7,12 @@ import ( ) type FrontMatter struct { - Title string `yaml:"title"` - Tags []string `yaml:"tags"` - Created string `yaml:"created"` - Updated string `yaml:"updated"` - Date string `yaml:"date"` - Author string `yaml:"author"` + Title string `yaml:"title"` + Tags []string `yaml:"tags"` + Created string `yaml:"created"` + Updated string `yaml:"updated"` + Date string `yaml:"date"` + Custom map[string]any `yaml:",inline"` } func ParseFrontMatter(file []byte) (*FrontMatter, error) { diff --git a/core/handlers/note/create_note_handler.go b/core/handlers/note/create_note_handler.go index 87787cc..4da91ee 100644 --- a/core/handlers/note/create_note_handler.go +++ b/core/handlers/note/create_note_handler.go @@ -20,16 +20,18 @@ type createNoteCommand struct { type CreateNoteHandler struct { uow *repositories.UnitOfWork - tagService services.ITagService + tagSvc services.ITagService noteRepo repositories.INoteRepository + cfeSvc services.ICfeService } func NewCreateNoteHandler( uow *repositories.UnitOfWork, - tagRepo services.ITagService, + tagSvc services.ITagService, noteRepo repositories.INoteRepository, + cfeSvc services.ICfeService, ) *CreateNoteHandler { - return &CreateNoteHandler{uow, tagRepo, noteRepo} + return &CreateNoteHandler{uow, tagSvc, noteRepo, cfeSvc} } func (h *CreateNoteHandler) Handle(ctx context.Context, raw json.RawMessage) (any, error) { @@ -62,7 +64,7 @@ func (h *CreateNoteHandler) Handle(ctx context.Context, raw json.RawMessage) (an return notePath, nil } - tagModels, err := h.tagService.CreateTags(ctx, dbCtx, template.FrontMatter.Tags) + tagModels, err := h.tagSvc.CreateTags(ctx, dbCtx, template.FrontMatter.Tags) if err != nil { return nil, err } @@ -73,7 +75,11 @@ func (h *CreateNoteHandler) Handle(ctx context.Context, raw json.RawMessage) (an return nil, err } - if err = h.tagService.CreateNoteTags(ctx, dbCtx, note.ID(), tagModels); err != nil { + if err = h.tagSvc.CreateNoteTags(ctx, dbCtx, note.ID(), tagModels); err != nil { + return nil, err + } + + if err = h.cfeSvc.AddCfe(ctx, dbCtx, note.ID(), template.FrontMatter.Custom); err != nil { return nil, err } diff --git a/core/models/mappers.go b/core/models/mappers.go index 5e2af24..0f0c21e 100644 --- a/core/models/mappers.go +++ b/core/models/mappers.go @@ -9,3 +9,21 @@ func MapToLinkModel(noteID string, extractedLinks []*filehandling.ExtractedLink) } return links } + +func MapToCfe(noteID string, extractedCfe map[string]any) []*CustomFronMatter { + var cfe []*CustomFronMatter + for key, value := range extractedCfe { + if valueStr, ok := value.(string); ok { + cfe = append(cfe, NewCustomFrontMatter(noteID, key, valueStr)) + continue + } else if valueArr, ok := value.([]string); ok { + for _, v := range valueArr { + cfe = append(cfe, NewCustomFrontMatter(noteID, key, v)) + } + continue + } else { + cfe = append(cfe, NewCustomFrontMatter(noteID, key, "")) + } + } + return cfe +} diff --git a/core/services/cfe_service.go b/core/services/cfe_service.go new file mode 100644 index 0000000..53c0316 --- /dev/null +++ b/core/services/cfe_service.go @@ -0,0 +1,34 @@ +package services + +import ( + "context" + + "github.com/KristianJBorgwarth/dendrite.daemon/core/models" + "github.com/KristianJBorgwarth/dendrite.daemon/persistence" + "github.com/KristianJBorgwarth/dendrite.daemon/persistence/repositories" +) + +type ICfeService interface { + AddCfe(ctx context.Context, dbCtx persistence.IDbContext, noteID string, cfe map[string]any) error +} + +type cfeService struct { + cfeRepo repositories.ICfeRepository +} + +func NewCfeService(cfeRepo repositories.ICfeRepository) ICfeService { + return &cfeService{cfeRepo} +} + +func (s *cfeService) AddCfe( + ctx context.Context, + dbCtx persistence.IDbContext, + noteID string, + cfe map[string]any, +) error { + if len(cfe) == 0 { + return nil + } + cfeModels := models.MapToCfe(noteID, cfe) + return s.cfeRepo.InsertRange(ctx, dbCtx, cfeModels) +} diff --git a/makefile b/makefile index 66a61a1..e49e443 100644 --- a/makefile +++ b/makefile @@ -7,3 +7,6 @@ test-unit: test-integration: go test ./test/test_integration/... + +build: + go build -o dendrite ./cmd diff --git a/persistence/config/vault_configuration.go b/persistence/config/vault_configuration.go index 7d98ae3..2e5b7a9 100644 --- a/persistence/config/vault_configuration.go +++ b/persistence/config/vault_configuration.go @@ -52,7 +52,7 @@ func (vc *VaultConfig) TemplateDirectory() string { } func (vc *VaultConfig) ExcludeIndexFiles() []string { - defaultIgnores := []string{"index.md", "index"} + defaultIgnores := []string{"index.md", "index", ".templates"} if vc.overrideDefaultIgnores { return vc.excludeIndexFiles } diff --git a/persistence/repositories/cfe_repository.go b/persistence/repositories/cfe_repository.go new file mode 100644 index 0000000..ed704b1 --- /dev/null +++ b/persistence/repositories/cfe_repository.go @@ -0,0 +1,41 @@ +package repositories + +import ( + "context" + + "github.com/KristianJBorgwarth/dendrite.daemon/core/models" + "github.com/KristianJBorgwarth/dendrite.daemon/persistence" +) + +type ICfeRepository interface { + InsertRange(ctx context.Context, dbContext persistence.IDbContext, cfe []*models.CustomFronMatter) error +} + +type cfeRepository struct { + readDBContext persistence.ReadContext +} + +func NewCfeRepository(rdb persistence.ReadContext) ICfeRepository { + return &cfeRepository{readDBContext: rdb} +} + +func (r *cfeRepository) InsertRange( + ctx context.Context, + dbCtx persistence.IDbContext, + cfe []*models.CustomFronMatter, +) error { + statement, err := dbCtx.Prepare( + `INSERT INTO custom_frontmatter (note_id, key, value) + VALUES (?, ?, ?) ON CONFLICT DO NOTHING;`,) + if err != nil { + return err + } + + for _, c := range cfe { + if _, err := statement.ExecContext(ctx, c.NodeID(), c.Key(), c.Value()); err != nil { + return err + } + } + + return nil +} diff --git a/test/test_integration/create_note_handler_test.go b/test/test_integration/create_note_handler_test.go index 2f75939..f9a1465 100644 --- a/test/test_integration/create_note_handler_test.go +++ b/test/test_integration/create_note_handler_test.go @@ -19,6 +19,7 @@ func newCreateNoteHandler() *note.CreateNoteHandler { repositories.NewUnitOfWork(), services.NewTagService(repositories.NewTagRepository(persistence.NewReadContext())), repositories.NewNoteRepository(persistence.NewReadContext()), + services.NewCfeService(repositories.NewCfeRepository(persistence.NewReadContext())), ) }