Prechádzať zdrojové kódy

release model for webhook

sunguroku 5 rokov pred
rodič
commit
66b1c3a0bb

+ 1 - 0
internal/forms/helper_test.go

@@ -44,6 +44,7 @@ func setupTestEnv(tester *tester, t *testing.T) {
 	err = db.AutoMigrate(
 		&models.Project{},
 		&models.Role{},
+		&models.Release{},
 		&models.User{},
 		&models.Session{},
 		&models.GitRepo{},

+ 33 - 0
internal/models/release.go

@@ -0,0 +1,33 @@
+package models
+
+import (
+	"gorm.io/gorm"
+)
+
+// Release model used to retrieve webhook tokens for a chart.
+
+// Release type that extends gorm.Model
+type Release struct {
+	gorm.Model
+
+	WebhookToken string `json:"webhook_token" gorm:"unique"`
+	ClusterID    uint   `json:"cluster_id"`
+	ProjectID    uint   `json:"project_id"`
+	Name         string `json:"name"`
+	Namespace    string `json:"namespace"`
+}
+
+// ReleaseExternal represents the Release type that is sent over REST
+type ReleaseExternal struct {
+	ID uint `json:"id"`
+
+	WebhookToken string `json:"webhook_token"`
+}
+
+// Externalize generates an external User to be shared over REST
+func (r *Release) Externalize() *ReleaseExternal {
+	return &ReleaseExternal{
+		ID:           r.ID,
+		WebhookToken: r.WebhookToken,
+	}
+}

+ 1 - 0
internal/repository/gorm/helpers_test.go

@@ -51,6 +51,7 @@ func setupTestEnv(tester *tester, t *testing.T) {
 		&models.Session{},
 		&models.GitRepo{},
 		&models.Registry{},
+		&models.Release{},
 		&models.HelmRepo{},
 		&models.Cluster{},
 		&models.ClusterCandidate{},

+ 61 - 0
internal/repository/gorm/release.go

@@ -0,0 +1,61 @@
+package gorm
+
+import (
+	"github.com/porter-dev/porter/internal/models"
+	"github.com/porter-dev/porter/internal/repository"
+	"gorm.io/gorm"
+)
+
+// ReleaseRepository uses gorm.DB for querying the database
+type ReleaseRepository struct {
+	db *gorm.DB
+}
+
+// NewReleaseRepository returns a DefaultReleaseRepository which uses
+// gorm.DB for querying the database
+func NewReleaseRepository(db *gorm.DB) repository.ReleaseRepository {
+	return &ReleaseRepository{db}
+}
+
+// CreateRelease adds a new Release row to the Releases table in the database
+func (repo *ReleaseRepository) CreateRelease(release *models.Release) (*models.Release, error) {
+	if err := repo.db.Create(release).Error; err != nil {
+		return nil, err
+	}
+	return release, nil
+}
+
+// ReadRelease finds a single release based on their unique name and namespace pair.
+func (repo *ReleaseRepository) ReadRelease(name string, namespace string) (*models.Release, error) {
+	release := &models.Release{}
+	if err := repo.db.Where("name = ?", name).Where("namespace = ?", namespace).First(&release).Error; err != nil {
+		return nil, err
+	}
+	return release, nil
+}
+
+// ReadReleaseByWebhookToken finds a single release based on their unique webhook token.
+func (repo *ReleaseRepository) ReadReleaseByWebhookToken(token string) (*models.Release, error) {
+	release := &models.Release{}
+	if err := repo.db.Where("webhook_token = ?", token).First(&release).Error; err != nil {
+		return nil, err
+	}
+	return release, nil
+}
+
+// UpdateRelease modifies an existing Release in the database
+func (repo *ReleaseRepository) UpdateRelease(release *models.Release) (*models.Release, error) {
+	if err := repo.db.Save(release).Error; err != nil {
+		return nil, err
+	}
+
+	return release, nil
+}
+
+// DeleteRelease deletes a single user using their unique name and namespace pair
+func (repo *ReleaseRepository) DeleteRelease(release *models.Release) (*models.Release, error) {
+	if err := repo.db.Delete(&release).Error; err != nil {
+		return nil, err
+	}
+	return release, nil
+}

+ 45 - 0
internal/repository/gorm/release_test.go

@@ -0,0 +1,45 @@
+package gorm_test
+
+import (
+	"testing"
+
+	"github.com/porter-dev/porter/internal/models"
+)
+
+func TestCreateRelease(t *testing.T) {
+	tester := &tester{
+		dbFileName: "./porter_create_release.db",
+	}
+
+	setupTestEnv(tester, t)
+	defer cleanup(tester, t)
+
+	release := &models.Release{
+		Name:         "denver-meister-dakota",
+		Namespace:    "default",
+		ProjectID:    1,
+		ClusterID:    1,
+		WebhookToken: "abcdefgh",
+	}
+
+	release, err := tester.repo.Release.CreateRelease(release)
+
+	if err != nil {
+		t.Fatalf("%v\n", err)
+	}
+
+	// release, err = tester.repo.Release.ReadRelease(release.Name, release.Namespace)
+
+	// if err != nil {
+	// 	t.Fatalf("%v\n", err)
+	// }
+
+	// make sure id is 1 and name is "project-test"
+	// if release.Model.ID != 1 {
+	// 	t.Errorf("incorrect release ID: expected %d, got %d\n", 1, release.Model.ID)
+	// }
+
+	// if release.Name != "denver-meister-dakota" {
+	// 	t.Errorf("incorrect project name: expected %s, got %s\n", "project-test", release.Name)
+	// }
+}

+ 17 - 0
internal/repository/release.go

@@ -0,0 +1,17 @@
+package repository
+
+import (
+	"github.com/porter-dev/porter/internal/models"
+)
+
+// WriteRelease is the function type for all Release write operations
+type WriteRelease func(release *models.Release) (*models.Release, error)
+
+// ReleaseRepository represents the set of queries on the Release model
+type ReleaseRepository interface {
+	CreateRelease(release *models.Release) (*models.Release, error)
+	ReadRelease(name string, namespace string) (*models.Release, error)
+	ReadReleaseByWebhookToken(token string) (*models.Release, error)
+	UpdateRelease(release *models.Release) (*models.Release, error)
+	DeleteRelease(release *models.Release) (*models.Release, error)
+}

+ 1 - 0
internal/repository/repository.go

@@ -4,6 +4,7 @@ package repository
 type Repository struct {
 	User             UserRepository
 	Project          ProjectRepository
+	Release          ReleaseRepository
 	Session          SessionRepository
 	GitRepo          GitRepoRepository
 	Cluster          ClusterRepository

+ 6 - 0
server/api/deploy_handler.go

@@ -92,5 +92,11 @@ func (app *App) HandleDeployTemplate(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
+	// write webhook token to db
+	// form.ReleaseForm.Form.Cluster.ID
+	// form.ReleaseForm.Form.Cluster.ProjectID
+	// form.ReleaseForm.Form.Namespace
+	// form.ChartTemplateForm.Name
+
 	w.WriteHeader(http.StatusOK)
 }

+ 0 - 2
server/api/release_handler.go

@@ -2,7 +2,6 @@ package api
 
 import (
 	"encoding/json"
-	"fmt"
 	"net/http"
 	"net/url"
 	"strconv"
@@ -475,7 +474,6 @@ func (app *App) HandleReleaseDeployHook(w http.ResponseWriter, r *http.Request)
 	)
 
 	if err := json.NewDecoder(r.Body).Decode(form); err != nil {
-		fmt.Println("ERROR HERE", r.Body)
 		app.handleErrorFormDecoding(err, ErrUserDecode, w)
 		return
 	}