From 87c98f19b5ea8333c30a4b0ba5330b4ac338c9cc Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Thu, 12 Sep 2024 22:11:37 +0300 Subject: persist and add --- internal/server/repository/repository.go | 44 +++++++++++---------------- internal/server/repository/repository_test.go | 14 ++++----- internal/types/entry.go | 1 - 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go index e8cec81..3bcec4d 100644 --- a/internal/server/repository/repository.go +++ b/internal/server/repository/repository.go @@ -104,7 +104,9 @@ func (r Repository) load() error { errs = append(errs, err) continue } - r.putMemoryOnly(entry) + r.mu.Lock() + r.add(entry) + r.mu.Unlock() } if len(errs) == 0 { @@ -138,33 +140,28 @@ func (r Repository) ListBytes() ([]byte, error) { return json.Marshal(pairs) } -// put writes exact the same entry to the repository. Whereas merge -// Is a bit more refined, tries to merge the same entry wich are slightly -// different into the same entry. -func (r Repository) put(entry types.Entry) error { - r.putMemoryOnly(entry) - - bytes, err := entry.JSONMarshal() - if err != err { - return err - } - return r.fs.WriteFile(r.entryPath(entry), bytes) -} - -// putMemoryOnly is the same as put but don't write to disk. -func (r Repository) putMemoryOnly(entry types.Entry) { - r.mu.Lock() - defer r.mu.Unlock() - +func (r Repository) add(entry types.Entry) { r.entries[entry.ID] = entry for _, platform := range r.conf.SocialPlatformsEnabled { - if !entry.IsShared(platform) { + if entry.IsShared(platform) { + r.pending.delete(platform, entry.ID) + } else { r.pending.add(platform, entry.ID) } } } +func (r Repository) persist(entry types.Entry) error { + r.add(entry) + + bytes, err := entry.JSONMarshal() + if err != err { + return err + } + return r.fs.WriteFile(r.entryPath(entry), bytes) +} + func (r Repository) Get(id types.EntryID) (types.Entry, error) { if !r.getIdRe.MatchString(id) { return types.Entry{}, fmt.Errorf("invalid id %s", id) @@ -243,12 +240,7 @@ func (r Repository) Merge(otherEnt types.Entry) error { return nil } - bytes, err := entry.JSONMarshal() - if err != err { - return err - } - - return r.fs.WriteFile(r.entryPath(entry), bytes) + return r.persist(entry) } func (r Repository) MergeRemotely(ctx context.Context) error { diff --git a/internal/server/repository/repository_test.go b/internal/server/repository/repository_test.go index 37ca8dc..805cd04 100644 --- a/internal/server/repository/repository_test.go +++ b/internal/server/repository/repository_test.go @@ -18,7 +18,7 @@ func TestRepositoryPutGet(t *testing.T) { for _, entry := range makeEntries(t) { t.Run(entry.ID, func(t *testing.T) { - _ = repo.put(entry) + _ = repo.persist(entry) entGot, err := repo.Get(entry.ID) if err != nil { t.Error(err) @@ -69,7 +69,7 @@ func TestRepositoryList(t *testing.T) { entries := makeEntries(t) for _, entry := range entries { - _ = repo.put(entry) + _ = repo.persist(entry) } pairs, _ := repo.List() @@ -98,7 +98,7 @@ func TestRepositoryHasSameEntry(t *testing.T) { fs := make(vfs.MemoryFS) repo := newRepository(server.ServerConfig{DataDir: "./data"}, fs) entry, _ := makeAnEntry() - _ = repo.put(entry) + _ = repo.persist(entry) pair := entryPair{entry.ID, entry.Checksum()} if !repo.hasSameEntry(pair) { @@ -117,7 +117,7 @@ func TestRepositoryMerge(t *testing.T) { fs := make(vfs.MemoryFS) repo := newRepository(server.ServerConfig{DataDir: "./data"}, fs) entry1, _ := makeAnEntry() - _ = repo.put(entry1) + _ = repo.persist(entry1) entry2, _ := makeAnotherEntry() // Need to have the same IDs so that the entries will actually be merged @@ -149,9 +149,9 @@ func TestRepositoryMergeFromPartner(t *testing.T) { repo2 := newRepository(server.ServerConfig{DataDir: "./data2"}, fs2) entry1, _ := makeAnEntry() - _ = repo1.put(entry1) + _ = repo1.persist(entry1) entry2, _ := makeAnotherEntry() - _ = repo2.put(entry2) + _ = repo2.persist(entry2) getPair := func(ctx context.Context, partner string, pairs *[]entryPair) error { var ( @@ -302,7 +302,7 @@ func TestRepositoryNext(t *testing.T) { entries := makeEntries(t) for _, entry := range entries { - _ = repo.put(entry) + _ = repo.persist(entry) } if entry, ok := repo.Next(types.Mastodon); ok { diff --git a/internal/types/entry.go b/internal/types/entry.go index 6c0c4be..f17c06a 100644 --- a/internal/types/entry.go +++ b/internal/types/entry.go @@ -125,7 +125,6 @@ func (e Entry) Update(other Entry) (Entry, bool, error) { case otherShared.Is && !shared.Is: shared.Is = true e.Shared[otherPlatform] = shared - // Update pending changed = true } } -- cgit v1.2.3