summaryrefslogtreecommitdiff
path: root/internal/server
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-09-06 23:21:07 +0300
committerPaul Buetow <paul@buetow.org>2024-09-06 23:21:07 +0300
commita6c63b33cac1431f93f76f27e6eb1ae9ee06d8c2 (patch)
treebe2d7beded077b57e5d24b54e85bb820acf5909f /internal/server
parent756e66e524cce031be9ad1684a046c16f824e7d8 (diff)
add Next
Diffstat (limited to 'internal/server')
-rw-r--r--internal/server/repository/repository.go29
-rw-r--r--internal/server/repository/repository_test.go24
2 files changed, 43 insertions, 10 deletions
diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go
index 20482fe..8d2279a 100644
--- a/internal/server/repository/repository.go
+++ b/internal/server/repository/repository.go
@@ -34,7 +34,7 @@ type entryPair struct {
type Repository struct {
conf server.ServerConfig
- entries map[string]types.Entry
+ entries map[types.EntryID]types.Entry
mu *sync.Mutex
fs fs
loaded *bool
@@ -53,7 +53,7 @@ func newRepository(conf server.ServerConfig, fs fs) Repository {
var loaded bool
return Repository{
conf: conf,
- entries: make(map[string]types.Entry),
+ entries: make(map[types.EntryID]types.Entry),
mu: &sync.Mutex{},
fs: fs,
loaded: &loaded,
@@ -61,6 +61,20 @@ func newRepository(conf server.ServerConfig, fs fs) Repository {
}
}
+// Gets next entry to be shared for the given social platform.
+func (r Repository) Next(platform types.PlatformName) (types.Entry, bool) {
+ r.mu.Lock()
+ defer r.mu.Unlock()
+
+ for _, ent := range r.entries {
+ if !ent.IsShared(platform) {
+ return ent, true
+ }
+ }
+
+ return types.Entry{}, false // No entry found
+}
+
// Load repository into memory if not done yet.
func (r Repository) load() error {
if *r.loaded {
@@ -139,7 +153,7 @@ func (r Repository) put(ent types.Entry) error {
return r.fs.WriteFile(r.entryPath(ent), bytes)
}
-func (r Repository) Get(id string) (types.Entry, error) {
+func (r Repository) Get(id types.EntryID) (types.Entry, error) {
if !r.getIdRe.MatchString(id) {
return types.Entry{}, fmt.Errorf("invalid id %s", id)
}
@@ -157,7 +171,7 @@ func (r Repository) Get(id string) (types.Entry, error) {
return ent, nil
}
-func (r Repository) GetJSON(id string) (string, error) {
+func (r Repository) GetJSON(id types.EntryID) (string, error) {
ent, err := r.Get(id)
if err != nil {
return "", err
@@ -252,7 +266,7 @@ func (r Repository) mergeRemotelyFromPartner(ctx context.Context, partner string
return easyhttp.GetData(ctx, uri, r.conf.APIKey, pairs)
}
- getEntry := func(ctx context.Context, partner, id string, ent *types.Entry) error {
+ getEntry := func(ctx context.Context, partner, id types.EntryID, ent *types.Entry) error {
uri := fmt.Sprintf("%s/get?id=%s", partner, id)
return easyhttp.GetData(ctx, uri, r.conf.APIKey, ent)
}
@@ -300,8 +314,3 @@ func (r Repository) mergeFromPartner(ctx context.Context, partner string,
return errors.Join(errs...)
}
-
-// Gets next entry to be shared for the given social platform.
-func (r Repository) Next(name string) (types.Entry, bool) {
- return types.Entry{}, false
-}
diff --git a/internal/server/repository/repository_test.go b/internal/server/repository/repository_test.go
index 07b755a..c35d7f2 100644
--- a/internal/server/repository/repository_test.go
+++ b/internal/server/repository/repository_test.go
@@ -294,6 +294,30 @@ func TestRepositoryMergeFromPartner(t *testing.T) {
})
}
+func TestRepositoryNext(t *testing.T) {
+ t.Parallel()
+
+ fs := make(vfs.MemoryFS)
+ repo := newRepository(server.ServerConfig{DataDir: "./data"}, fs)
+ entries := makeEntries(t)
+
+ for _, ent := range entries {
+ _ = repo.put(ent)
+ }
+
+ if ent, ok := repo.Next("Mastodon"); ok {
+ t.Error("expected no Mastodon entry to be found", ent)
+ }
+
+ if _, ok := repo.Next("LinkedIn"); !ok {
+ t.Error("expected an unshared LinkedIn entry to be found")
+ }
+
+ if _, ok := repo.Next("DoesNotYetExist"); !ok {
+ t.Error("expected an unshared DoesNotYetExist entry to be found")
+ }
+}
+
func makeEntries(t *testing.T) []types.Entry {
ent1, err := makeAnEntry()
if err != nil {