136 lines
4.4 KiB
Go
136 lines
4.4 KiB
Go
package role
|
|
|
|
import (
|
|
roleModel "busniess-user-center/internal/models/role"
|
|
"busniess-user-center/internal/repo"
|
|
"busniess-user-center/internal/service/util"
|
|
"strconv"
|
|
)
|
|
|
|
func getOrgAuthorAndRole(roleId uint, authorOrgs []roleModel.OrgAuthorBrief, allOrg []*repo.Organization) (authors []repo.OrganizationRoleAuthor, orgRole []repo.OrganizationRole) {
|
|
_, orgchildrenMaps := util.GetOrgMap(allOrg)
|
|
|
|
for _, item := range authorOrgs {
|
|
orgRole = append(orgRole, genOrgRole(roleId, item.Id))
|
|
authors = append(authors, genOrgAuthor(roleId, item))
|
|
|
|
if item.Type == roleModel.IncludeChildrenOrgAuthor {
|
|
childOrgs := util.GetChildren(item.Id, orgchildrenMaps)
|
|
for _, child := range childOrgs {
|
|
orgRole = append(orgRole, genOrgRole(roleId, child.ID))
|
|
}
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func genOrgRole(roleId, orgId uint) repo.OrganizationRole {
|
|
return repo.OrganizationRole{
|
|
OrgID: orgId,
|
|
RoleID: roleId,
|
|
}
|
|
}
|
|
|
|
func genOrgAuthor(roleId uint, orgAuthor roleModel.OrgAuthorBrief) repo.OrganizationRoleAuthor {
|
|
return repo.OrganizationRoleAuthor{
|
|
OrgID: orgAuthor.Id,
|
|
Option: int(orgAuthor.Type),
|
|
RoleID: roleId,
|
|
}
|
|
}
|
|
|
|
func filterOrgAuthorRole(authors, dbAuthors []repo.OrganizationRoleAuthor, orgRole, dbOrgRoles []repo.OrganizationRole) (fAuthors []repo.OrganizationRoleAuthor, fOrgRole []repo.OrganizationRole) {
|
|
dbAuthorMap := make(map[string]repo.OrganizationRoleAuthor, 0)
|
|
dbOrgRoleMap := make(map[string]repo.OrganizationRole, 0)
|
|
|
|
for _, item := range dbAuthors {
|
|
key := strconv.FormatUint(uint64(item.RoleID), 10) + strconv.FormatUint(uint64(item.OrgID), 10)
|
|
dbAuthorMap[key] = item
|
|
}
|
|
|
|
for _, item := range dbOrgRoles {
|
|
key := strconv.FormatUint(uint64(item.RoleID), 10) + strconv.FormatUint(uint64(item.OrgID), 10)
|
|
dbOrgRoleMap[key] = item
|
|
}
|
|
|
|
for _, item := range authors {
|
|
key := strconv.FormatUint(uint64(item.RoleID), 10) + strconv.FormatUint(uint64(item.OrgID), 10)
|
|
if _, ok := dbAuthorMap[key]; !ok {
|
|
fAuthors = append(fAuthors, item)
|
|
}
|
|
}
|
|
|
|
for _, item := range orgRole {
|
|
key := strconv.FormatUint(uint64(item.RoleID), 10) + strconv.FormatUint(uint64(item.OrgID), 10)
|
|
if _, ok := dbOrgRoleMap[key]; !ok {
|
|
fOrgRole = append(fOrgRole, item)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func genRemoveOrgAuthorAndRole(roleId uint, orgIds []uint, allOrg []*repo.Organization, allAuthor []repo.OrganizationRoleAuthor) (authors []repo.OrganizationRoleAuthor, orgRole []repo.OrganizationRole) {
|
|
orgMaps, orgchildrenMaps := util.GetOrgMap(allOrg)
|
|
authorMaps := make(map[string]repo.OrganizationRoleAuthor, 0)
|
|
for _, item := range allAuthor {
|
|
key := strconv.FormatUint(uint64(item.RoleID), 10) + strconv.FormatUint(uint64(item.OrgID), 10)
|
|
authorMaps[key] = item
|
|
}
|
|
|
|
for _, orgId := range orgIds {
|
|
// 判断是否移除当前组织的角色权限:1 父级组织没有包含子类的授权 2 组织自己没有记录 满足着两条可以删除组织角色权限
|
|
key := strconv.FormatUint(uint64(roleId), 10) + strconv.FormatUint(uint64(orgId), 10)
|
|
if author, ok := authorMaps[key]; ok {
|
|
authors = append(authors, repo.OrganizationRoleAuthor{
|
|
OrgID: orgId,
|
|
RoleID: roleId,
|
|
})
|
|
|
|
if whetherRemoveOrgRole(false, author, authorMaps, orgMaps) {
|
|
orgRole = append(orgRole, repo.OrganizationRole{
|
|
OrgID: orgId,
|
|
RoleID: roleId,
|
|
})
|
|
}
|
|
|
|
if roleModel.OrgAuthorRoleType(author.Option) == roleModel.IncludeChildrenOrgAuthor {
|
|
childOrgs := util.GetChildren(orgId, orgchildrenMaps)
|
|
|
|
for _, child := range childOrgs {
|
|
if whetherRemoveOrgRole(true, author, authorMaps, orgMaps) {
|
|
orgRole = append(orgRole, genOrgRole(roleId, child.ID))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func whetherRemoveOrgRole(child bool, author repo.OrganizationRoleAuthor, authorMaps map[string]repo.OrganizationRoleAuthor, orgMaps map[uint]*repo.Organization) bool {
|
|
if !child {
|
|
// 如果是要删除组织自己就不用判断自己是否授权过,如果是要删除组织的子组织,则需要判断子组织是否添加
|
|
key := strconv.FormatUint(uint64(author.RoleID), 10) + strconv.FormatUint(uint64(author.OrgID), 10)
|
|
if _, ok := authorMaps[key]; ok {
|
|
return false
|
|
}
|
|
}
|
|
|
|
// 判断父级是否添加
|
|
parentOrg := util.GetParents(author.OrgID, orgMaps)
|
|
for _, org := range parentOrg {
|
|
key := strconv.FormatUint(uint64(author.RoleID), 10) + strconv.FormatUint(uint64(org.ID), 10)
|
|
|
|
if pAuthor, ok := authorMaps[key]; ok {
|
|
if pAuthor.Option == int(roleModel.IncludeChildrenOrgAuthor) {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|