1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 17:47:03 +00:00

file & mem stores should emit delete events on purge (#338)

Signed-off-by: James Hillyerd <james@hillyerd.com>
This commit is contained in:
James Hillyerd
2023-02-14 19:51:42 -08:00
committed by GitHub
parent 561ed93451
commit a55da8b7d1
3 changed files with 42 additions and 4 deletions

View File

@@ -11,6 +11,7 @@ import (
"github.com/inbucket/inbucket/pkg/config" "github.com/inbucket/inbucket/pkg/config"
"github.com/inbucket/inbucket/pkg/extension" "github.com/inbucket/inbucket/pkg/extension"
"github.com/inbucket/inbucket/pkg/message"
"github.com/inbucket/inbucket/pkg/storage" "github.com/inbucket/inbucket/pkg/storage"
"github.com/inbucket/inbucket/pkg/stringutil" "github.com/inbucket/inbucket/pkg/stringutil"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@@ -186,6 +187,17 @@ func (fs *Store) PurgeMessages(mailbox string) error {
mb := fs.mbox(mailbox) mb := fs.mbox(mailbox)
mb.Lock() mb.Lock()
defer mb.Unlock() defer mb.Unlock()
// Emit delete events.
if !mb.indexLoaded {
if err := mb.readIndex(); err != nil {
return err
}
}
for _, m := range mb.messages {
fs.extHost.Events.AfterMessageDeleted.Emit(message.MakeMetadata(m))
}
return mb.purge() return mb.purge()
} }

View File

@@ -144,16 +144,25 @@ func (s *Store) MarkSeen(mailbox, id string) error {
// PurgeMessages deletes the contents of a mailbox. // PurgeMessages deletes the contents of a mailbox.
func (s *Store) PurgeMessages(mailbox string) error { func (s *Store) PurgeMessages(mailbox string) error {
// Grab lock, copy messages, clear, and drop lock.
var messages map[string]*Message var messages map[string]*Message
s.withMailbox(mailbox, true, func(mb *mbox) { s.withMailbox(mailbox, true, func(mb *mbox) {
messages = mb.messages messages = mb.messages
mb.messages = make(map[string]*Message) mb.messages = make(map[string]*Message)
}) })
if len(messages) > 0 && s.remove != nil {
// Process size/quota.
if s.remove != nil {
for _, m := range messages { for _, m := range messages {
s.enforcerRemove(m) s.enforcerRemove(m)
} }
} }
// Emit delete events.
for _, m := range messages {
s.extHost.Events.AfterMessageDeleted.Emit(message.MakeMetadata(m))
}
return nil return nil
} }

View File

@@ -343,16 +343,33 @@ func testDelete(t *testing.T, store storage.Store, extHost *extension.Host) {
func testPurge(t *testing.T, store storage.Store, extHost *extension.Host) { func testPurge(t *testing.T, store storage.Store, extHost *extension.Host) {
mailbox := "fred" mailbox := "fred"
subjects := []string{"alpha", "bravo", "charlie", "delta", "echo"} subjects := []string{"alpha", "bravo", "charlie", "delta", "echo"}
// Subscribe to events.
eventListener := extHost.Events.AfterMessageDeleted.AsyncTestListener(len(subjects))
// Populate mailbox.
for _, subj := range subjects { for _, subj := range subjects {
DeliverToStore(t, store, mailbox, subj, time.Now()) DeliverToStore(t, store, mailbox, subj, time.Now())
} }
GetAndCountMessages(t, store, mailbox, len(subjects)) GetAndCountMessages(t, store, mailbox, len(subjects))
// Purge and verify. // Purge and verify.
err := store.PurgeMessages(mailbox) err := store.PurgeMessages(mailbox)
if err != nil { require.NoError(t, err)
t.Fatal(err)
}
GetAndCountMessages(t, store, mailbox, 0) GetAndCountMessages(t, store, mailbox, 0)
// Confirm events emitted.
gotEvents := []*event.MessageMetadata{}
for range subjects {
ev, err := eventListener()
if err != nil {
t.Error(err)
break
}
gotEvents = append(gotEvents, ev)
}
assert.Equal(t, len(subjects), len(gotEvents),
"expected delete event for each message in mailbox")
} }
// testMsgCap verifies the message cap is enforced. // testMsgCap verifies the message cap is enforced.