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)
|
|||
|
}
|