Files
rootandClaude Opus 4.7 79ac89b458 Initial commit
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-11-07 10:47:18 +08:00

222 lines
5.0 KiB
Go

package srv_mwacc
import (
"context"
"fmt"
"time"
"videoweb/pub/common/errors"
"videoweb/pub/common/log"
"videoweb/pub/common/srvdef"
"videoweb/pub/models/mwacc"
"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)
}