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

Replace message.Metadata usage with event.MessageMetadata (#333)

Signed-off-by: James Hillyerd <james@hillyerd.com>
This commit is contained in:
James Hillyerd
2023-02-13 13:52:28 -08:00
committed by GitHub
parent d11ae3710c
commit 5adef42df7
8 changed files with 39 additions and 51 deletions

View File

@@ -20,4 +20,5 @@ type MessageMetadata struct {
Date time.Time Date time.Time
Subject string Subject string
Size int64 Size int64
Seen bool
} }

View File

@@ -24,7 +24,7 @@ type Manager interface {
prefix string, prefix string,
content []byte, content []byte,
) (id string, err error) ) (id string, err error)
GetMetadata(mailbox string) ([]*Metadata, error) GetMetadata(mailbox string) ([]*event.MessageMetadata, error)
GetMessage(mailbox, id string) (*Message, error) GetMessage(mailbox, id string) (*Message, error)
MarkSeen(mailbox, id string) error MarkSeen(mailbox, id string) error
PurgeMessages(mailbox string) error PurgeMessages(mailbox string) error
@@ -68,7 +68,7 @@ func (s *StoreManager) Deliver(
log.Debug().Str("module", "message").Str("mailbox", to.Mailbox).Msg("Delivering message") log.Debug().Str("module", "message").Str("mailbox", to.Mailbox).Msg("Delivering message")
delivery := &Delivery{ delivery := &Delivery{
Meta: Metadata{ Meta: event.MessageMetadata{
Mailbox: to.Mailbox, Mailbox: to.Mailbox,
From: fromaddr[0], From: fromaddr[0],
To: toaddr, To: toaddr,
@@ -83,27 +83,20 @@ func (s *StoreManager) Deliver(
} }
// Emit message stored event. // Emit message stored event.
event := event.MessageMetadata{ event := delivery.Meta
Mailbox: to.Mailbox, event.ID = id
ID: id,
From: delivery.From(),
To: delivery.To(),
Subject: delivery.Subject(),
Date: delivery.Date(),
Size: delivery.Size(),
}
go s.ExtHost.Events.AfterMessageStored.Emit(&event) go s.ExtHost.Events.AfterMessageStored.Emit(&event)
return id, nil return id, nil
} }
// GetMetadata returns a slice of metadata for the specified mailbox. // GetMetadata returns a slice of metadata for the specified mailbox.
func (s *StoreManager) GetMetadata(mailbox string) ([]*Metadata, error) { func (s *StoreManager) GetMetadata(mailbox string) ([]*event.MessageMetadata, error) {
messages, err := s.Store.GetMessages(mailbox) messages, err := s.Store.GetMessages(mailbox)
if err != nil { if err != nil {
return nil, err return nil, err
} }
metas := make([]*Metadata, len(messages)) metas := make([]*event.MessageMetadata, len(messages))
for i, sm := range messages { for i, sm := range messages {
metas[i] = makeMetadata(sm) metas[i] = makeMetadata(sm)
} }
@@ -126,7 +119,7 @@ func (s *StoreManager) GetMessage(mailbox, id string) (*Message, error) {
} }
_ = r.Close() _ = r.Close()
header := makeMetadata(sm) header := makeMetadata(sm)
return &Message{Metadata: *header, env: env}, nil return &Message{MessageMetadata: *header, env: env}, nil
} }
// MarkSeen marks the message as having been read. // MarkSeen marks the message as having been read.
@@ -161,8 +154,8 @@ func (s *StoreManager) MailboxForAddress(mailbox string) (string, error) {
} }
// makeMetadata populates Metadata from a storage.Message. // makeMetadata populates Metadata from a storage.Message.
func makeMetadata(m storage.Message) *Metadata { func makeMetadata(m storage.Message) *event.MessageMetadata {
return &Metadata{ return &event.MessageMetadata{
Mailbox: m.Mailbox(), Mailbox: m.Mailbox(),
ID: m.ID(), ID: m.ID(),
From: m.From(), From: m.From(),

View File

@@ -8,32 +8,21 @@ import (
"net/textproto" "net/textproto"
"time" "time"
"github.com/inbucket/inbucket/pkg/extension/event"
"github.com/inbucket/inbucket/pkg/storage" "github.com/inbucket/inbucket/pkg/storage"
"github.com/jhillyerd/enmime" "github.com/jhillyerd/enmime"
) )
// Metadata holds information about a message, but not the content.
type Metadata struct {
Mailbox string
ID string
From *mail.Address
To []*mail.Address
Date time.Time
Subject string
Size int64
Seen bool
}
// Message holds both the metadata and content of a message. // Message holds both the metadata and content of a message.
type Message struct { type Message struct {
Metadata event.MessageMetadata
env *enmime.Envelope env *enmime.Envelope
} }
// New constructs a new Message // New constructs a new Message
func New(m Metadata, e *enmime.Envelope) *Message { func New(m event.MessageMetadata, e *enmime.Envelope) *Message {
return &Message{ return &Message{
Metadata: m, MessageMetadata: m,
env: e, env: e,
} }
} }
@@ -65,7 +54,7 @@ func (m *Message) Text() string {
// Delivery is used to add a message to storage. // Delivery is used to add a message to storage.
type Delivery struct { type Delivery struct {
Meta Metadata Meta event.MessageMetadata
Reader io.Reader Reader io.Reader
} }

View File

@@ -9,6 +9,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/inbucket/inbucket/pkg/extension/event"
"github.com/inbucket/inbucket/pkg/message" "github.com/inbucket/inbucket/pkg/message"
"github.com/inbucket/inbucket/pkg/test" "github.com/inbucket/inbucket/pkg/test"
"github.com/jhillyerd/enmime" "github.com/jhillyerd/enmime"
@@ -67,7 +68,7 @@ func TestRestMailboxList(t *testing.T) {
// Test JSON message headers // Test JSON message headers
tzPDT := time.FixedZone("PDT", -7*3600) tzPDT := time.FixedZone("PDT", -7*3600)
tzPST := time.FixedZone("PST", -8*3600) tzPST := time.FixedZone("PST", -8*3600)
meta1 := message.Metadata{ meta1 := event.MessageMetadata{
Mailbox: "good", Mailbox: "good",
ID: "0001", ID: "0001",
From: &mail.Address{Name: "", Address: "from1@host"}, From: &mail.Address{Name: "", Address: "from1@host"},
@@ -75,7 +76,7 @@ func TestRestMailboxList(t *testing.T) {
Subject: "subject 1", Subject: "subject 1",
Date: time.Date(2012, 2, 1, 10, 11, 12, 253, tzPST), Date: time.Date(2012, 2, 1, 10, 11, 12, 253, tzPST),
} }
meta2 := message.Metadata{ meta2 := event.MessageMetadata{
Mailbox: "good", Mailbox: "good",
ID: "0002", ID: "0002",
From: &mail.Address{Name: "", Address: "from2@host"}, From: &mail.Address{Name: "", Address: "from2@host"},
@@ -83,8 +84,8 @@ func TestRestMailboxList(t *testing.T) {
Subject: "subject 2", Subject: "subject 2",
Date: time.Date(2012, 7, 1, 10, 11, 12, 253, tzPDT), Date: time.Date(2012, 7, 1, 10, 11, 12, 253, tzPDT),
} }
mm.AddMessage("good", &message.Message{Metadata: meta1}) mm.AddMessage("good", &message.Message{MessageMetadata: meta1})
mm.AddMessage("good", &message.Message{Metadata: meta2}) mm.AddMessage("good", &message.Message{MessageMetadata: meta2})
// Check return code // Check return code
w, err = testRestGet("http://localhost/api/v1/mailbox/good") w, err = testRestGet("http://localhost/api/v1/mailbox/good")
@@ -178,7 +179,7 @@ func TestRestMessage(t *testing.T) {
// Test JSON message headers // Test JSON message headers
tzPST := time.FixedZone("PST", -8*3600) tzPST := time.FixedZone("PST", -8*3600)
msg1 := message.New( msg1 := message.New(
message.Metadata{ event.MessageMetadata{
Mailbox: "good", Mailbox: "good",
ID: "0001", ID: "0001",
From: &mail.Address{Name: "", Address: "from1@host"}, From: &mail.Address{Name: "", Address: "from1@host"},
@@ -254,7 +255,7 @@ func TestRestMarkSeen(t *testing.T) {
// Create some messages. // Create some messages.
tzPDT := time.FixedZone("PDT", -7*3600) tzPDT := time.FixedZone("PDT", -7*3600)
tzPST := time.FixedZone("PST", -8*3600) tzPST := time.FixedZone("PST", -8*3600)
meta1 := message.Metadata{ meta1 := event.MessageMetadata{
Mailbox: "good", Mailbox: "good",
ID: "0001", ID: "0001",
From: &mail.Address{Name: "", Address: "from1@host"}, From: &mail.Address{Name: "", Address: "from1@host"},
@@ -262,7 +263,7 @@ func TestRestMarkSeen(t *testing.T) {
Subject: "subject 1", Subject: "subject 1",
Date: time.Date(2012, 2, 1, 10, 11, 12, 253, tzPST), Date: time.Date(2012, 2, 1, 10, 11, 12, 253, tzPST),
} }
meta2 := message.Metadata{ meta2 := event.MessageMetadata{
Mailbox: "good", Mailbox: "good",
ID: "0002", ID: "0002",
From: &mail.Address{Name: "", Address: "from2@host"}, From: &mail.Address{Name: "", Address: "from2@host"},
@@ -270,8 +271,8 @@ func TestRestMarkSeen(t *testing.T) {
Subject: "subject 2", Subject: "subject 2",
Date: time.Date(2012, 7, 1, 10, 11, 12, 253, tzPDT), Date: time.Date(2012, 7, 1, 10, 11, 12, 253, tzPDT),
} }
mm.AddMessage("good", &message.Message{Metadata: meta1}) mm.AddMessage("good", &message.Message{MessageMetadata: meta1})
mm.AddMessage("good", &message.Message{Metadata: meta2}) mm.AddMessage("good", &message.Message{MessageMetadata: meta2})
// Mark one read. // Mark one read.
w, err := testRestPatch("http://localhost/api/v1/mailbox/good/0002", `{"seen":true}`) w, err := testRestPatch("http://localhost/api/v1/mailbox/good/0002", `{"seen":true}`)
expectCode := 200 expectCode := 200

View File

@@ -14,6 +14,7 @@ import (
"time" "time"
"github.com/inbucket/inbucket/pkg/config" "github.com/inbucket/inbucket/pkg/config"
"github.com/inbucket/inbucket/pkg/extension/event"
"github.com/inbucket/inbucket/pkg/message" "github.com/inbucket/inbucket/pkg/message"
"github.com/inbucket/inbucket/pkg/storage" "github.com/inbucket/inbucket/pkg/storage"
"github.com/inbucket/inbucket/pkg/test" "github.com/inbucket/inbucket/pkg/test"
@@ -211,7 +212,7 @@ func setupDataStore(cfg config.Storage) (*Store, *bytes.Buffer) {
// the size of the generated message. // the size of the generated message.
func deliverMessage(ds *Store, mbName string, subject string, date time.Time) (string, int64) { func deliverMessage(ds *Store, mbName string, subject string, date time.Time) (string, int64) {
// Build message for delivery // Build message for delivery
meta := message.Metadata{ meta := event.MessageMetadata{
Mailbox: mbName, Mailbox: mbName,
To: []*mail.Address{{Name: "", Address: "somebody@host"}}, To: []*mail.Address{{Name: "", Address: "somebody@host"}},
From: &mail.Address{Name: "", Address: "somebodyelse@host"}, From: &mail.Address{Name: "", Address: "somebodyelse@host"},

View File

@@ -7,6 +7,7 @@ import (
"time" "time"
"github.com/inbucket/inbucket/pkg/config" "github.com/inbucket/inbucket/pkg/config"
"github.com/inbucket/inbucket/pkg/extension/event"
"github.com/inbucket/inbucket/pkg/message" "github.com/inbucket/inbucket/pkg/message"
"github.com/inbucket/inbucket/pkg/storage" "github.com/inbucket/inbucket/pkg/storage"
"github.com/inbucket/inbucket/pkg/test" "github.com/inbucket/inbucket/pkg/test"
@@ -59,7 +60,7 @@ func TestDoRetentionScan(t *testing.T) {
// stubMessage creates a message stub of a specific age // stubMessage creates a message stub of a specific age
func stubMessage(mailbox string, ageHours int) storage.Message { func stubMessage(mailbox string, ageHours int) storage.Message {
return &message.Delivery{ return &message.Delivery{
Meta: message.Metadata{ Meta: event.MessageMetadata{
Mailbox: mailbox, Mailbox: mailbox,
ID: fmt.Sprintf("MSG[age=%vh]", ageHours), ID: fmt.Sprintf("MSG[age=%vh]", ageHours),
Date: time.Now().Add(time.Duration(ageHours*-1) * time.Hour), Date: time.Now().Add(time.Duration(ageHours*-1) * time.Hour),

View File

@@ -4,6 +4,7 @@ import (
"errors" "errors"
"github.com/inbucket/inbucket/pkg/config" "github.com/inbucket/inbucket/pkg/config"
"github.com/inbucket/inbucket/pkg/extension/event"
"github.com/inbucket/inbucket/pkg/message" "github.com/inbucket/inbucket/pkg/message"
"github.com/inbucket/inbucket/pkg/policy" "github.com/inbucket/inbucket/pkg/policy"
"github.com/inbucket/inbucket/pkg/storage" "github.com/inbucket/inbucket/pkg/storage"
@@ -42,14 +43,14 @@ func (m *ManagerStub) GetMessage(mailbox, id string) (*message.Message, error) {
} }
// GetMetadata gets all the metadata for the specified mailbox. // GetMetadata gets all the metadata for the specified mailbox.
func (m *ManagerStub) GetMetadata(mailbox string) ([]*message.Metadata, error) { func (m *ManagerStub) GetMetadata(mailbox string) ([]*event.MessageMetadata, error) {
if mailbox == "messageserr" { if mailbox == "messageserr" {
return nil, errors.New("internal error") return nil, errors.New("internal error")
} }
messages := m.mailboxes[mailbox] messages := m.mailboxes[mailbox]
metas := make([]*message.Metadata, len(messages)) metas := make([]*event.MessageMetadata, len(messages))
for i, msg := range messages { for i, msg := range messages {
metas[i] = &msg.Metadata metas[i] = &msg.MessageMetadata
} }
return metas, nil return metas, nil
} }
@@ -69,7 +70,7 @@ func (m *ManagerStub) MarkSeen(mailbox, id string) error {
} }
for _, msg := range m.mailboxes[mailbox] { for _, msg := range m.mailboxes[mailbox] {
if msg.ID == id { if msg.ID == id {
msg.Metadata.Seen = true msg.MessageMetadata.Seen = true
return nil return nil
} }
} }

View File

@@ -10,6 +10,7 @@ import (
"time" "time"
"github.com/inbucket/inbucket/pkg/config" "github.com/inbucket/inbucket/pkg/config"
"github.com/inbucket/inbucket/pkg/extension/event"
"github.com/inbucket/inbucket/pkg/message" "github.com/inbucket/inbucket/pkg/message"
"github.com/inbucket/inbucket/pkg/storage" "github.com/inbucket/inbucket/pkg/storage"
) )
@@ -61,7 +62,7 @@ func testMetadata(t *testing.T, store storage.Store) {
subject := "fantastic test subject line" subject := "fantastic test subject line"
content := "doesn't matter" content := "doesn't matter"
delivery := &message.Delivery{ delivery := &message.Delivery{
Meta: message.Metadata{ Meta: event.MessageMetadata{
// ID and Size will be determined by the Store. // ID and Size will be determined by the Store.
Mailbox: mailbox, Mailbox: mailbox,
From: from, From: from,
@@ -130,7 +131,7 @@ func testContent(t *testing.T, store storage.Store) {
date := time.Now() date := time.Now()
subject := "fantastic test subject line" subject := "fantastic test subject line"
delivery := &message.Delivery{ delivery := &message.Delivery{
Meta: message.Metadata{ Meta: event.MessageMetadata{
// ID and Size will be determined by the Store. // ID and Size will be determined by the Store.
Mailbox: mailbox, Mailbox: mailbox,
From: from, From: from,
@@ -408,7 +409,7 @@ func DeliverToStore(
date time.Time, date time.Time,
) (string, int64) { ) (string, int64) {
t.Helper() t.Helper()
meta := message.Metadata{ meta := event.MessageMetadata{
Mailbox: mailbox, Mailbox: mailbox,
To: []*mail.Address{{Name: "Some Body", Address: "somebody@host"}}, To: []*mail.Address{{Name: "Some Body", Address: "somebody@host"}},
From: &mail.Address{Name: "Some B. Else", Address: "somebodyelse@host"}, From: &mail.Address{Name: "Some B. Else", Address: "somebodyelse@host"},