bilibili-backup/app/admin/main/apm/http/user.go

789 lines
19 KiB
Go
Raw Normal View History

2019-04-22 10:59:20 +08:00
package http
import (
"strings"
"go-common/app/admin/main/apm/conf"
"go-common/app/admin/main/apm/model/user"
"go-common/library/conf/env"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"github.com/jinzhu/gorm"
)
func name(ctx *bm.Context) (name string) {
usernameI, _ := ctx.Get("username")
name, _ = usernameI.(string)
return
}
func userAuth(c *bm.Context) {
var (
usr = &user.User{}
username = name(c)
err error
mdls []*user.Module
rls []*user.Rule
super bool
)
if usr, err = apmSvc.GetUser(c, username); err != nil {
log.Error("apmSvc.userAuth error(%v)", err)
c.JSON(nil, err)
return
}
// err := apmSvc.DB.Where("username = ?", username).First(usr).Error
// if err == gorm.ErrRecordNotFound {
// usr.UserName = username
// usr.NickName = username
// err = apmSvc.DB.Create(usr).Error
// }
// if err != nil {
// log.Error("apmSvc.userAuth error(%v)", err)
// c.JSON(nil, err)
// return
// }
for _, u := range conf.Conf.Superman {
if u == username {
super = true
break
}
}
var (
ms []string
rs []string
)
if super {
for m := range user.Modules {
ms = append(ms, m)
for rl := range user.Rules {
if strings.HasPrefix(rl+"_", m) {
rs = append(rs, rl)
}
}
}
} else {
ms, rs = apmSvc.GetDefaultPermission(c)
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&mdls).Error; err != nil {
log.Error("apmSvc.userAuth modules error(%v)", err)
c.JSON(nil, err)
return
}
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&rls).Error; err != nil {
log.Error("apmSvc.userAuth rules error(%v)", err)
c.JSON(nil, err)
return
}
for _, m := range mdls {
ms = append(ms, m.Module)
}
for _, r := range rls {
rs = append(rs, r.Rule)
}
}
data := user.Result{
Super: super,
User: usr,
Env: env.DeployEnv,
Rules: append(ms, rs...),
}
c.JSON(data, nil)
}
func userRuleStates(c *bm.Context) {
username := name(c)
usr := &user.User{}
err := apmSvc.DB.Where("username = ?", username).First(usr).Error
if err != nil {
log.Error("apmSvc.userRuleStates error(%v)", err)
c.JSON(nil, err)
return
}
for _, u := range conf.Conf.Superman {
if u == username {
c.JSONMap(map[string]interface{}{
"message": "超级管理员拥有所有权限",
}, nil)
return
}
}
var (
//app *user.Apply
rls []*user.Rule
)
app := &user.Apply{}
if err = apmSvc.DB.Where("user_id=? AND status=?", usr.ID, 1).First(app).Error; err != nil && err != gorm.ErrRecordNotFound {
log.Error("apm.Svc.userRuleStates error(%v)", err)
c.JSON(nil, err)
return
}
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&rls).Error; err != nil && err != gorm.ErrRecordNotFound {
log.Error("apm.Svc.userRuleStates error(%v)", err)
c.JSON(nil, err)
return
}
trs := strings.Split(app.Rules, ",")
type ruleRes struct {
Rule string `json:"rule"`
Name string `json:"name"`
State int `json:"state"`
}
data := map[string][]*ruleRes{}
for module := range user.Modules {
if env.DeployEnv != env.DeployEnvProd && module == "CONFIG" {
continue
}
if user.Modules[module].Permit == user.PermitSuper {
continue
}
// if module == "USER" {
// continue
// }
NEXTRULE:
for rule := range user.Rules {
if !strings.HasPrefix(rule, module) {
continue
}
rr := &ruleRes{Rule: rule, Name: user.Rules[rule].Des, State: 0}
_, rdft := apmSvc.GetDefaultPermission(c)
for _, rl := range rdft {
if rule == rl {
rr.State = 1
data[module] = append(data[module], rr)
continue NEXTRULE
}
}
for _, rl := range rls {
if rule == rl.Rule {
rr.State = 1
data[module] = append(data[module], rr)
continue NEXTRULE
}
}
for _, tr := range trs {
if rule == tr {
rr.State = 2
data[module] = append(data[module], rr)
continue NEXTRULE
}
}
data[module] = append(data[module], rr)
}
}
c.JSON(map[string]interface{}{
"user": usr,
"rule_states": data,
}, nil)
}
func userApply(c *bm.Context) {
username := name(c)
usr := &user.User{}
if err := apmSvc.DB.Where("username = ?", username).First(usr).Error; err != nil {
log.Error("apmSvc.userApply error(%v)", err)
c.JSON(nil, err)
return
}
v := new(struct {
Rules []string `form:"rules,split" validate:"required"`
})
if err := c.Bind(v); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
for _, rule := range v.Rules {
if _, ok := user.Rules[rule]; !ok {
c.JSONMap(map[string]interface{}{
"message": "申请的操作不存在",
}, nil)
return
}
}
istr := strings.Join(v.Rules, ",")
m := &user.Apply{
UserID: usr.ID,
Rules: istr,
Status: 1,
}
db := apmSvc.DB.Model(&user.Apply{}).Create(m)
if err := db.Error; err != nil {
log.Error("apmSvc.userApply error(%v)", err)
c.JSON(nil, err)
return
}
c.JSONMap(map[string]interface{}{
"message": "申请成功",
}, nil)
}
func userApplyEdit(c *bm.Context) {
v := new(struct {
ID int64 `form:"id" validate:"required"`
Rules []string `form:"rules,split" validate:"required"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
for _, r := range v.Rules {
if _, ok := user.Rules[r]; !ok {
c.JSONMap(map[string]interface{}{
"message": "申请的操作不存在",
}, nil)
return
}
}
username := name(c)
if err = apmSvc.DB.Model(&user.Apply{}).Where("status = 1 AND id = ?", v.ID).Update(map[string]interface{}{
"rules": strings.Join(v.Rules, ","), "admin": username}).Error; err != nil {
log.Error("apmSvc.userApplyEdit error(%v)", err)
c.JSON(nil, err)
return
}
c.JSONMap(map[string]interface{}{
"message": "修改成功",
}, nil)
}
func userAudit(c *bm.Context) {
username := name(c)
super := false
for _, u := range conf.Conf.Superman {
if u == username {
super = true
break
}
}
if !super {
c.JSON(nil, ecode.AccessDenied)
return
}
v := new(struct {
ID int64 `form:"id" validate:"required"`
Status int8 `form:"status" validate:"required"`
})
if err := c.Bind(v); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if !(v.Status == 2 || v.Status == 3) {
log.Error("apmSvc.userAudit error(%v)", v.Status)
c.JSONMap(map[string]interface{}{
"message": "status值范围为23",
}, ecode.RequestErr)
return
}
if err := apmSvc.DB.Model(&user.Apply{}).Where("id = ? AND status = ?", v.ID, 1).Updates(map[string]interface{}{"status": v.Status, "admin": username}).Error; err != nil {
log.Error("apmSvc.userAudit update user_apply error(%v)", err)
c.JSON(nil, err)
return
}
if v.Status == 3 {
c.JSONMap(map[string]interface{}{
"message": "权限审核不通过",
}, nil)
return
}
apps := &user.Apply{}
if err := apmSvc.DB.Where("id=?", v.ID).First(apps).Error; err != nil {
log.Error("apmSvc.userAudit find user_apply error(%v)", err)
c.JSON(nil, err)
return
}
rules := strings.Split(apps.Rules, ",")
for _, rule := range rules {
r := &user.Rule{}
apmSvc.DB.FirstOrCreate(r, &user.Rule{UserID: apps.UserID, Rule: rule})
for module := range user.Modules {
if strings.HasPrefix(rule, module) {
m := &user.Module{}
apmSvc.DB.FirstOrCreate(m, &user.Module{UserID: apps.UserID, Module: module})
}
}
}
c.JSONMap(map[string]interface{}{
"message": "权限审核通过",
}, nil)
}
func userApplies(c *bm.Context) {
username := name(c)
v := new(struct {
Pn int `form:"pn" default:"1" validate:"min=1"`
Ps int `form:"ps" default:"20" validate:"min=1"`
Name string `form:"name"`
})
err := c.Bind(v)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
var (
super bool
total int
applies []*user.Applies
)
for _, u := range conf.Conf.Superman {
if u == username {
super = true
break
}
}
if !super {
c.JSON(nil, ecode.AccessDenied)
return
}
if v.Name != "" {
err = apmSvc.DB.Raw(`SELECT user_apply.id, user_apply.user_id,user.username,user_apply.rules,user_apply.status
FROM user_apply LEFT JOIN user ON user_apply.user_id=user.id WHERE user_apply.status=? AND (user.username like ? OR user.nickname like ?)`,
1, "%"+v.Name+"%", "%"+v.Name+"%").Order("user_apply.id desc").Offset((v.Pn - 1) * v.Ps).Limit(v.Ps).Find(&applies).Error
} else {
err = apmSvc.DB.Raw(`SELECT user_apply.id, user_apply.user_id,user.username,user_apply.rules,user_apply.status
FROM user_apply LEFT JOIN user ON user_apply.user_id=user.id WHERE user_apply.status=?`,
1).Order("user_apply.id desc").Offset((v.Pn - 1) * v.Ps).Limit(v.Ps).Find(&applies).Error
}
// err := apmSvc.DB.Raw(`SELECT user_apply.id, user_apply.user_id,user.username,user_apply.rules,user_apply.status
// FROM user_apply LEFT JOIN user ON user_apply.user_id=user.id WHERE user_apply.status=?`, 1).Scan(&applies).Error
if err == gorm.ErrRecordNotFound {
c.JSONMap(map[string]interface{}{
"message": "当前没有任何申请",
}, nil)
return
}
if v.Name != "" {
err = apmSvc.DB.Model(&user.Apply{}).Joins("LEFT JOIN user ON user_apply.user_id=user.id").Where(`user_apply.status=?
AND (user.username like ? OR user.nickname like ?)`, 1, "%"+v.Name+"%", "%"+v.Name+"%").Count(&total).Error
} else {
err = apmSvc.DB.Model(&user.Apply{}).Joins(`LEFT JOIN user ON user_apply.user_id=user.id`).Where(`user_apply.status=?`, 1).Count(&total).Error
}
if err != nil {
log.Error("apmSvc.userApplies error(%v)", err)
c.JSON(nil, err)
return
}
data := &Paper{
Pn: v.Pn,
Ps: v.Ps,
Items: applies,
Total: total,
}
c.JSON(data, nil)
}
func userList(c *bm.Context) {
v := new(struct {
Pn int `form:"pn" default:"1" validate:"min=1"`
Ps int `form:"ps" default:"20" validate:"min=1"`
Name string `form:"name"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
var (
pts []*user.User
total int
)
s := "%" + v.Name + "%"
if v.Name != "" {
err = apmSvc.DB.Where("username LIKE ? OR nickname LIKE ?", s, s).Order("id").Offset((v.Pn - 1) * v.Ps).Limit(v.Ps).Find(&pts).Error
} else {
err = apmSvc.DB.Order("id").Offset((v.Pn - 1) * v.Ps).Limit(v.Ps).Find(&pts).Error
}
if err != nil {
log.Error("apmSvc.Users error(%v)", err)
c.JSON(nil, err)
return
}
if v.Name != "" {
err = apmSvc.DB.Where("username LIKE ? OR nickname LIKE ?", s, s).Model(&user.User{}).Count(&total).Error
} else {
err = apmSvc.DB.Model(&user.User{}).Count(&total).Error
}
if err != nil {
log.Error("apmSvc.Users count error(%v)", err)
c.JSON(nil, err)
return
}
data := &Paper{
Pn: v.Pn,
Ps: v.Ps,
Items: pts,
Total: total,
}
c.JSON(data, nil)
}
func userInfo(c *bm.Context) {
v := new(struct {
ID int64 `form:"id" validate:"required"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
usr := &user.User{}
if err = apmSvc.DB.First(usr, v.ID).Error; err != nil {
log.Error("apmSvc.userInfo error(%v)", err)
c.JSON(nil, err)
return
}
c.JSON(usr, nil)
}
func userEdit(c *bm.Context) {
v := new(struct {
ID int64 `form:"id" validate:"required"`
Nickname string `form:"nickname"`
Email string `form:"email"`
Phone string `form:"phone"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
usr := &user.User{}
if err = apmSvc.DB.First(usr, v.ID).Error; err != nil {
c.JSON(nil, err)
return
}
if err = apmSvc.DB.Model(&user.User{}).Where("id = ?", v.ID).Omit("id").UpdateColumns(v).Error; err != nil {
log.Error("apmSvc.userEdit error(%v)", err)
c.JSON(nil, err)
return
}
sqlLog := &map[string]interface{}{
"SQLType": "update",
"Where": "id = ?",
"Value1": v.ID,
"Update": v,
"Old": usr,
}
username := name(c)
apmSvc.SendLog(*c, username, 0, 2, int64(v.ID), "apmSvc.userEdit", sqlLog)
c.JSON(nil, err)
}
func userModules(c *bm.Context) {
v := new(struct {
ID int64 `form:"id" validate:"required"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
usr := &user.User{}
if err = apmSvc.DB.First(usr, v.ID).Error; err != nil {
log.Error("apmSvc.userInfo error(%v)", err)
c.JSON(nil, err)
return
}
var mdls []*user.Module
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&mdls).Error; err != nil {
log.Error("apmSvc.userAuth modules error(%v)", err)
c.JSON(nil, err)
return
}
var ms []string
for _, m := range mdls {
ms = append(ms, m.Module)
}
allMds := make(map[string]string)
for module := range user.Modules {
allMds[module] = user.Modules[module].Des
}
data := map[string]interface{}{
"owns": ms,
"modules": allMds,
}
c.JSON(data, nil)
}
func userRules(c *bm.Context) {
v := new(struct {
ID int64 `form:"id" validate:"required"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
usr := &user.User{}
if err = apmSvc.DB.First(usr, v.ID).Error; err != nil {
log.Error("apmSvc.userInfo error(%v)", err)
c.JSON(nil, err)
return
}
var (
mdls []*user.Module
rls []*user.Rule
)
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&mdls).Error; err != nil {
log.Error("apmSvc.userAuth modules error(%v)", err)
c.JSON(nil, err)
return
}
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&rls).Error; err != nil {
log.Error("apmSvc.userAuth rules error(%v)", err)
c.JSON(nil, err)
return
}
var rs []string
for _, r := range rls {
rs = append(rs, r.Rule)
}
allRls := map[string]string{}
for _, mdl := range mdls {
for rl, rlM := range user.Rules {
if strings.HasPrefix(rl+"_", mdl.Module) {
allRls[rl] = rlM.Des
}
}
}
data := map[string]interface{}{
"owns": rs,
"rules": allRls,
}
c.JSON(data, nil)
}
func userModulesEdit(c *bm.Context) {
v := new(struct {
ID int64 `form:"id" validate:"required"`
Modules []string `form:"modules,split"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
usr := &user.User{}
if err = apmSvc.DB.First(usr, v.ID).Error; err != nil {
c.JSON(nil, err)
return
}
var mdls []*user.Module
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&mdls).Error; err != nil {
log.Error("apmSvc.moduleEdit modules error(%v)", err)
c.JSON(nil, err)
return
}
var (
ns []*user.Module
ds []string
)
for _, m := range v.Modules {
if len(mdls) == 0 {
ns = append(ns, &user.Module{UserID: usr.ID, Module: m})
continue
}
for j, mdl := range mdls {
if m == mdl.Module {
break
}
if j+1 == len(mdls) {
ns = append(ns, &user.Module{UserID: usr.ID, Module: m})
}
}
}
for _, mdl := range mdls {
if len(v.Modules) == 0 {
ds = append(ds, mdl.Module)
continue
}
for j, m := range v.Modules {
if m == mdl.Module {
break
}
if j+1 == len(v.Modules) {
ds = append(ds, mdl.Module)
}
}
}
if err = apmSvc.DB.Exec("DELETE FROM user_module WHERE user_id=? AND module IN (?)", usr.ID, ds).Error; err != nil {
log.Error("apmSvc.moduleEdit delModule error(%v)", err)
c.JSON(nil, err)
return
}
var sqlLogs []*map[string]interface{}
sqlLog := &map[string]interface{}{
"SQLType": "delete",
"Where": "DELETE FROM user_module WHERE user_id=? AND module IN (?)",
"Value1": usr.ID,
"Value2": ds,
"Update": "",
"Old": "",
}
sqlLogs = append(sqlLogs, sqlLog)
username := name(c)
// apmSvc.SendLog(c, username, 0, 2, int64(v.ID), "apmSvc.moduleEdit", sqlLog)
for _, d := range ds {
if err = apmSvc.DB.Exec("DELETE FROM user_rule WHERE user_id=? AND rule LIKE ?", usr.ID, d+"_%").Error; err != nil {
log.Error("apmSvc.moduleEdit delModule error(%v)", err)
c.JSON(nil, err)
apmSvc.SendLog(*c, username, 0, 2, 0, "apmSvc.moduleEdit", sqlLogs)
return
}
sqlLog := &map[string]interface{}{
"SQLType": "delete",
"Where": "DELETE FROM user_rule WHERE user_id=? AND rule LIKE ?",
"Value1": usr.ID,
"Value2": d + "_%",
"Update": "",
"Old": "",
}
sqlLogs = append(sqlLogs, sqlLog)
}
for _, n := range ns {
if err = apmSvc.DB.Create(n).Error; err != nil {
log.Error("apmSvc.moduleEdit addModule error(%v)", err)
c.JSON(nil, err)
apmSvc.SendLog(*c, username, 0, 2, 0, "apmSvc.moduleEdit", sqlLogs)
return
}
sqlLog := &map[string]interface{}{
"SQLType": "add",
"Content": n,
}
sqlLogs = append(sqlLogs, sqlLog)
}
apmSvc.SendLog(*c, username, 0, 2, 0, "apmSvc.moduleEdit", sqlLogs)
c.JSON(nil, err)
}
func userRulesEdit(c *bm.Context) {
v := new(struct {
ID int64 `form:"id" validate:"required"`
Rules []string `form:"rules,split"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
usr := &user.User{}
if err = apmSvc.DB.First(usr, v.ID).Error; err != nil {
c.JSON(nil, err)
return
}
var mdls []*user.Module
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&mdls).Error; err != nil {
log.Error("apmSvc.moduleEdit modules error(%v)", err)
c.JSON(nil, err)
return
}
if len(mdls) == 0 {
log.Error("apmSvc.moduleEdit have not module error(%v)", err)
c.JSON(nil, ecode.RequestErr)
return
}
for _, rl := range v.Rules {
var has bool
for _, mdl := range mdls {
if has = strings.HasPrefix(rl, mdl.Module); has {
break
}
}
if !has {
log.Error("apmSvc.moduleEdit have not module error(%v)", err)
c.JSON(nil, ecode.RequestErr)
return
}
}
var rls []*user.Rule
if err = apmSvc.DB.Where("user_id=?", usr.ID).Find(&rls).Error; err != nil {
log.Error("apmSvc.ruleEdit modules error(%v)", err)
c.JSON(nil, err)
return
}
var (
ns []*user.Rule
ds []string
)
for _, m := range v.Rules {
if len(rls) == 0 {
ns = append(ns, &user.Rule{UserID: usr.ID, Rule: m})
continue
}
for j, rl := range rls {
if m == rl.Rule {
break
}
if j+1 == len(rls) {
ns = append(ns, &user.Rule{UserID: usr.ID, Rule: m})
}
}
}
for _, rl := range rls {
if len(v.Rules) == 0 {
ds = append(ds, rl.Rule)
continue
}
for j, m := range v.Rules {
if m == rl.Rule {
break
}
if j+1 == len(v.Rules) {
ds = append(ds, rl.Rule)
}
}
}
var sqlLogs []*map[string]interface{}
if err = apmSvc.DB.Exec("DELETE FROM user_rule WHERE user_id=? AND rule IN (?)", usr.ID, ds).Error; err != nil {
log.Error("apmSvc.ruleEdit delModule error(%v)", err)
c.JSON(nil, err)
return
}
sqlLog := &map[string]interface{}{
"SQLType": "delete",
"Where": "DELETE FROM user_rule WHERE user_id=? AND rule IN (?)",
"Value1": usr.ID,
"Value2": ds,
"Update": "",
"Old": "",
}
username := name(c)
sqlLogs = append(sqlLogs, sqlLog)
for _, n := range ns {
if err = apmSvc.DB.Create(n).Error; err != nil {
log.Error("apmSvc.ruleEdit addModule error(%v)", err)
c.JSON(nil, err)
apmSvc.SendLog(*c, username, 0, 2, 0, "apmSvc.ruleEdit", sqlLogs)
return
}
sqlLog := &map[string]interface{}{
"SQLType": "add",
"Content": n,
}
sqlLogs = append(sqlLogs, sqlLog)
}
apmSvc.SendLog(*c, username, 0, 2, 0, "apmSvc.ruleEdit", sqlLogs)
c.JSON(nil, err)
}
func userSyncTree(c *bm.Context) {
username := name(c)
apmSvc.TreeSync(c, username, c.Request.Header.Get("Cookie"))
c.JSON(nil, nil)
}
func userTreeAppids(c *bm.Context) {
username := name(c)
appids, err := apmSvc.Appids(c, username, c.Request.Header.Get("Cookie"))
if err != nil {
log.Error("%v", err)
c.JSON(nil, err)
return
}
c.JSON(appids, nil)
}
func userTreeDiscovery(c *bm.Context) {
username := name(c)
appids, err := apmSvc.DiscoveryID(c, username, c.Request.Header.Get("Cookie"))
if err != nil {
log.Error("%v", err)
c.JSON(nil, err)
return
}
c.JSON(appids, nil)
}