diff options
| author | Paul Buetow <paul@buetow.org> | 2024-09-12 21:53:54 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-09-12 21:53:54 +0300 |
| commit | c2671a57fea7457fb24a3d65f5f4a2a1cc65bebe (patch) | |
| tree | 32bf5ef04e61a8c9ae38d2eddc4d48031b8cceaf | |
| parent | e012a4e256e5dab4b37c5af318fa5faf1eb55910 (diff) | |
add pending.delete
| -rw-r--r-- | internal/config/server/server.go | 25 | ||||
| -rw-r--r-- | internal/server/repository/pending.go | 13 | ||||
| -rw-r--r-- | internal/server/repository/pending_test.go | 22 | ||||
| -rw-r--r-- | internal/server/repository/repository.go | 23 | ||||
| -rw-r--r-- | internal/types/entry.go | 1 |
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 } } |
