diff options
| author | Paul Buetow <paul@buetow.org> | 2024-06-04 23:32:38 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-06-04 23:32:38 +0300 |
| commit | dad73343d8d0d2fe0f69d3749ba2ac853e6e464c (patch) | |
| tree | 242d089b827e9773c2351dd1a77258f7e1251d6f /internal/server | |
| parent | a2001d4db7f19d0023d7c3a76da314571a1a4877 (diff) | |
dealing with two TODO items
Diffstat (limited to 'internal/server')
| -rw-r--r-- | internal/server/repository/repository.go | 23 | ||||
| -rw-r--r-- | internal/server/repository/repository_test.go | 5 |
2 files changed, 22 insertions, 6 deletions
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 |
