ソースを参照

fix update tag handler

abhishek9686 11 ヶ月 前
コミット
99220fddd3
3 ファイル変更47 行追加10 行削除
  1. 33 3
      controllers/tags.go
  2. 8 6
      logic/tags.go
  3. 6 1
      models/tags.go

+ 33 - 3
controllers/tags.go

@@ -3,6 +3,7 @@ package controller
 import (
 	"encoding/json"
 	"net/http"
+	"time"
 
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/logger"
@@ -44,20 +45,44 @@ func getAllTags(w http.ResponseWriter, r *http.Request) {
 // @Success     200 {array} models.SuccessResponse
 // @Failure     500 {object} models.ErrorResponse
 func createTag(w http.ResponseWriter, r *http.Request) {
-	var tag models.Tag
-	err := json.NewDecoder(r.Body).Decode(&tag)
+	var req models.CreateTagReq
+	err := json.NewDecoder(r.Body).Decode(&req)
 	if err != nil {
 		logger.Log(0, "error decoding request body: ",
 			err.Error())
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 		return
 	}
+	user, err := logic.GetUser(r.Header.Get("user"))
+	if err != nil {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
+		return
+	}
+	go func() {
+		for _, hostID := range req.TaggedHosts {
+			h, err := logic.GetHost(hostID)
+			if err != nil {
+				continue
+			}
+			if h.Tags == nil {
+				h.Tags = make(map[models.TagID]struct{})
+			}
+			h.Tags[req.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, tag, "created tag successfully")
+	logic.ReturnSuccessResponseWithJson(w, r, req, "created tag successfully")
 }
 
 // @Summary     Update Tag
@@ -75,6 +100,11 @@ func updateTag(w http.ResponseWriter, r *http.Request) {
 		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
 		return
 	}
+	_, err = logic.GetTag(updateTag.ID)
+	if err != nil {
+		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
+		return
+	}
 	go logic.UpdateTag(updateTag)
 	logic.ReturnSuccessResponse(w, r, "updating tags")
 }

+ 8 - 6
logic/tags.go

@@ -9,8 +9,8 @@ import (
 	"github.com/gravitl/netmaker/models"
 )
 
-func GetTag(tagID string) (models.Tag, error) {
-	data, err := database.FetchRecord(database.TAG_TABLE_NAME, tagID)
+func GetTag(tagID models.TagID) (models.Tag, error) {
+	data, err := database.FetchRecord(database.TAG_TABLE_NAME, tagID.String())
 	if err != nil && !database.IsEmptyRecord(err) {
 		return models.Tag{}, err
 	}
@@ -76,15 +76,17 @@ func ListTags() ([]models.Tag, error) {
 
 func UpdateTag(req models.UpdateTagReq) {
 	tagHostsMap := GetHostsWithTag(req.ID)
-	for _, hostI := range req.TaggedHosts {
-		hostI := hostI
-
+	for _, hostID := range req.TaggedHosts {
+		hostI, err := GetHost(hostID)
+		if err != nil {
+			continue
+		}
 		if _, ok := tagHostsMap[hostI.ID.String()]; !ok {
 			if hostI.Tags == nil {
 				hostI.Tags = make(map[models.TagID]struct{})
 			}
 			hostI.Tags[req.ID] = struct{}{}
-			UpsertHost(&hostI)
+			UpsertHost(hostI)
 		} else {
 			delete(tagHostsMap, hostI.ID.String())
 		}

+ 6 - 1
models/tags.go

@@ -14,6 +14,11 @@ type Tag struct {
 	CreatedAt time.Time `json:"created_at"`
 }
 
+type CreateTagReq struct {
+	ID          TagID    `json:"id"`
+	TaggedHosts []string `json:"tagged_hosts"`
+}
+
 type TagListResp struct {
 	Tag
 	UsedByCnt   int    `json:"used_by_count"`
@@ -22,5 +27,5 @@ type TagListResp struct {
 
 type UpdateTagReq struct {
 	Tag
-	TaggedHosts []Host `json:"tagged_hosts"`
+	TaggedHosts []string `json:"tagged_hosts"`
 }