[GITEA] Allow changing the email address before activation (squash)

See https://codeberg.org/forgejo/forgejo/pulls/2300
This commit is contained in:
Earl Warren 2024-02-05 16:49:19 +01:00
parent ecfc3cb3f0
commit 030cdd6ae2
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
5 changed files with 52 additions and 52 deletions

View file

@ -145,6 +145,33 @@ func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string)
return nil
}
// ReplaceInactivePrimaryEmail replaces the primary email of a given user, even if the primary is not yet activated.
func ReplaceInactivePrimaryEmail(ctx context.Context, oldEmail string, email *user_model.EmailAddress) error {
user := &user_model.User{}
has, err := db.GetEngine(ctx).ID(email.UID).Get(user)
if err != nil {
return err
} else if !has {
return user_model.ErrUserNotExist{
UID: email.UID,
Name: "",
KeyID: 0,
}
}
err = AddEmailAddresses(ctx, user, []string{email.Email})
if err != nil {
return err
}
err = user_model.MakeEmailPrimaryWithUser(ctx, user, email)
if err != nil {
return err
}
return DeleteEmailAddresses(ctx, user, []string{oldEmail})
}
func DeleteEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error {
for _, emailStr := range emails {
// Check if address exists

View file

@ -107,6 +107,28 @@ func TestAddEmailAddresses(t *testing.T) {
assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
}
func TestReplaceInactivePrimaryEmail(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
email := &user_model.EmailAddress{
Email: "user9999999@example.com",
UID: 9999999,
}
err := ReplaceInactivePrimaryEmail(db.DefaultContext, "user10@example.com", email)
assert.Error(t, err)
assert.True(t, user_model.IsErrUserNotExist(err))
email = &user_model.EmailAddress{
Email: "user201@example.com",
UID: 10,
}
err = ReplaceInactivePrimaryEmail(db.DefaultContext, "user10@example.com", email)
assert.NoError(t, err)
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
assert.Equal(t, "user201@example.com", user.Email)
}
func TestDeleteEmailAddresses(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())