Ver código fonte

Implemented tag removing when not present in array

jnfrati 4 anos atrás
pai
commit
2e3b402340

+ 0 - 2
api/server/handlers/release/create.go

@@ -423,8 +423,6 @@ func LinkTagsToRelease(config *config.Config, tags []string, release *models.Rel
 		}
 	}
 
-	fmt.Println("LINK TAGS TO RELEASE ERROR", err)
-
 	if err != nil {
 		return nil, err
 	}

+ 0 - 5
api/server/handlers/release/get.go

@@ -49,11 +49,6 @@ func (c *ReleaseGetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		res.ID = release.ID
 		res.WebhookToken = release.WebhookToken
 
-		for i := 0; i < len(release.Tags); i++ {
-			tag := release.Tags[i]
-			res.PorterRelease.Tags = append(res.PorterRelease.Tags, tag.Name)
-		}
-
 		if release.GitActionConfig != nil {
 			res.GitActionConfig = release.GitActionConfig.ToGitActionConfigType()
 		}

+ 26 - 8
api/server/handlers/release/update_tags.go

@@ -1,7 +1,6 @@
 package release
 
 import (
-	"fmt"
 	"net/http"
 
 	"github.com/porter-dev/porter/api/server/authz"
@@ -34,16 +33,13 @@ func (c *UpdateReleaseTagsHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 	name, _ := requestutils.GetURLParamString(r, types.URLParamReleaseName)
 	namespace, _ := requestutils.GetURLParamString(r, types.URLParamNamespace)
 	cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
-	fmt.Println("FIRST CHECKPOINT")
+
 	request := &types.PatchUpdateReleaseTags{}
 
 	if ok := c.DecodeAndValidate(w, r, request); !ok {
 		return
 	}
-	fmt.Println("SECOND CHECKPOINT")
-	fmt.Println(cluster.ID)
-	fmt.Println(name)
-	fmt.Println(namespace)
+
 	release, err := c.Config().Repo.Release().ReadRelease(cluster.ID, name, namespace)
 
 	if err != nil {
@@ -51,14 +47,36 @@ func (c *UpdateReleaseTagsHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
 		return
 	}
 
-	fmt.Println("THIRD CHECKPOINT")
+	tagsToDelete := difference(release.ToReleaseType().Tags, request.Tags)
+
+	err = c.Config().Repo.Tag().UnlinkTagsFromRelease(tagsToDelete, release)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
 	release, err = LinkTagsToRelease(c.Config(), request.Tags, release)
 
 	if err != nil {
 		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
 		return
 	}
-	fmt.Println("FOURTH CHECKPOINT")
+
 	w.WriteHeader(http.StatusCreated)
 	c.WriteResult(w, r, release)
 }
+
+func difference(a, b []string) []string {
+	mb := make(map[string]struct{}, len(b))
+	for _, x := range b {
+		mb[x] = struct{}{}
+	}
+	var diff []string
+	for _, x := range a {
+		if _, found := mb[x]; !found {
+			diff = append(diff, x)
+		}
+	}
+	return diff
+}

+ 8 - 0
internal/models/release.go

@@ -39,5 +39,13 @@ func (r *Release) ToReleaseType() *types.PorterRelease {
 		res.GitActionConfig = r.GitActionConfig.ToGitActionConfigType()
 	}
 
+	tagsCount := len(r.Tags)
+
+	if tagsCount > 0 {
+		for i := 0; i < tagsCount; i++ {
+			res.Tags = append(res.Tags, r.Tags[i].Name)
+		}
+	}
+
 	return res
 }

+ 20 - 3
internal/repository/gorm/tag.go

@@ -64,8 +64,6 @@ func (repo *TagRepository) CreateOrLinkTag(tagName string, release *models.Relea
 		Color:     strings.Join([]string{"#", randomColor}, ""),
 	}
 
-	newTag, err = repo.CreateTag(newTag)
-
 	if err != nil {
 		return err
 	}
@@ -73,6 +71,26 @@ func (repo *TagRepository) CreateOrLinkTag(tagName string, release *models.Relea
 	return repo.AddTagToRelease(release, newTag)
 }
 
+func (repo *TagRepository) UnlinkTagsFromRelease(tags []string, release *models.Release) error {
+	fmt.Println(tags)
+	populatedTags := make([]*models.Tag, 0)
+	err := repo.db.Model(&models.Tag{}).Where("name IN ?", tags).Where("project_id = ?", release.ProjectID).Find(&populatedTags).Error
+
+	fmt.Println(populatedTags)
+
+	if err != nil {
+		return err
+	}
+
+	err = repo.db.Model(&release).Association("Tags").Delete(populatedTags)
+
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func (repo *TagRepository) ReadTagByNameAndProjectId(tagName string, projectId uint) (*models.Tag, error) {
 	tag := &models.Tag{}
 
@@ -123,7 +141,6 @@ func (repo *TagRepository) DeleteTag(id uint) error {
 
 func (repo *TagRepository) AddTagToRelease(release *models.Release, tag *models.Tag) error {
 	err := repo.db.Model(&release).Association("Tags").Append(tag)
-	_ = repo.db.Model(&tag).Association("Releases").Append(release)
 
 	if err != nil {
 		return err

+ 1 - 0
internal/repository/tag.go

@@ -13,4 +13,5 @@ type TagRepository interface {
 	DeleteTag(id uint) error
 	AddTagToRelease(release *models.Release, tag *models.Tag) error
 	RemoveTagFromRelease(release *models.Release, tag *models.Tag) error
+	UnlinkTagsFromRelease(tags []string, release *models.Release) error
 }