summaryrefslogtreecommitdiff
path: root/internal/server
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-06-04 23:32:38 +0300
committerPaul Buetow <paul@buetow.org>2024-06-04 23:32:38 +0300
commitdad73343d8d0d2fe0f69d3749ba2ac853e6e464c (patch)
tree242d089b827e9773c2351dd1a77258f7e1251d6f /internal/server
parenta2001d4db7f19d0023d7c3a76da314571a1a4877 (diff)
dealing with two TODO items
Diffstat (limited to 'internal/server')
-rw-r--r--internal/server/repository/repository.go23
-rw-r--r--internal/server/repository/repository_test.go5
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