feat: return most backend API errors to frontend (#1836)

* feat: return most backend API errros to frontend

Signed-off-by: yehong <239859435@qq.com>

* refactor: reduce int type change

Signed-off-by: yehong <239859435@qq.com>

* feat: return err backend in token.go

Signed-off-by: yehong <239859435@qq.com>

---------

Signed-off-by: yehong <239859435@qq.com>
This commit is contained in:
yehong
2023-05-30 15:49:39 +08:00
committed by GitHub
parent 34151c0095
commit 02e692a300
105 changed files with 3788 additions and 1734 deletions

View File

@ -36,79 +36,90 @@ type Role struct {
IsEnabled bool `json:"isEnabled"`
}
func GetRoleCount(owner, field, value string) int {
func GetRoleCount(owner, field, value string) (int64, error) {
session := GetSession(owner, -1, -1, field, value, "", "")
count, err := session.Count(&Role{})
if err != nil {
panic(err)
}
return int(count)
return session.Count(&Role{})
}
func GetRoles(owner string) []*Role {
func GetRoles(owner string) ([]*Role, error) {
roles := []*Role{}
err := adapter.Engine.Desc("created_time").Find(&roles, &Role{Owner: owner})
if err != nil {
panic(err)
return roles, err
}
return roles
return roles, nil
}
func GetPaginationRoles(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Role {
func GetPaginationRoles(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Role, error) {
roles := []*Role{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
err := session.Find(&roles)
if err != nil {
panic(err)
return roles, err
}
return roles
return roles, nil
}
func getRole(owner string, name string) *Role {
func getRole(owner string, name string) (*Role, error) {
if owner == "" || name == "" {
return nil
return nil, nil
}
role := Role{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&role)
if err != nil {
panic(err)
return &role, err
}
if existed {
return &role
return &role, nil
} else {
return nil
return nil, nil
}
}
func GetRole(id string) *Role {
func GetRole(id string) (*Role, error) {
owner, name := util.GetOwnerAndNameFromId(id)
return getRole(owner, name)
}
func UpdateRole(id string, role *Role) bool {
func UpdateRole(id string, role *Role) (bool, error) {
owner, name := util.GetOwnerAndNameFromId(id)
oldRole := getRole(owner, name)
oldRole, err := getRole(owner, name)
if err != nil {
return false, err
}
if oldRole == nil {
return false
return false, nil
}
visited := map[string]struct{}{}
permissions := GetPermissionsByRole(id)
permissions, err := GetPermissionsByRole(id)
if err != nil {
return false, err
}
for _, permission := range permissions {
removeGroupingPolicies(permission)
removePolicies(permission)
visited[permission.GetId()] = struct{}{}
}
ancestorRoles := GetAncestorRoles(id)
ancestorRoles, err := GetAncestorRoles(id)
if err != nil {
return false, err
}
for _, r := range ancestorRoles {
permissions := GetPermissionsByRole(r.GetId())
permissions, err := GetPermissionsByRole(r.GetId())
if err != nil {
return false, err
}
for _, permission := range permissions {
permissionId := permission.GetId()
if _, ok := visited[permissionId]; !ok {
@ -121,27 +132,38 @@ func UpdateRole(id string, role *Role) bool {
if name != role.Name {
err := roleChangeTrigger(name, role.Name)
if err != nil {
return false
return false, nil
}
}
affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(role)
if err != nil {
panic(err)
return false, err
}
visited = map[string]struct{}{}
newRoleID := role.GetId()
permissions = GetPermissionsByRole(newRoleID)
permissions, err = GetPermissionsByRole(newRoleID)
if err != nil {
return false, err
}
for _, permission := range permissions {
addGroupingPolicies(permission)
addPolicies(permission)
visited[permission.GetId()] = struct{}{}
}
ancestorRoles = GetAncestorRoles(newRoleID)
ancestorRoles, err = GetAncestorRoles(newRoleID)
if err != nil {
return false, err
}
for _, r := range ancestorRoles {
permissions := GetPermissionsByRole(r.GetId())
permissions, err := GetPermissionsByRole(r.GetId())
if err != nil {
return false, err
}
for _, permission := range permissions {
permissionId := permission.GetId()
if _, ok := visited[permissionId]; !ok {
@ -151,16 +173,16 @@ func UpdateRole(id string, role *Role) bool {
}
}
return affected != 0
return affected != 0, nil
}
func AddRole(role *Role) bool {
func AddRole(role *Role) (bool, error) {
affected, err := adapter.Engine.Insert(role)
if err != nil {
panic(err)
return false, err
}
return affected != 0
return affected != 0, nil
}
func AddRoles(roles []*Role) bool {
@ -202,38 +224,45 @@ func AddRolesInBatch(roles []*Role) bool {
return affected
}
func DeleteRole(role *Role) bool {
func DeleteRole(role *Role) (bool, error) {
roleId := role.GetId()
permissions := GetPermissionsByRole(roleId)
permissions, err := GetPermissionsByRole(roleId)
if err != nil {
return false, err
}
for _, permission := range permissions {
permission.Roles = util.DeleteVal(permission.Roles, roleId)
UpdatePermission(permission.GetId(), permission)
_, err := UpdatePermission(permission.GetId(), permission)
if err != nil {
return false, err
}
}
affected, err := adapter.Engine.ID(core.PK{role.Owner, role.Name}).Delete(&Role{})
if err != nil {
panic(err)
return false, err
}
return affected != 0
return affected != 0, nil
}
func (role *Role) GetId() string {
return fmt.Sprintf("%s/%s", role.Owner, role.Name)
}
func GetRolesByUser(userId string) []*Role {
func GetRolesByUser(userId string) ([]*Role, error) {
roles := []*Role{}
err := adapter.Engine.Where("users like ?", "%"+userId+"\"%").Find(&roles)
if err != nil {
panic(err)
return roles, err
}
for i := range roles {
roles[i].Users = nil
}
return roles
return roles, nil
}
func roleChangeTrigger(oldName string, newName string) error {
@ -250,6 +279,7 @@ func roleChangeTrigger(oldName string, newName string) error {
if err != nil {
return err
}
for _, role := range roles {
for j, u := range role.Roles {
owner, name := util.GetOwnerAndNameFromId(u)
@ -268,6 +298,7 @@ func roleChangeTrigger(oldName string, newName string) error {
if err != nil {
return err
}
for _, permission := range permissions {
for j, u := range permission.Roles {
// u = organization/username
@ -293,17 +324,17 @@ func GetMaskedRoles(roles []*Role) []*Role {
return roles
}
func GetRolesByNamePrefix(owner string, prefix string) []*Role {
func GetRolesByNamePrefix(owner string, prefix string) ([]*Role, error) {
roles := []*Role{}
err := adapter.Engine.Where("owner=? and name like ?", owner, prefix+"%").Find(&roles)
if err != nil {
panic(err)
return roles, err
}
return roles
return roles, nil
}
func GetAncestorRoles(roleId string) []*Role {
func GetAncestorRoles(roleId string) ([]*Role, error) {
var (
result []*Role
roleMap = make(map[string]*Role)
@ -312,7 +343,11 @@ func GetAncestorRoles(roleId string) []*Role {
owner, _ := util.GetOwnerAndNameFromIdNoCheck(roleId)
allRoles := GetRoles(owner)
allRoles, err := GetRoles(owner)
if err != nil {
return nil, err
}
for _, r := range allRoles {
roleMap[r.GetId()] = r
}
@ -331,7 +366,7 @@ func GetAncestorRoles(roleId string) []*Role {
}
}
return result
return result, nil
}
// containsRole is a helper function to check if a slice of roles contains a specific roleId