summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-09-12 21:53:54 +0300
committerPaul Buetow <paul@buetow.org>2024-09-12 21:53:54 +0300
commitc2671a57fea7457fb24a3d65f5f4a2a1cc65bebe (patch)
tree32bf5ef04e61a8c9ae38d2eddc4d48031b8cceaf
parente012a4e256e5dab4b37c5af318fa5faf1eb55910 (diff)
add pending.delete
-rw-r--r--internal/config/server/server.go25
-rw-r--r--internal/server/repository/pending.go13
-rw-r--r--internal/server/repository/pending_test.go22
-rw-r--r--internal/server/repository/repository.go23
-rw-r--r--internal/types/entry.go1
5 files changed, 64 insertions, 20 deletions
diff --git a/internal/config/server/server.go b/internal/config/server/server.go
index 8454c34..8d0d15c 100644
--- a/internal/config/server/server.go
+++ b/internal/config/server/server.go
@@ -6,20 +6,21 @@ import (
"os"
"codeberg.org/snonux/gos/internal/config"
+ "codeberg.org/snonux/gos/internal/types"
)
type ServerConfig struct {
- ListenAddr string `json:"ListenAddr,omitempty"`
- Partners []string `json:"Partners,omitempty"`
- APIKey string `json:"APIKey,omitempty"`
- DataDir string `json:"StateDir,omitempty"`
- EmailTo string `json:"EmailTo,omitempty"`
- EmailFrom string `json:"EmailFrom,omitempty"`
- SMTPServer string `json:"SMTPServer,omitempty"`
- MergeIntervalS int `json:"MergeInterval,omitempty"`
- ScheduleIntervalS int `json:"ScheduleInterval,omitempty"`
- // SocialPlatformsEnable []string `json:"SocialPlatformsEnable,omitempty"`
- Secrets SecretsConfig `json:"Secrets,omitempty"`
+ ListenAddr string `json:"ListenAddr,omitempty"`
+ Partners []string `json:"Partners,omitempty"`
+ APIKey string `json:"APIKey,omitempty"`
+ DataDir string `json:"StateDir,omitempty"`
+ EmailTo string `json:"EmailTo,omitempty"`
+ EmailFrom string `json:"EmailFrom,omitempty"`
+ SMTPServer string `json:"SMTPServer,omitempty"`
+ MergeIntervalS int `json:"MergeInterval,omitempty"`
+ ScheduleIntervalS int `json:"ScheduleInterval,omitempty"`
+ SocialPlatformsEnabled []string `json:"SocialPlatformsEnabled,omitempty"`
+ Secrets SecretsConfig `json:"Secrets,omitempty"`
}
func New(configFile, secretsFile string) (ServerConfig, error) {
@@ -41,6 +42,8 @@ func New(configFile, secretsFile string) (ServerConfig, error) {
conf.DataDir = config.Str("GOS_DATA_DIR", conf.DataDir, "data")
conf.EmailTo = config.Str("GOS_EMAIL_TO", conf.EmailTo)
conf.EmailFrom = config.Str("GOS_EMAIL_FROM", conf.EmailFrom)
+ conf.SocialPlatformsEnabled = config.StrSlice("GOS_SOCIAL_PLATFORMS_ENABLED",
+ []string{types.Mastodon, types.LinkedIn})
conf.SMTPServer = config.Str("GOS_SMTP_SERVER", conf.SMTPServer, func() string {
hostname, err := os.Hostname()
diff --git a/internal/server/repository/pending.go b/internal/server/repository/pending.go
index 56a1bd6..f03c8fd 100644
--- a/internal/server/repository/pending.go
+++ b/internal/server/repository/pending.go
@@ -10,11 +10,11 @@ type pending struct {
}
func newPending() pending {
- return pending{platforms: make(map[types.PlatformName]pendingEntries)}
+ return pending{make(map[types.PlatformName]pendingEntries)}
}
func (p pending) add(platform types.PlatformName, id types.EntryID) {
- pe, ok := p.get(platform)
+ pe, ok := p.platforms[platform]
if !ok {
pe = make(pendingEntries)
}
@@ -22,6 +22,15 @@ func (p pending) add(platform types.PlatformName, id types.EntryID) {
p.platforms[platform] = pe
}
+func (p pending) delete(platform types.PlatformName, id types.EntryID) {
+ pe, ok := p.platforms[platform]
+ if !ok {
+ return
+ }
+ delete(pe, id)
+ p.platforms[platform] = pe
+}
+
func (p pending) get(platform types.PlatformName) (pendingEntries, bool) {
pe, ok := p.platforms[platform]
return pe, ok
diff --git a/internal/server/repository/pending_test.go b/internal/server/repository/pending_test.go
index 16d0d39..e74771c 100644
--- a/internal/server/repository/pending_test.go
+++ b/internal/server/repository/pending_test.go
@@ -28,3 +28,25 @@ func TestPendingAdd(t *testing.T) {
t.Error("expected two entries")
}
}
+
+func TestPendingDelete(t *testing.T) {
+ pending := newPending()
+ if entries, ok := pending.get(types.LinkedIn); ok {
+ t.Error("expected not an ok", entries)
+ }
+
+ pending.add(types.LinkedIn, "fooid")
+
+ entries, ok := pending.get(types.LinkedIn)
+ if !ok {
+ t.Error("expected ok return status")
+ }
+ if len(entries) != 1 {
+ t.Error("expected one entry")
+ }
+
+ pending.delete(types.LinkedIn, "fooid")
+ if entries, _ = pending.get(types.LinkedIn); len(entries) > 0 {
+ t.Error("expected zero results", entries)
+ }
+}
diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go
index f0eff12..e8cec81 100644
--- a/internal/server/repository/repository.go
+++ b/internal/server/repository/repository.go
@@ -104,10 +104,7 @@ func (r Repository) load() error {
errs = append(errs, err)
continue
}
-
- r.mu.Lock()
- r.entries[entry.ID] = entry
- r.mu.Unlock()
+ r.putMemoryOnly(entry)
}
if len(errs) == 0 {
@@ -145,9 +142,7 @@ func (r Repository) ListBytes() ([]byte, error) {
// 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.mu.Lock()
- defer r.mu.Unlock()
- r.entries[entry.ID] = entry
+ r.putMemoryOnly(entry)
bytes, err := entry.JSONMarshal()
if err != err {
@@ -156,6 +151,20 @@ func (r Repository) put(entry types.Entry) error {
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()
+
+ r.entries[entry.ID] = entry
+
+ for _, platform := range r.conf.SocialPlatformsEnabled {
+ if !entry.IsShared(platform) {
+ r.pending.add(platform, entry.ID)
+ }
+ }
+}
+
func (r Repository) Get(id types.EntryID) (types.Entry, error) {
if !r.getIdRe.MatchString(id) {
return types.Entry{}, fmt.Errorf("invalid id %s", id)
diff --git a/internal/types/entry.go b/internal/types/entry.go
index f17c06a..6c0c4be 100644
--- a/internal/types/entry.go
+++ b/internal/types/entry.go
@@ -125,6 +125,7 @@ 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
}
}