51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package store
|
|
|
|
import (
|
|
"net/mail"
|
|
|
|
"github.com/asdine/storm/q"
|
|
)
|
|
|
|
type MessageInterface interface {
|
|
CreateMessage(Message) error
|
|
FindMessages(Mailbox) ([]Message, error)
|
|
|
|
// if end == 0, it means "from start to most recent"
|
|
FindMessagesInRange(mailbox Mailbox, start, end uint64) ([]Message, error)
|
|
}
|
|
|
|
type Message struct {
|
|
// FIXME: this should be per-mailbox, IMAP "only" allows 32-bit message UIDs?
|
|
ID uint64 `storm:"id,increment"`
|
|
|
|
Mailbox uint64 `storm:"index"` // FK mailbox.id
|
|
|
|
Header mail.Header // The parsed headers
|
|
EML []byte // The full email, unaltered
|
|
}
|
|
|
|
func (c *concrete) CreateMessage(message Message) error {
|
|
return c.storm.Save(&message)
|
|
}
|
|
|
|
func (c *concrete) FindMessages(mailbox Mailbox) ([]Message, error) {
|
|
var out []Message
|
|
|
|
return out, c.storm.Find("Mailbox", mailbox.ID, &out)
|
|
}
|
|
|
|
func (c *concrete) FindMessagesInRange(mailbox Mailbox, start, end uint64) ([]Message, error) {
|
|
var out []Message
|
|
|
|
matchers := []q.Matcher{
|
|
q.Eq("Mailbox", mailbox.ID),
|
|
q.Gte("ID", start),
|
|
}
|
|
|
|
if end > 0 {
|
|
matchers = append(matchers, q.Lte("ID", end))
|
|
}
|
|
|
|
return out, c.storm.Select(matchers...).Find(&out)
|
|
}
|