plugins/base: wrap MailboxInfo and MailboxStatus

This allows us to extend these and expose helpers for templates and
plugins.
This commit is contained in:
Simon Ser 2020-03-27 10:45:43 +01:00
parent f6959346ee
commit 5af6c6adc1
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
2 changed files with 35 additions and 15 deletions

View file

@ -17,16 +17,36 @@ import (
"github.com/emersion/go-message/textproto"
)
func listMailboxes(conn *imapclient.Client) ([]*imap.MailboxInfo, error) {
type MailboxInfo struct {
*imap.MailboxInfo
}
func (mbox *MailboxInfo) URL() *url.URL {
return &url.URL{
Path: fmt.Sprintf("/mailbox/%v", url.PathEscape(mbox.Name)),
}
}
type MailboxStatus struct {
*imap.MailboxStatus
}
func (mbox *MailboxStatus) URL() *url.URL {
return &url.URL{
Path: fmt.Sprintf("/mailbox/%v", url.PathEscape(mbox.Name)),
}
}
func listMailboxes(conn *imapclient.Client) ([]MailboxInfo, error) {
ch := make(chan *imap.MailboxInfo, 10)
done := make(chan error, 1)
go func() {
done <- conn.List("", "*", ch)
}()
var mailboxes []*imap.MailboxInfo
var mailboxes []MailboxInfo
for mbox := range ch {
mailboxes = append(mailboxes, mbox)
mailboxes = append(mailboxes, MailboxInfo{mbox})
}
if err := <-done; err != nil {
@ -46,7 +66,7 @@ const (
mailboxDrafts
)
func getMailboxByType(conn *imapclient.Client, mboxType mailboxType) (*imap.MailboxInfo, error) {
func getMailboxByType(conn *imapclient.Client, mboxType mailboxType) (*MailboxInfo, error) {
ch := make(chan *imap.MailboxInfo, 10)
done := make(chan error, 1)
go func() {
@ -91,7 +111,7 @@ func getMailboxByType(conn *imapclient.Client, mboxType mailboxType) (*imap.Mail
return nil, fmt.Errorf("failed to get mailbox with attribute %q: %v", attr, err)
}
return best, nil
return &MailboxInfo{best}, nil
}
func ensureMailboxSelected(conn *imapclient.Client, mboxName string) error {

View file

@ -65,8 +65,8 @@ func registerRoutes(p *koushin.GoPlugin) {
type MailboxRenderData struct {
koushin.BaseRenderData
Mailbox *imap.MailboxStatus
Mailboxes []*imap.MailboxInfo
Mailbox *MailboxStatus
Mailboxes []MailboxInfo
Messages []IMAPMessage
PrevPage, NextPage int
Query string
@ -94,9 +94,9 @@ func handleGetMailbox(ctx *koushin.Context) error {
query := ctx.QueryParam("query")
var mailboxes []*imap.MailboxInfo
var mailboxes []MailboxInfo
var msgs []IMAPMessage
var mbox *imap.MailboxStatus
var mbox *MailboxStatus
var total int
err = ctx.Session.DoIMAP(func(c *imapclient.Client) error {
var err error
@ -111,7 +111,7 @@ func handleGetMailbox(ctx *koushin.Context) error {
if err != nil {
return err
}
mbox = c.Mailbox()
mbox = &MailboxStatus{c.Mailbox()}
return nil
})
if err != nil {
@ -176,8 +176,8 @@ func handleLogout(ctx *koushin.Context) error {
type MessageRenderData struct {
koushin.BaseRenderData
Mailboxes []*imap.MailboxInfo
Mailbox *imap.MailboxStatus
Mailboxes []MailboxInfo
Mailbox *MailboxStatus
Message *IMAPMessage
Part *IMAPPartNode
View interface{}
@ -201,10 +201,10 @@ func handleGetPart(ctx *koushin.Context, raw bool) error {
}
messagesPerPage := settings.MessagesPerPage
var mailboxes []*imap.MailboxInfo
var mailboxes []MailboxInfo
var msg *IMAPMessage
var part *message.Entity
var mbox *imap.MailboxStatus
var mbox *MailboxStatus
err = ctx.Session.DoIMAP(func(c *imapclient.Client) error {
var err error
if mailboxes, err = listMailboxes(c); err != nil {
@ -213,7 +213,7 @@ func handleGetPart(ctx *koushin.Context, raw bool) error {
if msg, part, err = getMessagePart(c, mboxName, uid, partPath); err != nil {
return err
}
mbox = c.Mailbox()
mbox = &MailboxStatus{c.Mailbox()}
return nil
})
if err != nil {