casdoor/original/sync.go

150 lines
4.1 KiB
Go
Raw Normal View History

2021-05-02 23:06:08 +08:00
// Copyright 2021 The casbin Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package original
import (
"fmt"
"strconv"
2021-05-09 16:14:05 +08:00
"strings"
2021-05-02 23:06:08 +08:00
"github.com/casdoor/casdoor/object"
"github.com/casdoor/casdoor/util"
)
2021-05-08 22:04:45 +08:00
func getFullAvatarUrl(avatar string) string {
2021-05-16 21:26:30 +08:00
if !strings.HasPrefix(avatar, "https://") {
return fmt.Sprintf("%s%s", avatarBaseUrl, avatar)
}
return avatar
2021-05-08 22:04:45 +08:00
}
2021-05-09 16:14:05 +08:00
func getPartialAvatarUrl(avatar string) string {
if strings.HasPrefix(avatar, avatarBaseUrl) {
return avatar[len(avatarBaseUrl):]
}
return avatar
}
2021-06-04 23:00:54 +08:00
func createUserFromOriginalUser(originalUser *User, affiliationMap map[int]string) *object.User {
affiliation := ""
if originalUser.SchoolId != 0 {
var ok bool
affiliation, ok = affiliationMap[originalUser.SchoolId]
if !ok {
panic(fmt.Sprintf("SchoolId not found: %d", originalUser.SchoolId))
}
}
2021-05-02 23:06:08 +08:00
user := &object.User{
Owner: orgName,
Name: strconv.Itoa(originalUser.Id),
CreatedTime: util.GetCurrentTime(),
Id: strconv.Itoa(originalUser.Id),
Type: "normal-user",
Password: originalUser.Password,
DisplayName: originalUser.Name,
2021-05-08 22:04:45 +08:00
Avatar: getFullAvatarUrl(originalUser.Avatar),
2021-05-02 23:06:08 +08:00
Email: "",
Phone: originalUser.Cellphone,
2021-06-04 23:00:54 +08:00
Affiliation: affiliation,
Score: originalUser.SchoolId,
2021-05-02 23:06:08 +08:00
IsAdmin: false,
IsGlobalAdmin: false,
IsForbidden: originalUser.Deleted != 0,
}
return user
}
2021-05-09 15:44:12 +08:00
func createOriginalUserFromUser(user *object.User) *User {
deleted := 0
if user.IsForbidden {
deleted = 1
}
originalUser := &User{
Id: util.ParseInt(user.Id),
Name: user.DisplayName,
Password: user.Password,
Cellphone: user.Phone,
2021-06-04 23:00:54 +08:00
SchoolId: user.Score,
2021-05-09 16:14:05 +08:00
Avatar: getPartialAvatarUrl(user.Avatar),
2021-05-09 15:44:12 +08:00
Deleted: deleted,
}
return originalUser
}
2021-05-02 23:06:08 +08:00
func syncUsers() {
2021-05-02 23:18:12 +08:00
fmt.Printf("Running syncUsers()..\n")
2021-05-08 22:04:45 +08:00
users, userMap := getUserMap()
2021-05-09 15:44:12 +08:00
oUsers, oUserMap := getUserMapOriginal()
2021-05-08 22:04:45 +08:00
fmt.Printf("Users: %d, oUsers: %d\n", len(users), len(oUsers))
2021-05-02 23:06:08 +08:00
2021-06-04 23:00:54 +08:00
_, affiliationMap := getAffiliationMap()
2021-05-02 23:06:08 +08:00
newUsers := []*object.User{}
for _, oUser := range oUsers {
id := strconv.Itoa(oUser.Id)
if _, ok := userMap[id]; !ok {
2021-06-04 23:00:54 +08:00
newUser := createUserFromOriginalUser(oUser, affiliationMap)
2021-05-09 15:44:12 +08:00
fmt.Printf("New user: %v\n", newUser)
newUsers = append(newUsers, newUser)
2021-05-08 22:04:45 +08:00
} else {
user := userMap[id]
2021-05-09 15:44:12 +08:00
oHash := calculateHash(oUser)
if user.Hash == user.PreHash {
if user.Hash != oHash {
2021-06-04 23:00:54 +08:00
updatedUser := createUserFromOriginalUser(oUser, affiliationMap)
2021-05-09 15:44:12 +08:00
updatedUser.Hash = oHash
updatedUser.PreHash = oHash
object.UpdateUserForOriginal(updatedUser)
fmt.Printf("Update from oUser to user: %v\n", updatedUser)
}
} else {
if user.PreHash == oHash {
updatedOUser := createOriginalUserFromUser(user)
updateUser(updatedOUser)
fmt.Printf("Update from user to oUser: %v\n", updatedOUser)
// update preHash
user.PreHash = user.Hash
2021-05-09 16:14:05 +08:00
object.SetUserField(user, "pre_hash", user.PreHash)
2021-05-09 15:44:12 +08:00
} else {
if user.Hash == oHash {
// update preHash
user.PreHash = user.Hash
2021-05-09 16:14:05 +08:00
object.SetUserField(user, "pre_hash", user.PreHash)
2021-05-09 15:44:12 +08:00
} else {
2021-06-04 23:00:54 +08:00
updatedUser := createUserFromOriginalUser(oUser, affiliationMap)
2021-05-09 15:44:12 +08:00
updatedUser.Hash = oHash
updatedUser.PreHash = oHash
object.UpdateUserForOriginal(updatedUser)
fmt.Printf("Update from oUser to user (2nd condition): %v\n", updatedUser)
}
}
2021-05-08 22:04:45 +08:00
}
2021-05-02 23:06:08 +08:00
}
}
object.AddUsersSafe(newUsers)
2021-05-09 15:44:12 +08:00
for _, user := range users {
id := user.Id
if _, ok := oUserMap[id]; !ok {
panic(fmt.Sprintf("New original user: cannot create now, user = %v", user))
}
}
2021-05-02 23:06:08 +08:00
}