Browse Source

Implemented tag repository

jnfrati 4 years ago
parent
commit
766da95160

+ 2 - 2
internal/models/tag.go

@@ -10,8 +10,8 @@ import (
 type Tag struct {
 type Tag struct {
 	gorm.Model
 	gorm.Model
 
 
-	ProjectID uint       `json:"project_id" gorm:"primaryKey;autoIncrement:false"`
-	Name      string     `json:"name" gorm:"primaryKey"`
+	ProjectID uint       `json:"project_id"`
+	Name      string     `json:"name"`
 	Color     string     `json:"color"`
 	Color     string     `json:"color"`
 	Releases  []*Release `json:"releases" gorm:"many2many:release_tags"`
 	Releases  []*Release `json:"releases" gorm:"many2many:release_tags"`
 }
 }

+ 6 - 0
internal/repository/gorm/repository.go

@@ -41,6 +41,7 @@ type GormRepository struct {
 	ceToken                   repository.CredentialsExchangeTokenRepository
 	ceToken                   repository.CredentialsExchangeTokenRepository
 	buildConfig               repository.BuildConfigRepository
 	buildConfig               repository.BuildConfigRepository
 	allowlist                 repository.AllowlistRepository
 	allowlist                 repository.AllowlistRepository
+	tag                       repository.TagRepository
 }
 }
 
 
 func (t *GormRepository) User() repository.UserRepository {
 func (t *GormRepository) User() repository.UserRepository {
@@ -179,6 +180,10 @@ func (t *GormRepository) Allowlist() repository.AllowlistRepository {
 	return t.allowlist
 	return t.allowlist
 }
 }
 
 
+func (t *GormRepository) Tag() repository.TagRepository {
+	return t.tag
+}
+
 // NewRepository returns a Repository which persists users in memory
 // NewRepository returns a Repository which persists users in memory
 // and accepts a parameter that can trigger read/write errors
 // and accepts a parameter that can trigger read/write errors
 func NewRepository(db *gorm.DB, key *[32]byte, storageBackend credentials.CredentialStorage) repository.Repository {
 func NewRepository(db *gorm.DB, key *[32]byte, storageBackend credentials.CredentialStorage) repository.Repository {
@@ -217,5 +222,6 @@ func NewRepository(db *gorm.DB, key *[32]byte, storageBackend credentials.Creden
 		ceToken:                   NewCredentialsExchangeTokenRepository(db),
 		ceToken:                   NewCredentialsExchangeTokenRepository(db),
 		buildConfig:               NewBuildConfigRepository(db),
 		buildConfig:               NewBuildConfigRepository(db),
 		allowlist:                 NewAllowlistRepository(db),
 		allowlist:                 NewAllowlistRepository(db),
+		tag:                       NewTagRepository(db),
 	}
 	}
 }
 }

+ 79 - 0
internal/repository/gorm/tag.go

@@ -0,0 +1,79 @@
+package gorm
+
+import (
+	"fmt"
+
+	"github.com/porter-dev/porter/internal/models"
+	"github.com/porter-dev/porter/internal/repository"
+	"gorm.io/gorm"
+)
+
+// AllowlistRepository uses gorm.DB for querying the database
+type TagRepository struct {
+	db *gorm.DB
+}
+
+// NewAllowlistRepository returns a AllowListRepository which uses
+// gorm.DB for querying the database.
+func NewTagRepository(db *gorm.DB) repository.TagRepository {
+	return &TagRepository{db}
+}
+
+func (repo *TagRepository) CreateTag(tag *models.Tag) (*models.Tag, error) {
+	existingTag, _ := repo.ReadTagByNameAndProjectId(tag.Name, tag.ProjectID)
+
+	if existingTag != nil {
+		return nil, fmt.Errorf("tag already exists")
+	}
+
+	if err := repo.db.Create(tag).Error; err != nil {
+		return nil, err
+	}
+	return tag, nil
+}
+
+func (repo *TagRepository) ReadTagByNameAndProjectId(tagName string, projectId uint) (*models.Tag, error) {
+	tag := &models.Tag{}
+
+	err := repo.db.Where("name = ? AND project_id = ?", tagName, projectId).First(tag).Error
+
+	if err != nil {
+		return nil, err
+	}
+
+	return tag, nil
+}
+
+func (repo *TagRepository) ListTagsByProjectId(projectId uint) ([]*models.Tag, error) {
+	tags := make([]*models.Tag, 0)
+
+	err := repo.db.Model(&models.Tag{}).Where("project_id = ?", projectId).Find(&tags).Error
+
+	if err != nil {
+		return nil, err
+	}
+
+	return tags, nil
+}
+
+func (repo *TagRepository) UpdateTag(tag *models.Tag) (*models.Tag, error) {
+	existingTag, _ := repo.ReadTagByNameAndProjectId(tag.Name, tag.ProjectID)
+
+	if existingTag != nil {
+		return nil, fmt.Errorf("tag already exists")
+	}
+
+	if err := repo.db.Save(tag).Error; err != nil {
+		return nil, err
+	}
+
+	return tag, nil
+}
+
+func (repo *TagRepository) DeleteTag(id uint) error {
+	if err := repo.db.Delete(&models.Tag{}, id).Error; err != nil {
+		return err
+	}
+
+	return nil
+}

+ 1 - 0
internal/repository/repository.go

@@ -35,4 +35,5 @@ type Repository interface {
 	CredentialsExchangeToken() CredentialsExchangeTokenRepository
 	CredentialsExchangeToken() CredentialsExchangeTokenRepository
 	BuildConfig() BuildConfigRepository
 	BuildConfig() BuildConfigRepository
 	Allowlist() AllowlistRepository
 	Allowlist() AllowlistRepository
+	Tag() TagRepository
 }
 }

+ 13 - 0
internal/repository/tag.go

@@ -0,0 +1,13 @@
+package repository
+
+import "github.com/porter-dev/porter/internal/models"
+
+// GitRepoRepository represents the set of queries on the
+// GitRepo model
+type TagRepository interface {
+	CreateTag(tag *models.Tag) (*models.Tag, error)
+	ReadTagByNameAndProjectId(tagName string, projectID uint) (*models.Tag, error)
+	ListTagsByProjectId(projectId uint) ([]*models.Tag, error)
+	UpdateTag(tag *models.Tag) (*models.Tag, error)
+	DeleteTag(id uint) error
+}