Add cron schedule to notify users
This commit is contained in:
parent
fbe62ed380
commit
4d3962ec87
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue