@@ -796,18 +796,48 @@ func validateUser(u *User) error {
796796 return ValidateEmail (u .Email )
797797}
798798
799- func updateUser (e db. Engine , u * User ) error {
799+ func updateUser (ctx context. Context , u * User , changePrimaryEmail bool ) error {
800800 if err := validateUser (u ); err != nil {
801801 return err
802802 }
803803
804+ e := db .GetEngine (ctx )
805+
806+ if changePrimaryEmail {
807+ var emailAddress EmailAddress
808+ has , err := e .Where ("lower_email=?" , strings .ToLower (u .Email )).Get (& emailAddress )
809+ if err != nil {
810+ return err
811+ }
812+ if ! has {
813+ // 1. Update old primary email
814+ if _ , err = e .Where ("uid=? AND is_primary=?" , u .ID , true ).Cols ("is_primary" ).Update (& EmailAddress {
815+ IsPrimary : false ,
816+ }); err != nil {
817+ return err
818+ }
819+
820+ emailAddress .Email = u .Email
821+ emailAddress .UID = u .ID
822+ emailAddress .IsActivated = true
823+ emailAddress .IsPrimary = true
824+ if _ , err := e .Insert (& emailAddress ); err != nil {
825+ return err
826+ }
827+ } else if _ , err := e .ID (emailAddress ).Cols ("is_primary" ).Update (& EmailAddress {
828+ IsPrimary : true ,
829+ }); err != nil {
830+ return err
831+ }
832+ }
833+
804834 _ , err := e .ID (u .ID ).AllCols ().Update (u )
805835 return err
806836}
807837
808838// UpdateUser updates user's information.
809- func UpdateUser (u * User ) error {
810- return updateUser (db .GetEngine ( db . DefaultContext ) , u )
839+ func UpdateUser (u * User , emailChanged bool ) error {
840+ return updateUser (db .DefaultContext , u , emailChanged )
811841}
812842
813843// UpdateUserCols update user according special columns
@@ -836,14 +866,13 @@ func UpdateUserSetting(u *User) (err error) {
836866 return err
837867 }
838868 defer committer .Close ()
839- sess := db .GetEngine (ctx )
840869
841870 if ! u .IsOrganization () {
842- if err = checkDupEmail (sess , u ); err != nil {
871+ if err = checkDupEmail (db . GetEngine ( ctx ) , u ); err != nil {
843872 return err
844873 }
845874 }
846- if err = updateUser (sess , u ); err != nil {
875+ if err = updateUser (ctx , u , false ); err != nil {
847876 return err
848877 }
849878 return committer .Commit ()
0 commit comments