package srv_mwacc import ( "context" "strings" "time" "videoweb/pub/common/crypt" "videoweb/pub/common/enum/consts" "videoweb/pub/common/log" "videoweb/pub/common/srvdef" "videoweb/pub/common/utils" "videoweb/pub/models/mwacc" "videoweb/web/webg" "go.mongodb.org/mongo-driver/bson" ) func generateToken(userID int64) (string, error) { return utils.GenerateUserToken(utils.UserClaims{UserID: userID, Expire: consts.AdminJwtTokenExpire}, webg.Conf.JwtKey) } // AccSLogin 账号登录 func AccSLogin(ctx context.Context, acc string, pwd string) (*mwacc.MwAcc, *srvdef.SrvErr) { var data *mwacc.MwAcc res, dataErr := mwacc.FindOneAccByFilter(ctx, bson.M{ mwacc.FN.MwAcc.Acc: acc, }) if dataErr != nil || res.Id == 0 { return data, srvdef.New(srvdef.AccountIsNotExists, srvdef.AccountIsNotExists.Msg(), "") } if !res.IsEnb { return data, srvdef.New(srvdef.AccountErrAccessForbid, srvdef.AccountErrAccessForbid.Msg(), "") } // 通过验证,再次验证密码是否正确 md5pwd := crypt.StrToMd5(pwd) if res.Pwd != md5pwd { return data, srvdef.New(srvdef.AccountErrPasswordError, srvdef.AccountErrPasswordError.Msg(), "") } // slogin 仅允许角色名含“客服”的账号登录 if !isCustomerServiceRole(ctx, res) { return data, srvdef.New(srvdef.ErrUserPermission, "仅客服角色可登录", "") } getToken, err := generateToken(res.Id) if err != nil { return data, srvdef.New(srvdef.GenerateTokenFailed, srvdef.GenerateTokenFailed.Msg(), "") } _ = mwacc.UpOneAccByFilter(ctx, bson.M{ mwacc.FN.MwAcc.Id: res.Id, }, bson.M{ mwacc.FN.MwAcc.LastTime: time.Now(), }) // 更新最近登录时间 data = res data.Token = getToken return data, nil } // isCustomerServiceRole 判断账号角色名是否包含“客服” func isCustomerServiceRole(ctx context.Context, acc *mwacc.MwAcc) bool { if acc == nil { return false } roleName := acc.RoleName if roleName == "" && acc.RoleId > 0 { role, serr := mwacc.FindOneRoleByFilter(ctx, bson.M{mwacc.FN.MwRole.Id: acc.RoleId}) if serr == nil && role != nil { roleName = role.Name } } return strings.Contains(roleName, "客服") } // AccLogin 账号登录(已取消谷歌验证,密码正确即登录) func AccLogin(ctx context.Context, acc string, pwd string) (*mwacc.MwAcc, *srvdef.SrvErr) { var data *mwacc.MwAcc res, dataErr := mwacc.FindOneAccByFilter(ctx, bson.M{ mwacc.FN.MwAcc.Acc: acc, }) if dataErr != nil || res.Id == 0 { return data, srvdef.New(srvdef.AccountIsNotExists, srvdef.AccountIsNotExists.Msg(), "") } if !res.IsEnb { return data, srvdef.New(srvdef.AccountErrAccessForbid, srvdef.AccountErrAccessForbid.Msg(), "") } md5pwd := crypt.StrToMd5(pwd) if res.Pwd != md5pwd { return data, srvdef.New(srvdef.AccountErrPasswordError, srvdef.AccountErrPasswordError.Msg(), "") } getToken, err := generateToken(res.Id) if err != nil { return data, srvdef.New(srvdef.GenerateTokenFailed, srvdef.GenerateTokenFailed.Msg(), "") } _ = mwacc.UpOneAccByFilter(ctx, bson.M{ mwacc.FN.MwAcc.Id: res.Id, }, bson.M{ mwacc.FN.MwAcc.LastTime: time.Now(), }) data = res data.Token = getToken return data, nil } // 账号登录 func ProductAccountList(ctx context.Context, accId int64) ([]ProductAccountInfo, *srvdef.SrvErr) { resp := make([]ProductAccountInfo, 0) accInfo, serr := mwacc.FindOneAccByFilter(ctx, bson.M{ mwacc.FN.MwAcc.Id: accId, }) if serr != nil { log.Error("ProductAccountList FindOneAccByFilter", log.Any("serr", serr)) return nil, srvdef.New(srvdef.ErrDbQueryError, "", "") } if accInfo.RoleId == 1000 { resp = append(resp, ProductAccountInfo{ Id: accInfo.Id, Name: accInfo.UserName, }) return resp, nil } accList, lerr := mwacc.FindManyAccByFilter(ctx, bson.M{ mwacc.FN.MwAcc.RoleId: 1000, }) if lerr != nil { log.Error("ProductAccountList FindManyAccByFilter", log.Any("serr", serr)) return nil, srvdef.New(srvdef.ErrDbQueryError, "", "") } for _, v := range accList { resp = append(resp, ProductAccountInfo{ Id: v.Id, Name: v.UserName, }) } return resp, nil }