From dad73343d8d0d2fe0f69d3749ba2ac853e6e464c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Tue, 4 Jun 2024 23:32:38 +0300 Subject: dealing with two TODO items --- internal/server/repository/repository.go | 23 ++++++++++++++++++++--- internal/server/repository/repository_test.go | 5 ++--- 2 files changed, 22 insertions(+), 6 deletions(-) (limited to 'internal/server') diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go index 7db273f..57be3f2 100644 --- a/internal/server/repository/repository.go +++ b/internal/server/repository/repository.go @@ -32,21 +32,25 @@ type Repository struct { entries map[string]types.Entry mu *sync.Mutex fs fs + loaded *bool } func Instance(dataDir string) Repository { once.Do(func() { instance = newRepository(dataDir, vfs.RealFS{}) + _ = instance.load() }) return instance } func newRepository(dataDir string, fs fs) Repository { + var loaded bool return Repository{ dataDir: dataDir, entries: make(map[string]types.Entry), mu: &sync.Mutex{}, fs: fs, + loaded: &loaded, } } @@ -62,8 +66,12 @@ func (r Repository) put(entry types.Entry) error { return r.fs.WriteFile(r.entryPath(entry), bytes) } -// Load repository into memory +// Load repository into memory if not done yet. func (r Repository) load() error { + if *r.loaded { + return nil + } + filePaths, err := r.fs.FindFiles(r.dataDir, ".json") if err != nil { return err @@ -84,11 +92,14 @@ func (r Repository) load() error { } } + if len(errs) == 0 { + *r.loaded = true + } + return errors.Join(errs...) } func (r Repository) List() ([]EntryPair, error) { - // TODO: Do I need to load every time? Or only on init of the repo? if err := r.load(); err != nil { return []EntryPair{}, err } @@ -113,6 +124,7 @@ func (r Repository) ListBytes() ([]byte, error) { } func (r Repository) Get(id string) (types.Entry, bool) { + _ = r.load() r.mu.Lock() defer r.mu.Unlock() @@ -121,6 +133,7 @@ func (r Repository) Get(id string) (types.Entry, bool) { } func (r Repository) HasSameEntry(pair EntryPair) bool { + _ = r.load() r.mu.Lock() defer r.mu.Unlock() @@ -136,6 +149,7 @@ func (r Repository) entryPath(entry types.Entry) string { } func (r Repository) Merge(otherEntry types.Entry) error { + _ = r.load() r.mu.Lock() defer r.mu.Unlock() @@ -150,7 +164,10 @@ func (r Repository) Merge(otherEntry types.Entry) error { entry, _ = entry.Update(otherEntry) r.entries[otherEntry.ID] = entry - // TODO: Only save to file when actually changed + if !entry.Changed { + return nil + } + bytes, err := entry.Serialize() if err != err { return err diff --git a/internal/server/repository/repository_test.go b/internal/server/repository/repository_test.go index b395241..a27108c 100644 --- a/internal/server/repository/repository_test.go +++ b/internal/server/repository/repository_test.go @@ -119,10 +119,11 @@ func TestRepositoryMerge(t *testing.T) { entry2, _ := makeAnotherEntry() // Need to have the same IDs so that the entries will actually be merged entry2.ID = entry1.ID + // Merge a modified entry2 into the repository. entry2.Body = "merged" entry2.Epoch = 12345 - _ = repo.Merge(entry2) + pairs, _ := repo.List() // Ensuring the merge didn't add a new entry if len(pairs) != 1 { @@ -176,5 +177,3 @@ func makeAnotherEntry() (types.Entry, error) { ` return types.NewEntry([]byte(entry)) } - -// TODO: Write unit tests for the remainder of the repo methods -- cgit v1.2.3