feat(release): v0.2.0

commit 78d6c27c8940da32a6de8e64327c86f74fdaa2eb
Author: adminoo <git@kadath.corp>
Date:   Wed Feb 4 12:59:22 2026 +0100

    feat: freebsd log rotation config thingie

commit 55af4e6c70122e679272ed247c26e04b1247f694
Author: adminoo <git@kadath.corp>
Date:   Wed Feb 4 12:58:43 2026 +0100

    feat: embed templates, static resolution

commit 29c917f929a7378ec29c54315ee2e9f420747787
Author: adminoo <git@kadath.corp>
Date:   Wed Feb 4 10:44:34 2026 +0100

    feat: set log file path

commit 294fd3d1549979eab63587ceec6ff5d0978e9afc
Author: adminoo <git@kadath.corp>
Date:   Wed Feb 4 10:23:53 2026 +0100

    feat: logging HTTP request

commit c9ae80b240d58e1abed7ae3b7b2c3b283a31f1a1
Author: adminoo <git@kadath.corp>
Date:   Wed Feb 4 09:54:05 2026 +0100

    feat: freebsd-specific compile target and scripts

commit 86ca154dedd19aa1fe5f571c445dcf17a8396bfa
Author: adminoo <git@kadath.corp>
Date:   Wed Feb 4 09:25:16 2026 +0100

    feat: mobile friendly CSS

commit 199f4319e0b08a4b6d595d7eb3effb6db6c7beec
Author: adminoo <git@kadath.corp>
Date:   Wed Feb 4 09:25:03 2026 +0100

    feat: persisting rendered note

commit 865e258237e45d7c542685a4653bcad3c5af259d
Author: adminoo <git@kadath.corp>
Date:   Wed Feb 4 08:06:38 2026 +0100

    fix: grouping notes by folder

commit 242d1d074c92461f38212b033c7a9e383f9dc550
Author: adminoo <git@kadath.corp>
Date:   Tue Feb 3 16:52:50 2026 +0100

    feat: storage layer logic

    - Prune notes from db not matching current folder structure at start
    - Detect file system deletion on start by comparing in-db notes
    - Prevent updating of in-db notes at start if modification time is not
      newer
    - Delete by path

commit d75d46bc1ab22bd990d0fdc307e571fe52f0dd99
Author: adminoo <git@kadath.corp>
Date:   Tue Feb 3 15:27:07 2026 +0100

    feat: group notes by root folders

commit e1e25a938e717599332f7b40a449d9bb854b673a
Author: adminoo <git@kadath.corp>
Date:   Tue Feb 3 14:24:37 2026 +0100

    feat: size in kilobytes

commit 61220272a2df2b66c2b8e356ba359ed01de3bd12
Author: adminoo <git@kadath.corp>
Date:   Tue Feb 3 14:19:40 2026 +0100

    feat: styling inputs
This commit is contained in:
2026-02-04 13:15:55 +01:00
parent 9d1254244f
commit b571588b15
23 changed files with 691 additions and 70 deletions

View File

@ -11,10 +11,11 @@ import (
type NotesHandler struct {
storage storage.Storage
rootDir string
}
func NewNotesHandler(storage storage.Storage) *NotesHandler {
return &NotesHandler{storage: storage}
func NewNotesHandler(storage storage.Storage, rootDir string) *NotesHandler {
return &NotesHandler{storage: storage, rootDir: rootDir}
}
func (h *NotesHandler) HandleCreate(path string) error {
@ -22,6 +23,12 @@ func (h *NotesHandler) HandleCreate(path string) error {
if err != nil {
return err
}
note.Path = path
if h.rootDir != "" {
if rel, err := filepath.Rel(h.rootDir, path); err == nil {
note.Path = rel
}
}
if err := h.storage.Create(note); err != nil {
return err
}
@ -34,6 +41,17 @@ func (h *NotesHandler) HandleModify(path string) error {
}
func (h *NotesHandler) HandleDelete(path string) error {
relPath := path
if h.rootDir != "" {
if rel, err := filepath.Rel(h.rootDir, path); err == nil {
relPath = rel
}
}
h.storage.DeleteByPath(relPath)
if relPath != path {
h.storage.DeleteByPath(path)
}
id := note.GenerateNoteID(path)
h.storage.Delete(id)
log.Printf("Deleted note '%s' from index\n", path)

View File

@ -7,6 +7,8 @@ import (
"path/filepath"
"strings"
"time"
"donniemarko/internal/note"
)
type ChangeType int
@ -39,12 +41,26 @@ type ScannerService struct {
func NewScanner(path string) *ScannerService {
return &ScannerService{
RootDir: path,
RootDir: filepath.Clean(path),
Interval: 5 * time.Second,
LastStates: make(map[string]time.Time),
}
}
// SeedExisting primes the scanner with already-indexed notes so the first scan can detect deletions.
func (s *ScannerService) SeedExisting(notes []*note.Note) {
for _, n := range notes {
if n == nil || n.Path == "" {
continue
}
path := n.Path
if !filepath.IsAbs(path) {
path = filepath.Join(s.RootDir, path)
}
s.LastStates[path] = n.UpdatedAt
}
}
func (s *ScannerService) SetHandler(handler ChangeHandler) {
s.handler = handler
}
@ -62,7 +78,7 @@ func (s *ScannerService) Scan() ([]Change, error) {
if s.RootDir == path {
return nil
}
// ignore anything that isn't a note
if !isValidNoteFile(path, info) {
return nil

View File

@ -5,6 +5,8 @@ import (
"path/filepath"
"testing"
"time"
"donniemarko/internal/note"
)
func TestScanner_DetectsNewFile(t *testing.T) {
@ -56,3 +58,50 @@ func TestScanner_DetectChanges(t *testing.T) {
t.Errorf("Should find renamed file '%s'. Got '%s'\n", newPath, changes[0].Path)
}
}
func TestScanner_SeedExisting_PrunesMissing(t *testing.T) {
tmpDir := t.TempDir()
sc := NewScanner(tmpDir)
n := note.NewNote()
n.Path = "missing.md"
n.UpdatedAt = time.Now()
sc.SeedExisting([]*note.Note{n})
changes, err := sc.Scan()
if err != nil {
t.Fatalf("scan error: %v", err)
}
if len(changes) != 1 {
t.Fatalf("expected 1 change, got %d", len(changes))
}
if changes[0].Type != Deleted {
t.Fatalf("expected Deleted change, got %v", changes[0].Type)
}
}
func TestScanner_SeedExisting_KeepsExisting(t *testing.T) {
tmpDir := t.TempDir()
filePath := filepath.Join(tmpDir, "kept.md")
os.WriteFile(filePath, []byte("# Kept"), 0644)
sc := NewScanner(tmpDir)
n := note.NewNote()
n.Path = "kept.md"
n.UpdatedAt = time.Now()
sc.SeedExisting([]*note.Note{n})
changes, err := sc.Scan()
if err != nil {
t.Fatalf("scan error: %v", err)
}
if len(changes) != 0 {
t.Fatalf("expected 0 changes, got %d", len(changes))
}
}