Changeset 572 in code


Ignore:
Timestamp:
Jun 28, 2021, 4:05:03 PM (4 years ago)
Author:
contact
Message:

Introduce user.updateUser

Unify updatePassword and updateRealname into a single function. This
allows "user update" to be atomic.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/service.go

    r570 r572  
    776776        }
    777777
     778        // copy the user record because we'll mutate it
     779        record := dc.user.User
     780
    778781        if password != nil {
    779782                hashed, err := bcrypt.GenerateFromPassword([]byte(*password), bcrypt.DefaultCost)
     
    781784                        return fmt.Errorf("failed to hash password: %v", err)
    782785                }
    783                 if err := dc.user.updatePassword(string(hashed)); err != nil {
    784                         return err
    785                 }
     786                record.Password = string(hashed)
    786787        }
    787788        if realname != nil {
    788                 if err := dc.user.updateRealname(*realname); err != nil {
    789                         return err
    790                 }
     789                record.Realname = *realname
     790        }
     791
     792        if err := dc.user.updateUser(&record); err != nil {
     793                return err
    791794        }
    792795
  • trunk/user.go

    r568 r572  
    857857}
    858858
    859 func (u *user) updatePassword(hashed string) error {
    860         u.User.Password = hashed
    861         return u.srv.db.StoreUser(&u.User)
    862 }
    863 
    864 func (u *user) updateRealname(realname string) error {
    865         u.User.Realname = realname
    866         if err := u.srv.db.StoreUser(&u.User); err != nil {
     859func (u *user) updateUser(record *User) error {
     860        if u.ID != record.ID {
     861                panic("ID mismatch when updating user")
     862        }
     863
     864        realnameUpdated := u.Realname != record.Realname
     865        if err := u.srv.db.StoreUser(record); err != nil {
    867866                return fmt.Errorf("failed to update user %q: %v", u.Username, err)
    868867        }
    869 
    870         // Re-connect to networks which use the default realname
    871         var needUpdate []Network
    872         u.forEachNetwork(func(net *network) {
    873                 if net.Realname == "" {
    874                         needUpdate = append(needUpdate, net.Network)
    875                 }
    876         })
    877 
    878         var netErr error
    879         for _, net := range needUpdate {
    880                 if _, err := u.updateNetwork(&net); err != nil {
    881                         netErr = err
    882                 }
    883         }
    884 
    885         return netErr
     868        u.User = *record
     869
     870        if realnameUpdated {
     871                // Re-connect to networks which use the default realname
     872                var needUpdate []Network
     873                u.forEachNetwork(func(net *network) {
     874                        if net.Realname == "" {
     875                                needUpdate = append(needUpdate, net.Network)
     876                        }
     877                })
     878
     879                var netErr error
     880                for _, net := range needUpdate {
     881                        if _, err := u.updateNetwork(&net); err != nil {
     882                                netErr = err
     883                        }
     884                }
     885                if netErr != nil {
     886                        return netErr
     887                }
     888        }
     889
     890        return nil
    886891}
    887892
Note: See TracChangeset for help on using the changeset viewer.