来源:hgdjnet-server 9bfbafe10d417deea959bd53117bc88a10e60a83 项目身份 HKDJ / JHA-216,独立官网仓库,Jenkins 守卫键 hkdjnet 测试目录 /server/hkdj_net,App/Web API 30331/30332 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
222 lines
5.0 KiB
Go
222 lines
5.0 KiB
Go
package srv_mwacc
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"hkdj-web-server/pub/common/errors"
|
|
"hkdj-web-server/pub/common/log"
|
|
"hkdj-web-server/pub/common/srvdef"
|
|
"hkdj-web-server/pub/models/mwacc"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
)
|
|
|
|
// 删除角色
|
|
func RoleDel(ctx context.Context, roleId int64) (bool, *srvdef.SrvErr) {
|
|
|
|
res, err := mwacc.FindOneRoleByFilter(ctx, bson.M{mwacc.FN.MwRole.Id: roleId})
|
|
|
|
if err != nil || res.Id == 0 {
|
|
log.ZapLog.Error(fmt.Sprintf("search error %v", err))
|
|
return false, err
|
|
}
|
|
|
|
// 查询记录是否有账户
|
|
roles, err1 := mwacc.RoleAggregate(ctx,
|
|
[]bson.M{
|
|
{"$match": bson.M{mwacc.FN.MwRole.Id: roleId}},
|
|
{"$limit": 1},
|
|
{"$lookup": bson.M{
|
|
"localField": mwacc.FN.MwRole.Id,
|
|
"from": mwacc.TN.MwAcc,
|
|
"foreignField": mwacc.FN.MwAcc.RoleId,
|
|
"as": "onlyRole",
|
|
}},
|
|
{"$unwind": "$onlyRole"},
|
|
{"$project": bson.M{
|
|
mwacc.FN.MwRole.Id: 1,
|
|
"onlyRole.roleId": 1,
|
|
}},
|
|
})
|
|
|
|
if err1 != nil {
|
|
log.Error("角色删除失败", log.Any("roleId", roleId))
|
|
return false, srvdef.New(srvdef.ErrDbDeleteError, "", "")
|
|
}
|
|
|
|
if len(roles) > 0 {
|
|
log.Error("角色删除失败", log.Any("roleId", roleId))
|
|
return false, srvdef.New(srvdef.ErrDbDeleteError, "删除失败,此角色有帐户", "")
|
|
}
|
|
|
|
serr := mwacc.DelRoleByFilter(ctx, bson.M{mwacc.FN.MwRole.Id: roleId})
|
|
if serr != nil {
|
|
return false, serr
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
// 获取信息
|
|
func RoleGetInfo(ctx context.Context, roleId int64) (*mwacc.MwRole, error) {
|
|
|
|
rest, err := mwacc.FindOneRoleByFilter(ctx, bson.M{
|
|
mwacc.FN.MwRole.Id: roleId,
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return rest, nil
|
|
}
|
|
|
|
// 角色id
|
|
|
|
// 角色更新
|
|
func RoleUp(ctx context.Context, id int64, name string, desc string, isEnb bool) (ok bool, err error) {
|
|
|
|
roleCount, err := mwacc.RoleCountByFilter(ctx, bson.M{
|
|
mwacc.FN.MwRole.Name: name,
|
|
mwacc.FN.MwRole.Id: bson.M{
|
|
"$ne": id,
|
|
},
|
|
})
|
|
|
|
if roleCount > 0 {
|
|
err = errors.MakeWithMsg(errors.DBInsert, "角色名称已存在")
|
|
return false, err
|
|
}
|
|
|
|
err = mwacc.UpOneRoleByFilter(ctx, bson.M{
|
|
mwacc.FN.MwRole.Id: id,
|
|
}, bson.M{
|
|
"$set": bson.M{
|
|
mwacc.FN.MwRole.Name: name,
|
|
mwacc.FN.MwRole.Desc: desc,
|
|
mwacc.FN.MwRole.IsEnb: isEnb,
|
|
mwacc.FN.MwRole.UpdatedAt: time.Now(),
|
|
},
|
|
})
|
|
|
|
if err != nil {
|
|
log.ZapLog.Error(fmt.Sprintf("RoleUp error %v", err))
|
|
err = errors.MakeWithErr(errors.DBUpdate, err)
|
|
return
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
// 设置角色状态
|
|
func RoleEnable(ctx context.Context, roleId int64, IsEnb bool) (bool, *srvdef.SrvErr) {
|
|
|
|
rest, err := mwacc.FindOneRoleByFilter(ctx, bson.M{
|
|
mwacc.FN.MwRole.Id: roleId,
|
|
})
|
|
|
|
if err != nil || rest.Id == 0 {
|
|
return false, err
|
|
}
|
|
// count, err := mwacc.RoleAggregate(ctx, []bson.M{
|
|
// {"$match": bson.M{
|
|
// mwacc.FN.MwRole.Id: roleId,
|
|
// }},
|
|
// {"$limit": 1},
|
|
// {"$lookup": bson.M{
|
|
// "localField": mwacc.FN.MwRole.Id,
|
|
// "from": mwacc.TN.MwAcc,
|
|
// "foreignField": mwacc.FN.MwAcc.RoleId,
|
|
// "as": "onlyRole",
|
|
// }},
|
|
// {"$unwind": "$onlyRole"},
|
|
// {"$project": bson.M{
|
|
// "roleId": 1,
|
|
// "onlyRole.roleId": 1,
|
|
// }},
|
|
// })
|
|
data, err1 := mwacc.FindManyAccByFilter(ctx, bson.M{mwacc.FN.MwAcc.RoleId: roleId})
|
|
if err1 != nil {
|
|
return false, err1
|
|
}
|
|
|
|
if len(data) > 0 && IsEnb == false {
|
|
return false, srvdef.New(srvdef.ErrDbUpdateError, "更新失败,此角色下拥有管理员", "")
|
|
}
|
|
|
|
StatusErr := mwacc.UpOneRoleByFilter(ctx, bson.M{
|
|
mwacc.FN.MwRole.Id: roleId,
|
|
}, bson.M{
|
|
"$set": bson.M{
|
|
mwacc.FN.MwRole.IsEnb: IsEnb,
|
|
},
|
|
})
|
|
|
|
if StatusErr != nil {
|
|
return false, StatusErr
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
// 数据库Router转网站Router
|
|
|
|
// // 角色权限列表
|
|
// func RoleAuthList(ctx context.Context, roleId int64) (*mwacc.MwRole, error) {
|
|
// opt := &options.FindOneOptions{}
|
|
// opt.SetProjection(bson.M{
|
|
// mwacc.FN.MwRole.Id: 1,
|
|
// mwacc.FN.MwRole.Router: 1,
|
|
// })
|
|
|
|
// res, err := mwacc.FindOneRoleByFilter(ctx, bson.M{mwacc.FN.MwRole.Id: roleId})
|
|
// if err != nil {
|
|
// return &mwacc.MwRole{}, err
|
|
// }
|
|
// if res.Id != 0 {
|
|
// return res, nil
|
|
// }
|
|
// return nil, nil
|
|
// }
|
|
|
|
func handleMenu(ctx context.Context, reqRouter []*mwacc.Router, apiMap map[string]int64) map[string]int64 {
|
|
|
|
if apiMap == nil {
|
|
apiMap = make(map[string]int64)
|
|
}
|
|
|
|
for _, v := range reqRouter {
|
|
if v.Children != nil && len(v.Children) != 0 {
|
|
childs := make([]*mwacc.Router, 0)
|
|
for _, v := range v.Children {
|
|
childs = append(childs, &v)
|
|
}
|
|
apiMap = handleMenu(ctx, childs, apiMap)
|
|
}
|
|
if v.ApiUrl != nil && len(v.ApiUrl) != 0 {
|
|
for _, v := range v.ApiUrl {
|
|
if v.Status == true {
|
|
for _, value := range v.Url {
|
|
apiMap[value] = 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return apiMap
|
|
}
|
|
|
|
// 更新权限
|
|
func UpAuth(ctx context.Context, id int64, dataRouter []*mwacc.Router) (ok bool, err error) {
|
|
|
|
apiMap := handleMenu(ctx, dataRouter, nil)
|
|
|
|
keys := make([]string, 0)
|
|
for k := range apiMap {
|
|
keys = append(keys, k)
|
|
}
|
|
|
|
return mwacc.UpRoleAuth(ctx, id, keys, dataRouter)
|
|
}
|