82 lines
1.6 KiB
Go
82 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
type emailNotification struct {
|
|
Email string
|
|
CommenterName string
|
|
Domain string
|
|
Path string
|
|
Title string
|
|
CommentHex string
|
|
Kind string
|
|
}
|
|
|
|
var emailQueue map[string](chan emailNotification) = map[string](chan emailNotification){}
|
|
|
|
func emailNotificationPendingResetAll() error {
|
|
statement := `
|
|
UPDATE emails
|
|
SET pendingEmails = 0;
|
|
`
|
|
_, err := db.Exec(statement)
|
|
if err != nil {
|
|
logger.Errorf("cannot reset pendingEmails: %v", err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func emailNotificationPendingIncrement(email string) error {
|
|
statement := `
|
|
UPDATE emails
|
|
SET pendingEmails = pendingEmails + 1
|
|
WHERE email = $1;
|
|
`
|
|
_, err := db.Exec(statement, email)
|
|
if err != nil {
|
|
logger.Errorf("cannot increment pendingEmails: %v", err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func emailNotificationPendingReset(email string) error {
|
|
statement := `
|
|
UPDATE emails
|
|
SET pendingEmails = 0, lastEmailNotificationDate = $2
|
|
WHERE email = $1;
|
|
`
|
|
_, err := db.Exec(statement, email, time.Now().UTC())
|
|
if err != nil {
|
|
logger.Errorf("cannot decrement pendingEmails: %v", err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func emailNotificationEnqueue(e emailNotification) error {
|
|
if err := emailNotificationPendingIncrement(e.Email); err != nil {
|
|
logger.Errorf("cannot increment pendingEmails when enqueueing: %v", err)
|
|
return err
|
|
}
|
|
|
|
if _, ok := emailQueue[e.Email]; !ok {
|
|
// don't enqueue more than 10 emails as we won't send more than 10 comments
|
|
// in one email anyway
|
|
emailQueue[e.Email] = make(chan emailNotification, 10)
|
|
}
|
|
|
|
select {
|
|
case emailQueue[e.Email] <- e:
|
|
default:
|
|
}
|
|
|
|
return nil
|
|
}
|