soft delete support for account_requests (#262)

This commit is contained in:
Michael Quigley 2023-03-09 15:29:15 -05:00
parent 47fe0f546a
commit 9da1137a78
No known key found for this signature in database
GPG Key ID: 9B60314A9DD20A62
4 changed files with 14 additions and 6 deletions

View File

@ -69,7 +69,7 @@ func (h *inviteHandler) Handle(params account.InviteParams) middleware.Responder
logrus.Infof("no account found for '%v': %v", params.Body.Email, err) logrus.Infof("no account found for '%v': %v", params.Body.Email, err)
} }
if oldAr, err := str.FindAccountRequestWithEmail(params.Body.Email, tx); err == nil { if oldAr, err := str.FindAccountRequestWithEmail(params.Body.Email, tx); err == nil && !oldAr.Deleted {
logrus.Warnf("found previous account request for '%v', removing", params.Body.Email) logrus.Warnf("found previous account request for '%v', removing", params.Body.Email)
if err := str.DeleteAccountRequest(oldAr.Id, tx); err != nil { if err := str.DeleteAccountRequest(oldAr.Id, tx); err != nil {
logrus.Errorf("error deleteing previous account request for '%v': %v", params.Body.Email, err) logrus.Errorf("error deleteing previous account request for '%v': %v", params.Body.Email, err)

View File

@ -32,6 +32,10 @@ func (h *registerHandler) Handle(params account.RegisterParams) middleware.Respo
logrus.Errorf("error finding account request with token '%v': %v", params.Body.Token, err) logrus.Errorf("error finding account request with token '%v': %v", params.Body.Token, err)
return account.NewRegisterNotFound() return account.NewRegisterNotFound()
} }
if ar.Deleted {
logrus.Errorf("account request with token '%v' deleted", params.Body.Token)
return account.NewRegisterNotFound()
}
token, err := createToken() token, err := createToken()
if err != nil { if err != nil {

View File

@ -49,10 +49,10 @@ func (self *Store) FindExpiredAccountRequests(before time.Time, limit int, tx *s
var sql string var sql string
switch self.cfg.Type { switch self.cfg.Type {
case "postgres": case "postgres":
sql = "select * from account_requests where created_at < $1 limit %d for update" sql = "select * from account_requests where created_at < $1 and not deleted limit %d for update"
case "sqlite3": case "sqlite3":
sql = "select * from account_requests where created_at < $1 limit %d" sql = "select * from account_requests where created_at < $1 and not deleted limit %d"
default: default:
return nil, errors.Errorf("unknown database type '%v'", self.cfg.Type) return nil, errors.Errorf("unknown database type '%v'", self.cfg.Type)
@ -82,7 +82,7 @@ func (self *Store) FindAccountRequestWithEmail(email string, tx *sqlx.Tx) (*Acco
} }
func (self *Store) DeleteAccountRequest(id int, tx *sqlx.Tx) error { func (self *Store) DeleteAccountRequest(id int, tx *sqlx.Tx) error {
stmt, err := tx.Prepare("delete from account_requests where id = $1") stmt, err := tx.Prepare("update account_requests set deleted = true, updated_at = current_timestamp where id = $1")
if err != nil { if err != nil {
return errors.Wrap(err, "error preparing account_requests delete statement") return errors.Wrap(err, "error preparing account_requests delete statement")
} }
@ -106,7 +106,7 @@ func (self *Store) DeleteMultipleAccountRequests(ids []int, tx *sqlx.Tx) error {
indexes[i] = fmt.Sprintf("$%d", i+1) indexes[i] = fmt.Sprintf("$%d", i+1)
} }
stmt, err := tx.Prepare(fmt.Sprintf("delete from account_requests where id in (%s)", strings.Join(indexes, ","))) stmt, err := tx.Prepare(fmt.Sprintf("update account_requests set deleted = true, updated_at = current_timestamp where id in (%s)", strings.Join(indexes, ",")))
if err != nil { if err != nil {
return errors.Wrap(err, "error preparing account_requests delete multiple statement") return errors.Wrap(err, "error preparing account_requests delete multiple statement")
} }

View File

@ -26,7 +26,11 @@ func (self *verifyHandler) Handle(params account.VerifyParams) middleware.Respon
ar, err := str.FindAccountRequestWithToken(params.Body.Token, tx) ar, err := str.FindAccountRequestWithToken(params.Body.Token, tx)
if err != nil { if err != nil {
logrus.Errorf("error finding account with token '%v': %v", params.Body.Token, err) logrus.Errorf("error finding account request with token '%v': %v", params.Body.Token, err)
return account.NewVerifyNotFound()
}
if ar.Deleted {
logrus.Errorf("account request for '%v' with token '%v' deleted", ar.Email, params.Body.Token)
return account.NewVerifyNotFound() return account.NewVerifyNotFound()
} }