associate tags to network level

This commit is contained in:
abhishek9686 2024-09-22 12:22:24 +04:00
parent db224ba2d9
commit c64dc852ae
3 changed files with 46 additions and 22 deletions

View file

@ -3,6 +3,7 @@ package controller
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"net/url"
"strings"
@ -63,6 +64,25 @@ func createTag(w http.ResponseWriter, r *http.Request) {
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
return
}
// check if tag network exists
_, err = logic.GetNetwork(req.Network.String())
if err != nil {
logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to get network details for "+req.Network.String()), "badrequest"))
return
}
// check if tag exists
tag := models.Tag{
ID: models.TagID(fmt.Sprintf("%s.%s", req.Network, req.TagName)),
TagName: req.TagName,
Network: req.Network,
CreatedBy: user.UserName,
CreatedAt: time.Now(),
}
err = logic.InsertTag(tag)
if err != nil {
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
return
}
go func() {
for _, hostID := range req.TaggedHosts {
h, err := logic.GetHost(hostID)
@ -72,21 +92,11 @@ func createTag(w http.ResponseWriter, r *http.Request) {
if h.Tags == nil {
h.Tags = make(map[models.TagID]struct{})
}
h.Tags[req.ID] = struct{}{}
h.Tags[tag.ID] = struct{}{}
logic.UpsertHost(h)
}
}()
tag := models.Tag{
ID: req.ID,
CreatedBy: user.UserName,
CreatedAt: time.Now(),
}
err = logic.InsertTag(tag)
if err != nil {
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
return
}
logic.ReturnSuccessResponseWithJson(w, r, req, "created tag successfully")
}
@ -105,21 +115,25 @@ func updateTag(w http.ResponseWriter, r *http.Request) {
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
return
}
tag, err := logic.GetTag(updateTag.ID)
if err != nil {
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
return
}
updateTag.NewID = models.TagID(strings.TrimSpace(updateTag.NewID.String()))
if updateTag.NewID.String() != "" {
tag.ID = updateTag.NewID
updateTag.NewName = strings.TrimSpace(updateTag.NewName)
var newID models.TagID
if updateTag.NewName != "" {
newID = models.TagID(fmt.Sprintf("%s.%s", tag.Network, updateTag.NewName))
tag.ID = newID
tag.TagName = updateTag.NewName
err = logic.InsertTag(tag)
if err != nil {
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
return
}
}
go logic.UpdateTag(updateTag)
go logic.UpdateTag(updateTag, newID)
logic.ReturnSuccessResponse(w, r, "updating tags")
}

View file

@ -97,7 +97,7 @@ func ListTags() ([]models.Tag, error) {
}
// UpdateTag - updates and syncs hosts with tag update
func UpdateTag(req models.UpdateTagReq) {
func UpdateTag(req models.UpdateTagReq, newID models.TagID) {
tagMutex.Lock()
defer tagMutex.Unlock()
tagHostsMap := GetHostsWithTag(req.ID)
@ -122,12 +122,12 @@ func UpdateTag(req models.UpdateTagReq) {
UpsertHost(&deletedTaggedHost)
}
go func(req models.UpdateTagReq) {
if req.NewID != "" {
if newID != "" {
tagHostsMap = GetHostsWithTag(req.ID)
for _, hostI := range tagHostsMap {
hostI := hostI
delete(hostI.Tags, req.ID)
hostI.Tags[req.NewID] = struct{}{}
hostI.Tags[newID] = struct{}{}
UpsertHost(&hostI)
}
}

View file

@ -1,6 +1,9 @@
package models
import "time"
import (
"fmt"
"time"
)
type TagID string
@ -8,15 +11,22 @@ func (id TagID) String() string {
return string(id)
}
func (t Tag) GetIDFromName() string {
return fmt.Sprintf("%s.%s", t.Network, t.TagName)
}
type Tag struct {
ID TagID `json:"id"`
TagName string `json:"tag_name"`
Network NetworkID `json:"network"`
CreatedBy string `json:"created_by"`
CreatedAt time.Time `json:"created_at"`
}
type CreateTagReq struct {
ID TagID `json:"id"`
TaggedHosts []string `json:"tagged_hosts"`
TagName string `json:"tag_name"`
Network NetworkID `json:"network"`
TaggedHosts []string `json:"tagged_hosts"`
}
type TagListResp struct {
@ -27,6 +37,6 @@ type TagListResp struct {
type UpdateTagReq struct {
Tag
NewID TagID `json:"new_id"`
NewName string `json:"new_name"`
TaggedHosts []string `json:"tagged_hosts"`
}