60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package cache
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"git.sr.ht/~rjarry/aerc/lib/log"
|
|
"git.sr.ht/~rjarry/aerc/worker/types"
|
|
"git.sr.ht/~rockorager/go-jmap"
|
|
)
|
|
|
|
type FolderContents struct {
|
|
MailboxID jmap.ID
|
|
QueryState string
|
|
Filter *types.SearchCriteria
|
|
Sort []*types.SortCriterion
|
|
MessageIDs []jmap.ID
|
|
}
|
|
|
|
func (c *JMAPCache) GetFolderContents(mailboxId jmap.ID) (*FolderContents, error) {
|
|
key := folderContentsKey(mailboxId)
|
|
buf, err := c.get(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
m := new(FolderContents)
|
|
err = unmarshal(buf, m)
|
|
if err != nil {
|
|
log.Debugf("cache format has changed, purging foldercontents")
|
|
if e := c.purge("foldercontents/"); e != nil {
|
|
log.Errorf("foldercontents cache purge: %s", e)
|
|
}
|
|
return nil, err
|
|
}
|
|
return m, nil
|
|
}
|
|
|
|
func (c *JMAPCache) PutFolderContents(mailboxId jmap.ID, m *FolderContents) error {
|
|
buf, err := marshal(m)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return c.put(folderContentsKey(mailboxId), buf)
|
|
}
|
|
|
|
func (c *JMAPCache) DeleteFolderContents(mailboxId jmap.ID) error {
|
|
return c.delete(folderContentsKey(mailboxId))
|
|
}
|
|
|
|
func folderContentsKey(mailboxId jmap.ID) string {
|
|
return "foldercontents/" + string(mailboxId)
|
|
}
|
|
|
|
func (f *FolderContents) NeedsRefresh(
|
|
filter *types.SearchCriteria, sort []*types.SortCriterion,
|
|
) bool {
|
|
return f.QueryState == "" ||
|
|
!reflect.DeepEqual(f.Sort, sort) ||
|
|
!reflect.DeepEqual(f.Filter, filter)
|
|
}
|