add isPermissionMethod #8

Merged
lqhoang99 merged 6 commits from feature/isPermission into master 2021-11-11 10:07:15 +00:00
3 changed files with 73 additions and 2 deletions
Showing only changes of commit 2a74aa1b8e - Show all commits

View File

@ -33,8 +33,8 @@ func (s Service) ChangeUserStatus(userID, newStatus string) error {
return user.ChangeUserStatus(userID, newStatus) return user.ChangeUserStatus(userID, newStatus)
} }
// GetAllUser ... // GetAllUsers ...
func (s Service) GetAllUser(query model.UserAllQuery) model.UserAll { func (s Service) GetAllUsers(query model.UserAllQuery) model.UserAll {
return user.All(query) return user.All(query)
} }
@ -48,6 +48,11 @@ func (s Service) LoginWithEmailAndPassword(email, password string) (model.User,
return user.LoginWithEmailAndPassword(email, password) return user.LoginWithEmailAndPassword(email, password)
} }
// IsPermission ...
func (s Service) IsPermission(userID, permission string) bool {
return user.IsPermission(userID, permission)
}
// //
// Role // Role
// //

View File

@ -66,6 +66,21 @@ func roleFindByID(ctx context.Context, id primitive.ObjectID) (model.DBRole, err
return doc, err return doc, err
} }
// permissionCountByCondition ...
func permissionCountByCondition(ctx context.Context, cond interface{}) int64 {
var (
col = database.GetPermissionCol()
)
total, err := col.CountDocuments(ctx, cond)
if err != nil {
logger.Error("usermngmt - Permission - CountDocuments", logger.LogData{
"err": err.Error(),
"cond": cond,
})
}
return total
}
func create(ctx context.Context, doc model.DBUser) error { func create(ctx context.Context, doc model.DBUser) error {
var ( var (
col = database.GetUserCol() col = database.GetUserCol()

View File

@ -319,3 +319,54 @@ func LoginWithEmailAndPassword(email, password string) (result model.User, err e
result = getResponse(ctx, user) result = getResponse(ctx, user)
return return
} }
// IsPermission ...
func IsPermission(userID, permission string) (result bool) {
var (
ctx = context.Background()
)
// Validate userID, permission
if userID == "" || permission == "" {
logger.Error("usermngmt - IsPermission: email or password cannot be empty", logger.LogData{
"userID": userID,
"permission": permission,
})
return
}
id, isValid := mongodb.NewIDFromString(userID)
namhq1989 commented 2021-11-10 10:09:57 +00:00 (Migrated from github.com)
Review

func này muốn nhanh thì làm thêm in-memory cache (https://github.com/allegro/bigcache) như sau:

  • init thì call func A query hết role và permission ra lưu vào mem
  • khi có thay đổi (CRUD) thì call lại func A
  • khi cần check thì chỉ cần lấy từ mem lên để check
func này muốn nhanh thì làm thêm in-memory cache (https://github.com/allegro/bigcache) như sau: - init thì call func A query hết role và permission ra lưu vào mem - khi có thay đổi (CRUD) thì call lại func A - khi cần check thì chỉ cần lấy từ mem lên để check
lqhoang99 commented 2021-11-11 03:20:41 +00:00 (Migrated from github.com)
Review

done

done
if !isValid {
logger.Error("usermngmt - IsPermission: invalid user id", logger.LogData{
"userID": userID,
"permission": permission,
})
return
}
// Find user
user, _ := findByID(ctx, id)
if user.ID.IsZero() {
logger.Error("usermngmt - IsPermission: user not found", logger.LogData{
"userID": userID,
"permission": permission,
})
return
}
// Check isAdmin
if role, _ := roleFindByID(ctx, user.RoleID); role.IsAdmin {
result = true
return
}
// Check permission
if total := permissionCountByCondition(ctx, bson.M{
"roleId": user.RoleID,
"code": permission,
}); total > 0 {
result = true
return
}
return
namhq1989 commented 2021-11-11 04:06:38 +00:00 (Migrated from github.com)
Review

chỗ này thiếu

  1. trong package cache phải có 1 hàm GetCachedRoles trả về CachedRoles, trong hàm đó nếu check cachedRoles = nil thì phải call hàm Roles để tạo cache mới
  2. ở chỗ này gọi hàm GetCachedRoles
  3. dựa vào user.RoleID để pick ra data của role đó, sau đó check mảng permission

2 bước 2,3 nên đưa ra 1 func checkUserHasPermissionFromCache để làm cho gọn code

chỗ này thiếu 1. trong package ` cache` phải có 1 hàm `GetCachedRoles` trả về `CachedRoles`, trong hàm đó nếu check `cachedRoles = nil` thì phải call hàm `Roles` để tạo cache mới 2. ở chỗ này gọi hàm `GetCachedRoles` 3. dựa vào user.RoleID để pick ra data của role đó, sau đó check mảng permission ---- 2 bước 2,3 nên đưa ra 1 func `checkUserHasPermissionFromCache` để làm cho gọn code
lqhoang99 commented 2021-11-11 08:16:36 +00:00 (Migrated from github.com)
Review

done

done
}