Fix bug when updating user email (#36058)

Fix #20390 

We should use `ReplacePrimaryEmailAddress` instead of
`AdminAddOrSetPrimaryEmailAddress` when modify user's email from admin
panel. And also we need a database transaction to keep deletion and
insertion succeed at the same time.
pull/35620/merge
Lunny Xiao 2025-12-01 15:50:10 +07:00 committed by GitHub
parent 7d6861ac54
commit 5340db4dbe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 32 deletions

@ -409,7 +409,7 @@ func EditUserPost(ctx *context.Context) {
} }
if form.Email != "" { if form.Email != "" {
if err := user_service.AdminAddOrSetPrimaryEmailAddress(ctx, u, form.Email); err != nil { if err := user_service.ReplacePrimaryEmailAddress(ctx, u, form.Email); err != nil {
switch { switch {
case user_model.IsErrEmailCharIsNotSupported(err), user_model.IsErrEmailInvalid(err): case user_model.IsErrEmailCharIsNotSupported(err), user_model.IsErrEmailInvalid(err):
ctx.Data["Err_Email"] = true ctx.Data["Err_Email"] = true

@ -77,43 +77,44 @@ func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailSt
return err return err
} }
if !u.IsOrganization() { return db.WithTx(ctx, func(ctx context.Context) error {
// Check if address exists already if !u.IsOrganization() {
email, err := user_model.GetEmailAddressByEmail(ctx, emailStr) // Check if address exists already
if err != nil && !errors.Is(err, util.ErrNotExist) { email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
return err if err != nil && !errors.Is(err, util.ErrNotExist) {
} return err
if email != nil { }
if email.IsPrimary && email.UID == u.ID { if email != nil {
return nil if email.IsPrimary && email.UID == u.ID {
return nil
}
return user_model.ErrEmailAlreadyUsed{Email: emailStr}
} }
return user_model.ErrEmailAlreadyUsed{Email: emailStr}
}
// Remove old primary address // Remove old primary address
primary, err := user_model.GetPrimaryEmailAddressOfUser(ctx, u.ID) primary, err := user_model.GetPrimaryEmailAddressOfUser(ctx, u.ID)
if err != nil { if err != nil {
return err return err
} }
if _, err := db.DeleteByID[user_model.EmailAddress](ctx, primary.ID); err != nil { if _, err := db.DeleteByID[user_model.EmailAddress](ctx, primary.ID); err != nil {
return err return err
} }
// Insert new primary address // Insert new primary address
email = &user_model.EmailAddress{ if _, err := user_model.InsertEmailAddress(ctx, &user_model.EmailAddress{
UID: u.ID, UID: u.ID,
Email: emailStr, Email: emailStr,
IsActivated: true, IsActivated: true,
IsPrimary: true, IsPrimary: true,
} }); err != nil {
if _, err := user_model.InsertEmailAddress(ctx, email); err != nil { return err
return err }
} }
}
u.Email = emailStr u.Email = emailStr
return user_model.UpdateUserCols(ctx, u, "email") return user_model.UpdateUserCols(ctx, u, "email")
})
} }
func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error { func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error {