mirror of
https://github.com/axllent/mailpit.git
synced 2025-01-10 00:43:53 +02:00
116 lines
2.3 KiB
Go
116 lines
2.3 KiB
Go
package storage
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/axllent/mailpit/data"
|
|
"github.com/axllent/mailpit/logger"
|
|
"github.com/ostafen/clover/v2"
|
|
)
|
|
|
|
var (
|
|
mailboxStats = map[string]data.MailboxStats{}
|
|
statsLock = sync.RWMutex{}
|
|
)
|
|
|
|
// StatsGet returns the total/unread statistics for a mailbox
|
|
func StatsGet(mailbox string) data.MailboxStats {
|
|
mailbox = sanitizeMailboxName(mailbox)
|
|
|
|
statsLock.Lock()
|
|
defer statsLock.Unlock()
|
|
s, ok := mailboxStats[mailbox]
|
|
if !ok {
|
|
return data.MailboxStats{
|
|
Total: 0,
|
|
Unread: 0,
|
|
}
|
|
}
|
|
return s
|
|
}
|
|
|
|
// Refresh will completely refresh the existing stats for a given mailbox
|
|
func statsRefresh(mailbox string) error {
|
|
logger.Log().Debugf("[stats] refreshing stats for %s", mailbox)
|
|
|
|
total, err := db.Count(clover.NewQuery(mailbox))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
unread, err := db.Count(clover.NewQuery(mailbox).Where(clover.Field("Read").IsFalse()))
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
statsLock.Lock()
|
|
mailboxStats[mailbox] = data.MailboxStats{
|
|
Total: total,
|
|
Unread: unread,
|
|
}
|
|
statsLock.Unlock()
|
|
|
|
return nil
|
|
}
|
|
|
|
func statsAddNewMessage(mailbox string) {
|
|
statsLock.Lock()
|
|
s, ok := mailboxStats[mailbox]
|
|
if ok {
|
|
mailboxStats[mailbox] = data.MailboxStats{
|
|
Total: s.Total + 1,
|
|
Unread: s.Unread + 1,
|
|
}
|
|
}
|
|
statsLock.Unlock()
|
|
}
|
|
|
|
// Delete one message from the totals. If the message was unread,
|
|
// then it will also deduct one from the Unread status.
|
|
func statsDeleteOneMessage(mailbox string, unread bool) {
|
|
statsLock.Lock()
|
|
s, ok := mailboxStats[mailbox]
|
|
if ok {
|
|
// deduct from the totals
|
|
if s.Total > 0 {
|
|
s.Total = s.Total - 1
|
|
}
|
|
// only deduct if the original was unread
|
|
if unread && s.Unread > 0 {
|
|
s.Unread = s.Unread - 1
|
|
}
|
|
|
|
mailboxStats[mailbox] = data.MailboxStats{
|
|
Total: s.Total,
|
|
Unread: s.Unread,
|
|
}
|
|
}
|
|
statsLock.Unlock()
|
|
}
|
|
|
|
// Mark one message as read
|
|
func statsReadOneMessage(mailbox string) {
|
|
statsLock.Lock()
|
|
s, ok := mailboxStats[mailbox]
|
|
if ok {
|
|
mailboxStats[mailbox] = data.MailboxStats{
|
|
Total: s.Total,
|
|
Unread: s.Unread - 1,
|
|
}
|
|
}
|
|
statsLock.Unlock()
|
|
}
|
|
|
|
// Mark one message as unread
|
|
func statsUnreadOneMessage(mailbox string) {
|
|
statsLock.Lock()
|
|
s, ok := mailboxStats[mailbox]
|
|
if ok {
|
|
mailboxStats[mailbox] = data.MailboxStats{
|
|
Total: s.Total,
|
|
Unread: s.Unread + 1,
|
|
}
|
|
}
|
|
statsLock.Unlock()
|
|
}
|