mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-17 17:47:03 +00:00
message: Implement service layer, stubs for #81
I've made some effort to wire the manager into the controllers, but tests are currently failing.
This commit is contained in:
86
pkg/message/manager.go
Normal file
86
pkg/message/manager.go
Normal file
@@ -0,0 +1,86 @@
|
||||
package message
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/jhillyerd/enmime"
|
||||
"github.com/jhillyerd/inbucket/pkg/storage"
|
||||
)
|
||||
|
||||
// Manager is the interface controllers use to interact with messages.
|
||||
type Manager interface {
|
||||
GetMetadata(mailbox string) ([]*Metadata, error)
|
||||
GetMessage(mailbox, id string) (*Message, error)
|
||||
PurgeMessages(mailbox string) error
|
||||
RemoveMessage(mailbox, id string) error
|
||||
SourceReader(mailbox, id string) (io.ReadCloser, error)
|
||||
}
|
||||
|
||||
// StoreManager is a message Manager backed by the storage.Store.
|
||||
type StoreManager struct {
|
||||
Store storage.Store
|
||||
}
|
||||
|
||||
// GetMetadata returns a slice of metadata for the specified mailbox.
|
||||
func (s *StoreManager) GetMetadata(mailbox string) ([]*Metadata, error) {
|
||||
messages, err := s.Store.GetMessages(mailbox)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
metas := make([]*Metadata, len(messages))
|
||||
for i, sm := range messages {
|
||||
metas[i] = makeMetadata(sm)
|
||||
}
|
||||
return metas, nil
|
||||
}
|
||||
|
||||
// GetMessage returns the specified message.
|
||||
func (s *StoreManager) GetMessage(mailbox, id string) (*Message, error) {
|
||||
sm, err := s.Store.GetMessage(mailbox, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r, err := sm.RawReader()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
env, err := enmime.ReadEnvelope(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_ = r.Close()
|
||||
header := makeMetadata(sm)
|
||||
return &Message{Metadata: *header, Envelope: env}, nil
|
||||
}
|
||||
|
||||
// PurgeMessages removes all messages from the specified mailbox.
|
||||
func (s *StoreManager) PurgeMessages(mailbox string) error {
|
||||
return s.Store.PurgeMessages(mailbox)
|
||||
}
|
||||
|
||||
// RemoveMessage deletes the specified message.
|
||||
func (s *StoreManager) RemoveMessage(mailbox, id string) error {
|
||||
return s.Store.RemoveMessage(mailbox, id)
|
||||
}
|
||||
|
||||
// SourceReader allows the stored message source to be read.
|
||||
func (s *StoreManager) SourceReader(mailbox, id string) (io.ReadCloser, error) {
|
||||
sm, err := s.Store.GetMessage(mailbox, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return sm.RawReader()
|
||||
}
|
||||
|
||||
// makeMetadata populates Metadata from a StoreMessage.
|
||||
func makeMetadata(m storage.StoreMessage) *Metadata {
|
||||
return &Metadata{
|
||||
Mailbox: m.Mailbox(),
|
||||
ID: m.ID(),
|
||||
From: m.From(),
|
||||
To: m.To(),
|
||||
Date: m.Date(),
|
||||
Subject: m.Subject(),
|
||||
Size: m.Size(),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user