From e64f181e28ce963df4aad2094b191f8bdcb395fa Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Mon, 20 Dec 2021 00:26:46 +0800 Subject: [PATCH] Add getCasdoorColumns(). --- object/syncer_sync.go | 4 ++-- object/syncer_user.go | 39 ++++++++++++++++++++++++++++++++++++--- object/syncer_util.go | 3 ++- object/user.go | 19 ------------------- util/string.go | 17 +++++++++++++++++ 5 files changed, 57 insertions(+), 25 deletions(-) diff --git a/object/syncer_sync.go b/object/syncer_sync.go index 8d7ab01b..49fab590 100644 --- a/object/syncer_sync.go +++ b/object/syncer_sync.go @@ -41,7 +41,7 @@ func (syncer *Syncer) syncUsers() { updatedUser := syncer.createUserFromOriginalUser(oUser, affiliationMap) updatedUser.Hash = oHash updatedUser.PreHash = oHash - UpdateUserForOriginalFields(updatedUser) + syncer.updateUserForOriginalFields(updatedUser) fmt.Printf("Update from oUser to user: %v\n", updatedUser) } } else { @@ -62,7 +62,7 @@ func (syncer *Syncer) syncUsers() { updatedUser := syncer.createUserFromOriginalUser(oUser, affiliationMap) updatedUser.Hash = oHash updatedUser.PreHash = oHash - UpdateUserForOriginalFields(updatedUser) + syncer.updateUserForOriginalFields(updatedUser) fmt.Printf("Update from oUser to user (2nd condition): %v\n", updatedUser) } } diff --git a/object/syncer_user.go b/object/syncer_user.go index ac609a26..475eb9dd 100644 --- a/object/syncer_user.go +++ b/object/syncer_user.go @@ -21,6 +21,7 @@ import ( "github.com/astaxie/beego" "github.com/casbin/casdoor/util" + "xorm.io/core" ) type OriginalUser = User @@ -55,7 +56,7 @@ func (syncer *Syncer) addUser(user *OriginalUser) bool { return affected != 0 } -func (syncer *Syncer) getActiveColumns() []string { +func (syncer *Syncer) getOriginalColumns() []string { res := []string{} for _, tableColumn := range syncer.TableColumns { if tableColumn.CasdoorName != "Id" { @@ -65,9 +66,20 @@ func (syncer *Syncer) getActiveColumns() []string { return res } +func (syncer *Syncer) getCasdoorColumns() []string { + res := []string{} + for _, tableColumn := range syncer.TableColumns { + if tableColumn.CasdoorName != "Id" { + v := util.CamelToSnakeCase(tableColumn.CasdoorName) + res = append(res, v) + } + } + return res +} + func (syncer *Syncer) updateUser(user *OriginalUser) bool { m := syncer.getMapFromOriginalUser(user) - columns := syncer.getActiveColumns() + columns := syncer.getOriginalColumns() affected, err := syncer.Adapter.Engine.Table(syncer.Table).ID(syncer.TablePrimaryKey).Cols(columns...).Update(m) if err != nil { panic(err) @@ -76,12 +88,33 @@ func (syncer *Syncer) updateUser(user *OriginalUser) bool { return affected != 0 } +func (syncer *Syncer) updateUserForOriginalFields(user *User) bool { + owner, name := util.GetOwnerAndNameFromId(user.GetId()) + oldUser := getUser(owner, name) + if oldUser == nil { + return false + } + + if user.Avatar != oldUser.Avatar && user.Avatar != "" { + user.PermanentAvatar = getPermanentAvatarUrl(user.Owner, user.Name, user.Avatar) + } + + columns := syncer.getCasdoorColumns() + columns = append(columns, "affiliation", "hash", "pre_hash") + affected, err := adapter.Engine.ID(core.PK{user.Owner, user.Name}).Cols(columns...).Update(user) + if err != nil { + panic(err) + } + + return affected != 0 +} + func (syncer *Syncer) calculateHash(user *OriginalUser) string { values := []string{} m := syncer.getMapFromOriginalUser(user) for _, tableColumn := range syncer.TableColumns { if tableColumn.IsHashed { - values = append(values, m[tableColumn.CasdoorName]) + values = append(values, m[tableColumn.Name]) } } diff --git a/object/syncer_util.go b/object/syncer_util.go index 796a0e7f..1df1e842 100644 --- a/object/syncer_util.go +++ b/object/syncer_util.go @@ -52,6 +52,7 @@ func (syncer *Syncer) createUserFromOriginalUser(originalUser *OriginalUser, aff if user.Type == "" { user.Type = "normal-user" } + user.Avatar = syncer.getFullAvatarUrl(user.Avatar) if originalUser.Score != 0 { affiliation, ok := affiliationMap[originalUser.Score] if !ok { @@ -196,7 +197,7 @@ func (syncer *Syncer) getMapFromOriginalUser(user *OriginalUser) map[string]stri m2 := map[string]string{} for _, tableColumn := range syncer.TableColumns { - m2[tableColumn.CasdoorName] = m[tableColumn.CasdoorName] + m2[tableColumn.Name] = m[tableColumn.CasdoorName] } return m2 diff --git a/object/user.go b/object/user.go index 31e23452..d6b2d1f9 100644 --- a/object/user.go +++ b/object/user.go @@ -289,25 +289,6 @@ func UpdateUserForAllFields(id string, user *User) bool { return affected != 0 } -func UpdateUserForOriginalFields(user *User) bool { - owner, name := util.GetOwnerAndNameFromId(user.GetId()) - oldUser := getUser(owner, name) - if oldUser == nil { - return false - } - - if user.Avatar != oldUser.Avatar && user.Avatar != "" { - user.PermanentAvatar = getPermanentAvatarUrl(user.Owner, user.Name, user.Avatar) - } - - affected, err := adapter.Engine.ID(core.PK{user.Owner, user.Name}).Cols("display_name", "password", "phone", "avatar", "affiliation", "score", "is_forbidden", "hash", "pre_hash").Update(user) - if err != nil { - panic(err) - } - - return affected != 0 -} - func AddUser(user *User) bool { if user.Id == "" { user.Id = util.GenerateId() diff --git a/util/string.go b/util/string.go index ebd47bd1..eab4527d 100644 --- a/util/string.go +++ b/util/string.go @@ -15,6 +15,7 @@ package util import ( + "bytes" "crypto/md5" "encoding/hex" "errors" @@ -52,6 +53,22 @@ func BoolToString(b bool) string { } } +func CamelToSnakeCase(camel string) string { + var buf bytes.Buffer + for _, c := range camel { + if 'A' <= c && c <= 'Z' { + // just convert [A-Z] to _[a-z] + if buf.Len() > 0 { + buf.WriteRune('_') + } + buf.WriteRune(c - 'A' + 'a') + } else { + buf.WriteRune(c) + } + } + return buf.String() +} + func GetOwnerAndNameFromId(id string) (string, string) { tokens := strings.Split(id, "/") if len(tokens) != 2 {