From c3b3e09fe8da976d055b291887cf4ceba6e2048e Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Mon, 12 Aug 2024 09:57:27 +0300 Subject: move remote merges to reposotory --- internal/server/repository/repository.go | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'internal/server/repository') diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go index af8ea70..ca1919c 100644 --- a/internal/server/repository/repository.go +++ b/internal/server/repository/repository.go @@ -1,6 +1,7 @@ package repository import ( + "context" "encoding/json" "errors" "fmt" @@ -9,6 +10,7 @@ import ( "time" "codeberg.org/snonux/gos/internal/config/server" + "codeberg.org/snonux/gos/internal/easyhttp" "codeberg.org/snonux/gos/internal/types" "codeberg.org/snonux/gos/internal/vfs" ) @@ -138,6 +140,7 @@ func (r Repository) Get(id string) (types.Entry, bool) { return ent, ok } +// TODO: Make all methods not used externally in this file private func (r Repository) HasSameEntry(pair EntryPair) bool { _ = r.load() r.mu.Lock() @@ -181,3 +184,53 @@ func (r Repository) Merge(otherEnt types.Entry) error { } return r.fs.WriteFile(r.entryPath(ent), bytes) } + +func (r Repository) MergeRemotely(ctx context.Context) error { + var errs []error + + for _, partner := range r.conf.Partners() { + if err := r.mergeRemotelyFromPartner(ctx, partner); err != nil { + errs = append(errs, err) + } + } + + return errors.Join(errs...) +} + +func (r Repository) mergeRemotelyFromPartner(ctx context.Context, partner string) error { + var ( + errs []error + uri = fmt.Sprintf("%s/list", partner) + pairs []EntryPair + ) + + if err := easyhttp.GetData(ctx, uri, r.conf.APIKey, &pairs); err != nil { + return err + } + + for _, pair := range pairs { + if r.HasSameEntry(pair) { + continue + } + + var ( + ent types.Entry + uri = fmt.Sprintf("%s/get?id=%s", partner, pair.ID) + ) + + if err := easyhttp.GetData(ctx, uri, r.conf.APIKey, &ent); err != nil { + errs = append(errs, err) + continue + } + + // In theory, this should never happen + if pair.ID != ent.ID { + errs = append(errs, fmt.Errorf("pair ID %s does not match entry id %s", pair.ID, ent.ID)) + continue + } + + errs = append(errs, r.Merge(ent)) + } + + return errors.Join(errs...) +} -- cgit v1.2.3