diff --git a/cmd/main.go b/cmd/main.go index 0b59c28..810c6dd 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -30,6 +30,7 @@ func main() { server.RegisterHandler("vault/init", vault.NewInitializeHandler()) server.RegisterHandler("note/create", note.NewCreateNoteHandler(uow, tagService, noteRepo)) server.RegisterHandler("note/save", note.NewSaveNoteHandler(uow, noteRepo, tagService, noteService, linkService)) + server.RegisterHandler("note/goto", note.NewGotoNoteHandler(noteRepo)) server.RegisterHandler("completion/link", completion.NewCompleteLinkHandler(linkRepo)) if err := server.Run(os.Stdin, os.Stdout); err != nil { diff --git a/core/handlers/note/goto_note_handler.go b/core/handlers/note/goto_note_handler.go index 64a6639..0b51a9a 100644 --- a/core/handlers/note/goto_note_handler.go +++ b/core/handlers/note/goto_note_handler.go @@ -2,12 +2,15 @@ package note import ( "context" + "encoding/json" + "log/slog" + "strings" "github.com/KristianJBorgwarth/dendrite.daemon/persistence/repositories" ) type gotoNoteCommand struct { - Slug string `json:"slug"` + Link string `json:"link"` } type gotoNoteResult struct { @@ -18,10 +21,36 @@ type GotoNoteHandler struct { noteRepo repositories.INoteRepository } -func (h *GotoNoteHandler) Handle(ctx context.Context, command gotoNoteCommand) (gotoNoteResult, error) { - note, err := h.noteRepo.GetBySlug(ctx, command.Slug) +func NewGotoNoteHandler(noteRepo repositories.INoteRepository) *GotoNoteHandler { + return &GotoNoteHandler{noteRepo} +} + +func (h *GotoNoteHandler) Handle(ctx context.Context, raw json.RawMessage) (any, error) { + var cmd gotoNoteCommand + if err := json.Unmarshal(raw, &cmd); err != nil { + return nil, err + } + + cmd.Link = h.resolveLink(cmd.Link) + + note, err := h.noteRepo.GetBySlug(ctx, cmd.Link) if err != nil { - return gotoNoteResult{}, err + return nil, err + } + if note == nil { + slog.Debug("Note not found for link", "link", cmd.Link) + return nil, nil } return gotoNoteResult{Path: note.Path()}, nil } + +func (h *GotoNoteHandler) resolveLink(link string) string { + if len(link) < 5 || link[:2] != "[[" || link[len(link)-2:] != "]]" { + return link + } + content := link[2 : len(link)-2] + if before, _, ok := strings.Cut(content, "|"); ok { + return before + } + return content +} diff --git a/core/server/server.go b/core/server/server.go index 4a1c8dd..82f55e1 100644 --- a/core/server/server.go +++ b/core/server/server.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" "io" + "log/slog" "github.com/KristianJBorgwarth/dendrite.daemon/core/handlers" "github.com/KristianJBorgwarth/dendrite.daemon/core/rpc" @@ -82,6 +83,7 @@ func (s *Server) respond(w io.Writer, id *int, result any, err *rpc.Error) { Error: err, } + slog.Debug("Responding to request", "response", resp) s.write(w, resp) } diff --git a/dendrite b/dendrite index ef81490..cc35ace 100755 Binary files a/dendrite and b/dendrite differ