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:
@ -120,6 +120,7 @@ func (s *SQLiteStorage) Create(n *note.Note) error {
|
||||
updated_at = excluded.updated_at,
|
||||
size = excluded.size,
|
||||
published = excluded.published
|
||||
WHERE excluded.updated_at > notes.updated_at
|
||||
`,
|
||||
n.ID,
|
||||
n.Path,
|
||||
@ -140,6 +141,10 @@ func (s *SQLiteStorage) Delete(id string) {
|
||||
_, _ = s.db.Exec(`DELETE FROM notes WHERE id = ?`, id)
|
||||
}
|
||||
|
||||
func (s *SQLiteStorage) DeleteByPath(path string) {
|
||||
_, _ = s.db.Exec(`DELETE FROM notes WHERE path = ?`, path)
|
||||
}
|
||||
|
||||
func (s *SQLiteStorage) Update(id string, n *note.Note) {
|
||||
_, _ = s.db.Exec(`
|
||||
UPDATE notes
|
||||
|
||||
@ -118,6 +118,22 @@ func TestSQLiteStorage_Delete(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSQLiteStorage_DeleteByPath(t *testing.T) {
|
||||
st := newSQLiteStorage(t)
|
||||
|
||||
ts := time.Date(2026, 2, 3, 12, 0, 0, 0, time.UTC)
|
||||
n := sampleNote("n1", "notes/alpha.md", "Alpha", "one", ts)
|
||||
if err := st.Create(n); err != nil {
|
||||
t.Fatalf("create note: %v", err)
|
||||
}
|
||||
|
||||
st.DeleteByPath("notes/alpha.md")
|
||||
|
||||
if st.Count() != 0 {
|
||||
t.Fatalf("expected count 0 after delete by path")
|
||||
}
|
||||
}
|
||||
|
||||
func TestSQLiteStorage_Search(t *testing.T) {
|
||||
st := newSQLiteStorage(t)
|
||||
|
||||
@ -223,7 +239,7 @@ func TestSQLiteStorage_Create_Upsert(t *testing.T) {
|
||||
|
||||
n.Content = "updated"
|
||||
n.Title = "Alpha Updated"
|
||||
n.UpdatedAt = ts.Add(2 * time.Hour)
|
||||
n.UpdatedAt = ts.Add(4 * time.Hour)
|
||||
if err := st.Create(n); err != nil {
|
||||
t.Fatalf("upsert note: %v", err)
|
||||
}
|
||||
@ -236,3 +252,27 @@ func TestSQLiteStorage_Create_Upsert(t *testing.T) {
|
||||
t.Fatalf("expected note to be updated, got %+v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSQLiteStorage_Create_UpsertSkipsOlder(t *testing.T) {
|
||||
st := newSQLiteStorage(t)
|
||||
|
||||
ts := time.Date(2026, 2, 3, 12, 0, 0, 0, time.UTC)
|
||||
n := sampleNote("n1", "notes/alpha.md", "Alpha", "one", ts)
|
||||
if err := st.Create(n); err != nil {
|
||||
t.Fatalf("create note: %v", err)
|
||||
}
|
||||
|
||||
n.Content = "older"
|
||||
n.UpdatedAt = ts.Add(-2 * time.Hour)
|
||||
if err := st.Create(n); err != nil {
|
||||
t.Fatalf("upsert note: %v", err)
|
||||
}
|
||||
|
||||
got, err := st.Get("n1")
|
||||
if err != nil {
|
||||
t.Fatalf("get note: %v", err)
|
||||
}
|
||||
if got.Content != "one" {
|
||||
t.Fatalf("expected existing content to remain, got %q", got.Content)
|
||||
}
|
||||
}
|
||||
|
||||
@ -11,6 +11,7 @@ type Storage interface {
|
||||
Get(id string) (*note.Note, error)
|
||||
Create(n *note.Note) error
|
||||
Delete(id string)
|
||||
DeleteByPath(path string)
|
||||
Update(id string, n *note.Note)
|
||||
Search(query string) []*note.Note
|
||||
Count() int
|
||||
@ -58,6 +59,14 @@ func (ns *NoteStorage) Delete(id string) {
|
||||
delete(ns.Index, id)
|
||||
}
|
||||
|
||||
func (ns *NoteStorage) DeleteByPath(path string) {
|
||||
for id, n := range ns.Index {
|
||||
if n.Path == path {
|
||||
delete(ns.Index, id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (ns *NoteStorage) Update(id string, n *note.Note) {
|
||||
ns.Index[id] = n
|
||||
}
|
||||
|
||||
@ -39,6 +39,21 @@ func TestNoteStorageDelete(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestNoteStorageDeleteByPath(t *testing.T) {
|
||||
ns = NewNoteStorage()
|
||||
n1 = note.NewNote()
|
||||
n1.Path = "notes/n1.md"
|
||||
n1.ID = note.GenerateNoteID("abs/n1.md")
|
||||
n1.Content = "# one"
|
||||
|
||||
ns.Create(n1)
|
||||
ns.DeleteByPath("notes/n1.md")
|
||||
|
||||
if len(ns.Index) != 0 {
|
||||
t.Fatalf("expected delete by path to remove note")
|
||||
}
|
||||
}
|
||||
|
||||
func TestNoteStorageGetUpdate(t *testing.T) {
|
||||
ns.Update(n2.ID, n1)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user