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:
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user