210 lines
5.0 KiB
Go
210 lines
5.0 KiB
Go
package cms
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
|
||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||
)
|
||
|
||
func GetMenu(ctx *jxcontext.Context, userID string) (menus []*model.Menu, err error) {
|
||
return dao.GetMenu(dao.GetDB(), "", 0, userID)
|
||
}
|
||
|
||
func AddMenu(ctx *jxcontext.Context, menu *model.Menu) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
if menu == nil {
|
||
return fmt.Errorf("添加失败!menu nil")
|
||
}
|
||
if menu.Name == "" || menu.Level == 0 {
|
||
return fmt.Errorf("添加失败!menu 名称和等级必须有值!")
|
||
}
|
||
menus, err := dao.GetMenu(db, menu.Name, menu.Level, "")
|
||
if len(menus) > 0 {
|
||
return fmt.Errorf("添加失败!已存在相同名称的 menu name : %v", menu.Name)
|
||
}
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db)
|
||
panic(r)
|
||
}
|
||
}()
|
||
dao.WrapAddIDCULDEntity(menu, ctx.GetUserName())
|
||
err = dao.CreateEntity(db, menu)
|
||
dao.Commit(db)
|
||
return err
|
||
}
|
||
|
||
func UpdateMenu(ctx *jxcontext.Context, menuID int, payload map[string]interface{}, isDelete bool) (num int64, err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
menu := &model.Menu{}
|
||
menu.ID = menuID
|
||
err = dao.GetEntity(db, menu)
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db)
|
||
panic(r)
|
||
}
|
||
}()
|
||
if !isDelete {
|
||
valid := dao.StrictMakeMapByStructObject(payload, menu, ctx.GetUserName())
|
||
if len(valid) > 0 {
|
||
if num, err = dao.UpdateEntityLogically(db, menu, valid, ctx.GetUserName(), nil); err != nil {
|
||
dao.Rollback(db)
|
||
return 0, err
|
||
}
|
||
}
|
||
} else {
|
||
menu.DeletedAt = time.Now()
|
||
num, err = dao.UpdateEntity(db, menu, "DeletedAt")
|
||
}
|
||
dao.Commit(db)
|
||
return num, err
|
||
}
|
||
|
||
func GetRole(ctx *jxcontext.Context) (roles []*model.Role, err error) {
|
||
return dao.GetRole(dao.GetDB(), "")
|
||
}
|
||
|
||
func AddRole(ctx *jxcontext.Context, name string) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
roles, err := dao.GetRole(db, name)
|
||
if len(roles) > 0 {
|
||
return fmt.Errorf("添加失败!已存在相同名称的 role name : %v", name)
|
||
}
|
||
role := &model.Role{
|
||
Name: name,
|
||
}
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db)
|
||
panic(r)
|
||
}
|
||
}()
|
||
dao.WrapAddIDCULDEntity(role, ctx.GetUserName())
|
||
err = dao.CreateEntity(db, role)
|
||
dao.Commit(db)
|
||
return err
|
||
}
|
||
|
||
func UpdateRole(ctx *jxcontext.Context, roleID int, name string, isDelete bool) (num int64, err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
if roleID == 1 {
|
||
return 0, fmt.Errorf("管理员不允许修改!")
|
||
}
|
||
role := &model.Role{}
|
||
role.ID = roleID
|
||
err = dao.GetEntity(db, role)
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db)
|
||
panic(r)
|
||
}
|
||
}()
|
||
if !isDelete {
|
||
role.Name = name
|
||
role.UpdatedAt = time.Now()
|
||
role.LastOperator = ctx.GetUserName()
|
||
num, err = dao.UpdateEntity(db, role, "Name", "UpdatedAt", "LastOperator")
|
||
} else {
|
||
role.DeletedAt = time.Now()
|
||
num, err = dao.UpdateEntity(db, role, "DeletedAt")
|
||
}
|
||
dao.Commit(db)
|
||
return num, err
|
||
}
|
||
|
||
func GetUserRole(ctx *jxcontext.Context, userID string) (userRoles []*model.UserRole, err error) {
|
||
return dao.GetUserRole(dao.GetDB(), []string{userID}, nil)
|
||
}
|
||
|
||
func UpdateUserRole(ctx *jxcontext.Context, userIDs []string, roleIDs []int) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
roleIDMap = make(map[int]int)
|
||
nowRoleIDMap = make(map[int]int)
|
||
userRoleMap = make(map[string][]int)
|
||
addUserRoleMap = make(map[string][]int)
|
||
deleteUserRoleMap = make(map[string][]int)
|
||
)
|
||
for _, v := range roleIDs {
|
||
roleIDMap[v] = 1
|
||
}
|
||
userRoles, err := dao.GetUserRole(db, userIDs, nil)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if len(userRoles) > 0 {
|
||
for _, v := range userRoles {
|
||
userRoleMap[v.UserID] = append(userRoleMap[v.UserID], v.RoleID)
|
||
}
|
||
}
|
||
for _, userID := range userIDs {
|
||
nowRoleIDs := userRoleMap[userID]
|
||
for _, nowRoleID := range nowRoleIDs {
|
||
if roleIDMap[nowRoleID] == 0 {
|
||
deleteUserRoleMap[userID] = append(deleteUserRoleMap[userID], nowRoleID)
|
||
}
|
||
nowRoleIDMap[nowRoleID] = 1
|
||
}
|
||
for _, roleID := range roleIDMap {
|
||
if nowRoleIDMap[roleID] == 0 {
|
||
addUserRoleMap[userID] = append(addUserRoleMap[userID], roleID)
|
||
}
|
||
}
|
||
}
|
||
dao.Begin(db)
|
||
defer func() {
|
||
if r := recover(); r != nil {
|
||
dao.Rollback(db)
|
||
panic(r)
|
||
}
|
||
}()
|
||
if len(addUserRoleMap) > 0 {
|
||
for userID, roleIDs := range addUserRoleMap {
|
||
for _, roleID := range roleIDs {
|
||
userRole := &model.UserRole{
|
||
UserID: userID,
|
||
RoleID: roleID,
|
||
}
|
||
dao.WrapAddIDCULDEntity(userRole, ctx.GetUserName())
|
||
err = dao.CreateEntity(db, userRole)
|
||
}
|
||
}
|
||
}
|
||
if len(deleteUserRoleMap) > 0 {
|
||
for userID, roleIDs := range deleteUserRoleMap {
|
||
for _, roleID := range roleIDs {
|
||
userRoles, _ := dao.GetUserRole(db, []string{userID}, []int{roleID})
|
||
if len(userRoles) > 0 {
|
||
userRoles[0].DeletedAt = time.Now()
|
||
userRoles[0].LastOperator = ctx.GetUserName()
|
||
_, err = dao.UpdateEntity(db, userRoles[0], "DeletedAt", "LastOperator")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
dao.Commit(db)
|
||
return err
|
||
}
|