Add cron schedule to notify users

This commit is contained in:
kolaente 2021-08-02 08:44:33 +02:00
parent fbe62ed380
commit 4d3962ec87
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
1 changed files with 61 additions and 2 deletions

View File

@ -18,12 +18,71 @@ package user
import (
"time"
"xorm.io/builder"
"code.vikunja.io/api/pkg/cron"
"code.vikunja.io/api/pkg/db"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/notifications"
"xorm.io/xorm"
)
func RegisterDeletionCron() {
err := cron.Schedule("0 * * * *", notifyUsersScheduledForDeletion)
if err != nil {
log.Errorf("Could not register deletion cron: %s", err.Error())
}
}
func notifyUsersScheduledForDeletion() {
s := db.NewSession()
users := []*User{}
err := s.Where(builder.NotNull{"deletion_scheduled_at"}).
Find(&users)
if err != nil {
log.Errorf("Could not get users scheduled for deletion: %s", err)
return
}
if len(users) == 0 {
return
}
log.Debugf("Found %d users scheduled for deletion", len(users))
for _, user := range users {
if time.Now().Sub(user.DeletionLastReminderSent) < time.Hour*24 {
continue
}
var number = 2
if user.DeletionLastReminderSent.IsZero() {
number = 1
}
if user.DeletionScheduledAt.Sub(user.DeletionLastReminderSent) < time.Hour*24 {
number = 3
}
err = notifications.Notify(user, &AccountDeletionNotification{
User: user,
NotificationNumber: number,
})
if err != nil {
log.Errorf("Could not notify user %d of their deletion: %s", user.ID, err)
continue
}
user.DeletionLastReminderSent = time.Now()
_, err = s.Where("id = ?", user.ID).
Cols("deletion_last_reminder_sent").
Update(user)
if err != nil {
log.Errorf("Could update user %d last deletion reminder sent date: %s", user.ID, err)
}
}
}
// RequestDeletion creates a user deletion confirm token and sends a notification to the user
func RequestDeletion(s *xorm.Session, user *User) (err error) {
token, err := generateNewToken(s, user, TokenAccountDeletion)
@ -54,9 +113,9 @@ func ConfirmDeletion(s *xorm.Session, user *User, token string) (err error) {
return err
}
user.DeletionScheduledAt = time.Now()
user.DeletionScheduledAt = time.Now().Add(3 * 24 * time.Hour)
_, err = s.Where("id = ?", user.ID).
Cols("deletion_scheduled_at").
Update(user)
return nil
return err
}