191 lines
4.3 KiB
Go
191 lines
4.3 KiB
Go
package http
|
||
|
||
import (
|
||
"net/http"
|
||
"strings"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/toolkits/pkg/str"
|
||
|
||
"github.com/didi/nightingale/v5/models"
|
||
)
|
||
|
||
func classpathGetsResources(c *gin.Context) {
|
||
limit := queryInt(c, "limit", defaultLimit)
|
||
prefix := queryInt(c, "prefix", 0)
|
||
query := queryStr(c, "query", "")
|
||
|
||
cp := Classpath(urlParamInt64(c, "id"))
|
||
var classpathIds []int64
|
||
if prefix == 1 {
|
||
cps, err := models.ClasspathGetsByPrefix(cp.Path)
|
||
dangerous(err)
|
||
for i := range cps {
|
||
classpathIds = append(classpathIds, cps[i].Id)
|
||
}
|
||
} else {
|
||
classpathIds = append(classpathIds, cp.Id)
|
||
}
|
||
|
||
total, err := models.ResourceTotalByClasspathId(classpathIds, query)
|
||
dangerous(err)
|
||
|
||
reses, err := models.ResourceGetsByClasspathId(classpathIds, query, limit, offset(c, limit))
|
||
dangerous(err)
|
||
|
||
renderData(c, gin.H{
|
||
"classpath": cp,
|
||
"list": reses,
|
||
"total": total,
|
||
}, nil)
|
||
}
|
||
|
||
func resourcesQuery(c *gin.Context) {
|
||
limit := queryInt(c, "limit", defaultLimit)
|
||
qres := queryStr(c, "qres", "")
|
||
|
||
// qpaths 可以选择多个,英文逗号分隔的多个id
|
||
qpaths := str.IdsInt64(queryStr(c, "qpaths", ""))
|
||
|
||
total, err := models.ResourceTotalByClasspathQuery(qpaths, qres)
|
||
dangerous(err)
|
||
|
||
reses, err := models.ResourceGetsByClasspathQuery(qpaths, qres, limit, offset(c, limit))
|
||
dangerous(err)
|
||
|
||
if len(reses) == 0 {
|
||
renderZeroPage(c)
|
||
return
|
||
}
|
||
|
||
renderData(c, gin.H{
|
||
"list": reses,
|
||
"total": total,
|
||
}, nil)
|
||
}
|
||
|
||
func resourceGet(c *gin.Context) {
|
||
renderData(c, Resource(urlParamInt64(c, "id")), nil)
|
||
}
|
||
|
||
func resourceDel(c *gin.Context) {
|
||
loginUser(c).MustPerm("resource_modify")
|
||
renderData(c, Resource(urlParamInt64(c, "id")).Del(), nil)
|
||
}
|
||
|
||
type resourceNoteForm struct {
|
||
Ids []int64 `json:"ids"`
|
||
Note string `json:"note"`
|
||
}
|
||
|
||
// 修改主机设备的备注
|
||
func resourceNotePut(c *gin.Context) {
|
||
var f resourceNoteForm
|
||
bind(c, &f)
|
||
|
||
if len(f.Ids) == 0 {
|
||
bomb(http.StatusBadRequest, "ids is empty")
|
||
}
|
||
|
||
loginUser(c).MustPerm("resource_modify")
|
||
|
||
renderMessage(c, models.ResourceUpdateNote(f.Ids, f.Note))
|
||
}
|
||
|
||
type resourceTagsForm struct {
|
||
Ids []int64 `json:"ids"`
|
||
Tags string `json:"tags"`
|
||
}
|
||
|
||
func resourceTagsPut(c *gin.Context) {
|
||
var f resourceTagsForm
|
||
bind(c, &f)
|
||
|
||
if len(f.Ids) == 0 {
|
||
bomb(http.StatusBadRequest, "ids is empty")
|
||
}
|
||
|
||
loginUser(c).MustPerm("resource_modify")
|
||
|
||
renderMessage(c, models.ResourceUpdateTags(f.Ids, f.Tags))
|
||
}
|
||
|
||
type resourceMuteForm struct {
|
||
Ids []int64 `json:"ids"`
|
||
Btime int64 `json:"btime"`
|
||
Etime int64 `json:"etime"`
|
||
}
|
||
|
||
func resourceMutePut(c *gin.Context) {
|
||
var f resourceMuteForm
|
||
bind(c, &f)
|
||
|
||
if len(f.Ids) == 0 {
|
||
bomb(http.StatusBadRequest, "ids is empty")
|
||
}
|
||
|
||
loginUser(c).MustPerm("resource_modify")
|
||
|
||
renderMessage(c, models.ResourceUpdateMute(f.Ids, f.Btime, f.Etime))
|
||
}
|
||
|
||
type resourceClasspathsForm struct {
|
||
ResIdents []string `json:"res_idents"`
|
||
ClasspathIds []int64 `json:"classpath_ids"`
|
||
}
|
||
|
||
func resourceClasspathsPut(c *gin.Context) {
|
||
var f resourceClasspathsForm
|
||
m := make(map[string]map[int64]struct{}) //store database data to compare
|
||
toAdd := make(map[string][]int64)
|
||
|
||
bind(c, &f)
|
||
loginUser(c).MustPerm("resource_modify")
|
||
|
||
sql := "res_ident in (\"" + strings.Join(f.ResIdents, ",") + "\")"
|
||
oldClasspathResources, err := models.ClasspathResourceGets(sql)
|
||
dangerous(err)
|
||
|
||
for _, obj := range oldClasspathResources {
|
||
if _, exists := m[obj.ResIdent]; !exists {
|
||
m[obj.ResIdent] = make(map[int64]struct{})
|
||
}
|
||
m[obj.ResIdent][obj.ClasspathId] = struct{}{}
|
||
}
|
||
|
||
for _, ident := range f.ResIdents {
|
||
toAdd[ident] = []int64{}
|
||
if _, exists := m[ident]; exists {
|
||
for _, classpathId := range f.ClasspathIds {
|
||
if _, exists := m[ident][classpathId]; exists {
|
||
// classpathResource 在数据库中已存在,不做处理
|
||
delete(m[ident], classpathId)
|
||
} else {
|
||
toAdd[ident] = append(toAdd[ident], classpathId)
|
||
}
|
||
}
|
||
} else {
|
||
toAdd[ident] = f.ClasspathIds
|
||
}
|
||
}
|
||
|
||
//删除数据库中多余的classpathResources
|
||
for ident := range m {
|
||
for classpathId := range m[ident] {
|
||
if classpathId == 1 {
|
||
continue
|
||
}
|
||
|
||
dangerous(models.ClasspathResourceDel(classpathId, []string{ident}))
|
||
}
|
||
}
|
||
|
||
//添加数据库没有的classpathResources
|
||
for ident, cids := range toAdd {
|
||
for _, cid := range cids {
|
||
dangerous(models.ClasspathResourceAdd(cid, ident))
|
||
}
|
||
}
|
||
renderMessage(c, nil)
|
||
}
|