Parcourir la source

refactor api package'

Alexander Belanger il y a 5 ans
Parent
commit
7fff212a77

+ 1 - 0
go.sum

@@ -1868,6 +1868,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy
 gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
 gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
 gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
+gopkg.in/go-playground/validator.v9 v9.31.0 h1:bmXmP2RSNtFES+bn4uYuHT7iJFJv7Vj+an+ZQdDaD1M=
 gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
 gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw=
 gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw=

+ 2 - 1
internal/config/config.go

@@ -26,8 +26,9 @@ type ServerConf struct {
 	TimeoutWrite   time.Duration `env:"SERVER_TIMEOUT_WRITE,default=10s"`
 	TimeoutIdle    time.Duration `env:"SERVER_TIMEOUT_IDLE,default=15s"`
 	IsLocal        bool          `env:"IS_LOCAL,default=false"`
+	IsTesting      bool          `env:"IS_TESTING,default=false"`
 
-	HelmRepoURL string `env:"HELM_REPO_URL,default=https://porter-dev.github.io/chart-repo/"`
+	DefaultHelmRepoURL string `env:"HELM_REPO_URL,default=https://porter-dev.github.io/chart-repo/"`
 
 	GithubClientID     string `env:"GITHUB_CLIENT_ID"`
 	GithubClientSecret string `env:"GITHUB_CLIENT_SECRET"`

+ 0 - 0
internal/repository/test/auth.go → internal/repository/memory/auth.go


+ 0 - 0
internal/repository/test/cluster.go → internal/repository/memory/cluster.go


+ 0 - 0
internal/repository/test/gitrepo.go → internal/repository/memory/gitrepo.go


+ 0 - 0
internal/repository/test/helm_repo.go → internal/repository/memory/helm_repo.go


+ 0 - 0
internal/repository/test/project.go → internal/repository/memory/project.go


+ 0 - 0
internal/repository/test/registry.go → internal/repository/memory/registry.go


+ 0 - 0
internal/repository/test/repository.go → internal/repository/memory/repository.go


+ 0 - 0
internal/repository/test/session.go → internal/repository/memory/session.go


+ 0 - 0
internal/repository/test/user.go → internal/repository/memory/user.go


+ 132 - 57
server/api/api.go

@@ -1,9 +1,12 @@
 package api
 
 import (
+	"fmt"
+
 	"github.com/go-playground/locales/en"
 	ut "github.com/go-playground/universal-translator"
-	"github.com/go-playground/validator/v10"
+	vr "github.com/go-playground/validator/v10"
+	sessionstore "github.com/porter-dev/porter/internal/auth"
 	"github.com/porter-dev/porter/internal/oauth"
 	"golang.org/x/oauth2"
 	"gorm.io/gorm"
@@ -13,6 +16,8 @@ import (
 	"github.com/porter-dev/porter/internal/kubernetes"
 	lr "github.com/porter-dev/porter/internal/logger"
 	"github.com/porter-dev/porter/internal/repository"
+	memory "github.com/porter-dev/porter/internal/repository/memory"
+	"github.com/porter-dev/porter/internal/validator"
 	"helm.sh/helm/v3/pkg/storage"
 
 	"github.com/porter-dev/porter/internal/config"
@@ -25,78 +30,148 @@ type TestAgents struct {
 	K8sAgent              *kubernetes.Agent
 }
 
+// AppConfig is the configuration required for creating a new App
+type AppConfig struct {
+	DB         *gorm.DB
+	Logger     *lr.Logger
+	Repository *repository.Repository
+	ServerConf config.ServerConf
+
+	// TestAgents if API is in testing mode
+	TestAgents *TestAgents
+}
+
 // App represents an API instance with handler methods attached, a DB connection
 // and a logger instance
 type App struct {
-	db           *gorm.DB
-	logger       *lr.Logger
-	repo         *repository.Repository
-	validator    *validator.Validate
-	store        sessions.Store
-	translator   *ut.Translator
-	cookieName   string
-	testing      bool
-	isLocal      bool
-	ServerConf   config.ServerConf
-	TestAgents   *TestAgents
-	GithubConfig *oauth2.Config
+	// Server configuration
+	ServerConf config.ServerConf
+
+	// Logger for logging
+	Logger *lr.Logger
+
+	// Repo implements a query repository
+	Repo *repository.Repository
+
+	// session store for cookie-based sessions
+	Store sessions.Store
+
+	// agents exposed for testing
+	TestAgents *TestAgents
+
+	// oauth-specific clients
+	GithubConf *oauth2.Config
+
+	db         *gorm.DB
+	validator  *vr.Validate
+	translator *ut.Translator
 }
 
 // New returns a new App instance
-// TODO -- this should accept an app/server config
-func New(
-	logger *lr.Logger,
-	db *gorm.DB,
-	repo *repository.Repository,
-	validator *validator.Validate,
-	store sessions.Store,
-	cookieName string,
-	testing bool,
-	isLocal bool,
-	githubConfig *oauth.Config,
-	serverConf config.ServerConf,
-) *App {
-	// for now, will just support the english translator from the
-	// validator/translations package
+func New(conf *AppConfig) (*App, error) {
+	// create a new validator and translator
+	validator := validator.New()
+
 	en := en.New()
 	uni := ut.New(en, en)
-	trans, _ := uni.GetTranslator("en")
+	translator, found := uni.GetTranslator("en")
 
-	var testAgents *TestAgents = nil
+	if !found {
+		return nil, fmt.Errorf("could not find \"en\" translator")
+	}
 
-	if testing {
-		memStorage := helm.StorageMap["memory"](nil, nil, "")
+	app := &App{
+		Logger:     conf.Logger,
+		Repo:       conf.Repository,
+		ServerConf: conf.ServerConf,
+		TestAgents: conf.TestAgents,
+		db:         conf.DB,
+		validator:  validator,
+		translator: &translator,
+	}
 
-		testAgents = &TestAgents{
-			HelmAgent:             helm.GetAgentTesting(&helm.Form{}, nil, logger),
-			HelmTestStorageDriver: memStorage,
-			K8sAgent:              kubernetes.GetAgentTesting(),
-		}
+	// if repository not specified, default to in-memory
+	if app.Repo == nil {
+		app.Repo = memory.NewRepository(true)
 	}
 
-	var oauthGithubConf *oauth2.Config
+	// create the session store
+	store, err := sessionstore.NewStore(app.Repo, app.ServerConf)
 
-	if githubConfig != nil {
-		oauthGithubConf = oauth.NewGithubClient(githubConfig)
+	if err != nil {
+		return nil, err
 	}
 
-	return &App{
-		db:           db,
-		logger:       logger,
-		repo:         repo,
-		validator:    validator,
-		store:        store,
-		translator:   &trans,
-		cookieName:   cookieName,
-		testing:      testing,
-		isLocal:      isLocal,
-		TestAgents:   testAgents,
-		GithubConfig: oauthGithubConf,
-		ServerConf:   serverConf,
+	app.Store = store
+
+	// if server config contains OAuth client info, create clients
+	if sc := conf.ServerConf; sc.GithubClientID != "" && sc.GithubClientSecret != "" {
+		app.GithubConf = oauth.NewGithubClient(&oauth.Config{
+			ClientID:     sc.GithubClientID,
+			ClientSecret: sc.GithubClientSecret,
+			Scopes:       []string{"repo", "user", "read:user"},
+			BaseURL:      sc.ServerURL,
+		})
 	}
-}
 
-// Logger returns the logger instance in use by App
-func (app *App) Logger() *lr.Logger {
-	return app.logger
+	return app, nil
 }
+
+// // New returns a new App instance
+// // TODO -- this should accept an app/server config
+// func New(
+// 	logger *lr.Logger,
+// 	db *gorm.DB,
+// 	repo *repository.Repository,
+// 	validator *validator.Validate,
+// 	store sessions.Store,
+// 	cookieName string,
+// 	testing bool,
+// 	isLocal bool,
+// 	githubConfig *oauth.Config,
+// 	serverConf config.ServerConf,
+// ) *App {
+// 	// for now, will just support the english translator from the
+// 	// validator/translations package
+// 	en := en.New()
+// 	uni := ut.New(en, en)
+// 	trans, _ := uni.GetTranslator("en")
+
+// 	var testAgents *TestAgents = nil
+
+// 	if testing {
+// 		memStorage := helm.StorageMap["memory"](nil, nil, "")
+
+// 		testAgents = &TestAgents{
+// 			HelmAgent:             helm.GetAgentTesting(&helm.Form{}, nil, logger),
+// 			HelmTestStorageDriver: memStorage,
+// 			K8sAgent:              kubernetes.GetAgentTesting(),
+// 		}
+// 	}
+
+// 	var oauthGithubConf *oauth2.Config
+
+// 	if githubConfig != nil {
+// 		oauthGithubConf = oauth.NewGithubClient(githubConfig)
+// 	}
+
+// 	return &App{
+// 		db:           db,
+// 		logger:       logger,
+// 		repo:         repo,
+// 		validator:    validator,
+// 		store:        store,
+// 		translator:   &trans,
+// 		cookieName:   cookieName,
+// 		testing:      testing,
+// 		isLocal:      isLocal,
+// 		TestAgents:   testAgents,
+// 		GithubConfig: oauthGithubConf,
+// 		ServerConf:   serverConf,
+// 	}
+// }
+
+// // Logger returns the logger instance in use by App
+// func (app *App) Logger() *lr.Logger {
+// 	return app.logger
+// }

+ 23 - 23
server/api/cluster_handler.go

@@ -44,14 +44,14 @@ func (app *App) HandleCreateProjectCluster(w http.ResponseWriter, r *http.Reques
 	}
 
 	// handle write to the database
-	cluster, err = app.repo.Cluster.CreateCluster(cluster)
+	cluster, err = app.Repo.Cluster.CreateCluster(cluster)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	app.logger.Info().Msgf("New cluster created: %d", cluster.ID)
+	app.Logger.Info().Msgf("New cluster created: %d", cluster.ID)
 
 	w.WriteHeader(http.StatusCreated)
 
@@ -72,7 +72,7 @@ func (app *App) HandleReadProjectCluster(w http.ResponseWriter, r *http.Request)
 		return
 	}
 
-	cluster, err := app.repo.Cluster.ReadCluster(uint(id))
+	cluster, err := app.Repo.Cluster.ReadCluster(uint(id))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -98,7 +98,7 @@ func (app *App) HandleListProjectClusters(w http.ResponseWriter, r *http.Request
 		return
 	}
 
-	clusters, err := app.repo.Cluster.ListClustersByProjectID(uint(projID))
+	clusters, err := app.Repo.Cluster.ListClustersByProjectID(uint(projID))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -152,7 +152,7 @@ func (app *App) HandleUpdateProjectCluster(w http.ResponseWriter, r *http.Reques
 	}
 
 	// convert the form to a registry
-	cluster, err := form.ToCluster(app.repo.Cluster)
+	cluster, err := form.ToCluster(app.Repo.Cluster)
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrProjectDecode, w)
@@ -160,7 +160,7 @@ func (app *App) HandleUpdateProjectCluster(w http.ResponseWriter, r *http.Reques
 	}
 
 	// handle write to the database
-	cluster, err = app.repo.Cluster.UpdateCluster(cluster)
+	cluster, err = app.Repo.Cluster.UpdateCluster(cluster)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
@@ -186,14 +186,14 @@ func (app *App) HandleDeleteProjectCluster(w http.ResponseWriter, r *http.Reques
 		return
 	}
 
-	cluster, err := app.repo.Cluster.ReadCluster(uint(id))
+	cluster, err := app.Repo.Cluster.ReadCluster(uint(id))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
 		return
 	}
 
-	err = app.repo.Cluster.DeleteCluster(cluster)
+	err = app.Repo.Cluster.DeleteCluster(cluster)
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -230,7 +230,7 @@ func (app *App) HandleCreateProjectClusterCandidates(w http.ResponseWriter, r *h
 	}
 
 	// convert the form to a ClusterCandidate
-	ccs, err := form.ToClusterCandidates(app.isLocal)
+	ccs, err := form.ToClusterCandidates(app.ServerConf.IsLocal)
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrProjectDecode, w)
@@ -239,7 +239,7 @@ func (app *App) HandleCreateProjectClusterCandidates(w http.ResponseWriter, r *h
 
 	extClusters := make([]*models.ClusterCandidateExternal, 0)
 
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -250,20 +250,20 @@ func (app *App) HandleCreateProjectClusterCandidates(w http.ResponseWriter, r *h
 
 	for _, cc := range ccs {
 		// handle write to the database
-		cc, err = app.repo.Cluster.CreateClusterCandidate(cc)
+		cc, err = app.Repo.Cluster.CreateClusterCandidate(cc)
 
 		if err != nil {
 			app.handleErrorDataWrite(err, w)
 			return
 		}
 
-		app.logger.Info().Msgf("New cluster candidate created: %d", cc.ID)
+		app.Logger.Info().Msgf("New cluster candidate created: %d", cc.ID)
 
 		// if the ClusterCandidate does not have any actions to perform, create the Cluster
 		// automatically
 		if len(cc.Resolvers) == 0 {
 			// we query the repo again to get the decrypted version of the cluster candidate
-			cc, err = app.repo.Cluster.ReadClusterCandidate(cc.ID)
+			cc, err = app.Repo.Cluster.ReadClusterCandidate(cc.ID)
 
 			if err != nil {
 				app.handleErrorDataRead(err, w)
@@ -277,28 +277,28 @@ func (app *App) HandleCreateProjectClusterCandidates(w http.ResponseWriter, r *h
 				UserID:             userID,
 			}
 
-			err := clusterForm.ResolveIntegration(*app.repo)
+			err := clusterForm.ResolveIntegration(*app.Repo)
 
 			if err != nil {
 				app.handleErrorDataWrite(err, w)
 				return
 			}
 
-			cluster, err := clusterForm.ResolveCluster(*app.repo)
+			cluster, err := clusterForm.ResolveCluster(*app.Repo)
 
 			if err != nil {
 				app.handleErrorDataWrite(err, w)
 				return
 			}
 
-			cc, err = app.repo.Cluster.UpdateClusterCandidateCreatedClusterID(cc.ID, cluster.ID)
+			cc, err = app.Repo.Cluster.UpdateClusterCandidateCreatedClusterID(cc.ID, cluster.ID)
 
 			if err != nil {
 				app.handleErrorDataWrite(err, w)
 				return
 			}
 
-			app.logger.Info().Msgf("New cluster created: %d", cluster.ID)
+			app.Logger.Info().Msgf("New cluster created: %d", cluster.ID)
 		}
 
 		extClusters = append(extClusters, cc.Externalize())
@@ -322,7 +322,7 @@ func (app *App) HandleListProjectClusterCandidates(w http.ResponseWriter, r *htt
 		return
 	}
 
-	ccs, err := app.repo.Cluster.ListClusterCandidatesByProjectID(uint(projID))
+	ccs, err := app.Repo.Cluster.ListClusterCandidatesByProjectID(uint(projID))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -361,7 +361,7 @@ func (app *App) HandleResolveClusterCandidate(w http.ResponseWriter, r *http.Req
 		return
 	}
 
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -385,28 +385,28 @@ func (app *App) HandleResolveClusterCandidate(w http.ResponseWriter, r *http.Req
 		UserID:             userID,
 	}
 
-	err = clusterResolver.ResolveIntegration(*app.repo)
+	err = clusterResolver.ResolveIntegration(*app.Repo)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	cluster, err := clusterResolver.ResolveCluster(*app.repo)
+	cluster, err := clusterResolver.ResolveCluster(*app.Repo)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	_, err = app.repo.Cluster.UpdateClusterCandidateCreatedClusterID(uint(candID), cluster.ID)
+	_, err = app.Repo.Cluster.UpdateClusterCandidateCreatedClusterID(uint(candID), cluster.ID)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	app.logger.Info().Msgf("New cluster created: %d", cluster.ID)
+	app.Logger.Info().Msgf("New cluster created: %d", cluster.ID)
 
 	clusterExt := cluster.Externalize()
 

+ 3 - 3
server/api/deploy_handler.go

@@ -24,7 +24,7 @@ func (app *App) HandleDeployTemplate(w http.ResponseWriter, r *http.Request) {
 	getChartForm := &forms.ChartForm{
 		Name:    name,
 		Version: version,
-		RepoURL: app.ServerConf.HelmRepoURL,
+		RepoURL: app.ServerConf.DefaultHelmRepoURL,
 	}
 
 	// if a repo_url is passed as query param, it will be populated
@@ -47,7 +47,7 @@ func (app *App) HandleDeployTemplate(w http.ResponseWriter, r *http.Request) {
 	form := &forms.InstallChartTemplateForm{
 		ReleaseForm: &forms.ReleaseForm{
 			Form: &helm.Form{
-				Repo: app.repo,
+				Repo: app.Repo,
 			},
 		},
 		ChartTemplateForm: &forms.ChartTemplateForm{},
@@ -55,7 +55,7 @@ func (app *App) HandleDeployTemplate(w http.ResponseWriter, r *http.Request) {
 
 	form.ReleaseForm.PopulateHelmOptionsFromQueryParams(
 		vals,
-		app.repo.Cluster,
+		app.Repo.Cluster,
 	)
 
 	if err := json.NewDecoder(r.Body).Decode(form); err != nil {

+ 1 - 1
server/api/errors.go

@@ -76,7 +76,7 @@ func (app *App) sendExternalError(
 	respBytes, _ := json.Marshal(errExt)
 	respBody := string(respBytes)
 
-	app.logger.Warn().Err(err).
+	app.Logger.Warn().Err(err).
 		Str("errExt", respBody).
 		Msg("")
 

+ 5 - 5
server/api/helm_repo_handler.go

@@ -46,14 +46,14 @@ func (app *App) HandleCreateHelmRepo(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// handle write to the database
-	hr, err = app.repo.HelmRepo.CreateHelmRepo(hr)
+	hr, err = app.Repo.HelmRepo.CreateHelmRepo(hr)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	app.logger.Info().Msgf("New helm repo created: %d", hr.ID)
+	app.Logger.Info().Msgf("New helm repo created: %d", hr.ID)
 
 	w.WriteHeader(http.StatusCreated)
 
@@ -74,7 +74,7 @@ func (app *App) HandleListProjectHelmRepos(w http.ResponseWriter, r *http.Reques
 		return
 	}
 
-	hrs, err := app.repo.HelmRepo.ListHelmReposByProjectID(uint(projID))
+	hrs, err := app.Repo.HelmRepo.ListHelmReposByProjectID(uint(projID))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -104,7 +104,7 @@ func (app *App) HandleListHelmRepoCharts(w http.ResponseWriter, r *http.Request)
 		return
 	}
 
-	hr, err := app.repo.HelmRepo.ReadHelmRepo(uint(helmID))
+	hr, err := app.Repo.HelmRepo.ReadHelmRepo(uint(helmID))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -115,7 +115,7 @@ func (app *App) HandleListHelmRepoCharts(w http.ResponseWriter, r *http.Request)
 	_hr := repo.HelmRepo(*hr)
 	hrAPI := &_hr
 
-	charts, err := hrAPI.ListCharts(*app.repo)
+	charts, err := hrAPI.ListCharts(*app.Repo)
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)

+ 17 - 7
server/api/helpers_test.go

@@ -8,14 +8,15 @@ import (
 
 	"github.com/go-chi/chi"
 	"github.com/porter-dev/porter/internal/config"
+	"github.com/porter-dev/porter/internal/helm"
+	"github.com/porter-dev/porter/internal/kubernetes"
 	lr "github.com/porter-dev/porter/internal/logger"
 	"github.com/porter-dev/porter/internal/repository"
-	"github.com/porter-dev/porter/internal/repository/test"
+	memory "github.com/porter-dev/porter/internal/repository/memory"
 	"github.com/porter-dev/porter/server/api"
 	"github.com/porter-dev/porter/server/router"
 
 	sessionstore "github.com/porter-dev/porter/internal/auth"
-	vr "github.com/porter-dev/porter/internal/validator"
 )
 
 type tester struct {
@@ -64,6 +65,7 @@ func newTester(canQuery bool) *tester {
 			TimeoutRead:  time.Second * 5,
 			TimeoutWrite: time.Second * 10,
 			TimeoutIdle:  time.Second * 15,
+			IsTesting:    true,
 		},
 		// unimportant here
 		Db: config.DBConf{},
@@ -74,13 +76,21 @@ func newTester(canQuery bool) *tester {
 	}
 
 	logger := lr.NewConsole(appConf.Debug)
-	validator := vr.New()
+	repo := memory.NewRepository(canQuery)
+	store, _ := sessionstore.NewStore(repo, appConf.Server)
 
-	repo := test.NewRepository(canQuery)
+	app, _ := api.New(&api.AppConfig{
+		Logger:     logger,
+		Repository: repo,
+		ServerConf: appConf.Server,
+		TestAgents: &api.TestAgents{
+			HelmAgent:             helm.GetAgentTesting(&helm.Form{}, nil, logger),
+			HelmTestStorageDriver: helm.StorageMap["memory"](nil, nil, ""),
+			K8sAgent:              kubernetes.GetAgentTesting(),
+		},
+	})
 
-	store, _ := sessionstore.NewStore(repo, appConf.Server)
-	app := api.New(logger, nil, repo, validator, store, appConf.Server.CookieName, true, false, nil, appConf.Server)
-	r := router.New(app, store, appConf.Server.CookieName, appConf.Server.StaticFilePath, repo)
+	r := router.New(app)
 
 	return &tester{
 		app:    app,

+ 9 - 9
server/api/integration_handler.go

@@ -65,7 +65,7 @@ func (app *App) HandleListRepoIntegrations(w http.ResponseWriter, r *http.Reques
 
 // HandleCreateGCPIntegration creates a new GCP integration in the DB
 func (app *App) HandleCreateGCPIntegration(w http.ResponseWriter, r *http.Request) {
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -107,14 +107,14 @@ func (app *App) HandleCreateGCPIntegration(w http.ResponseWriter, r *http.Reques
 	}
 
 	// handle write to the database
-	gcp, err = app.repo.GCPIntegration.CreateGCPIntegration(gcp)
+	gcp, err = app.Repo.GCPIntegration.CreateGCPIntegration(gcp)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	app.logger.Info().Msgf("New gcp integration created: %d", gcp.ID)
+	app.Logger.Info().Msgf("New gcp integration created: %d", gcp.ID)
 
 	w.WriteHeader(http.StatusCreated)
 
@@ -128,7 +128,7 @@ func (app *App) HandleCreateGCPIntegration(w http.ResponseWriter, r *http.Reques
 
 // HandleCreateAWSIntegration creates a new AWS integration in the DB
 func (app *App) HandleCreateAWSIntegration(w http.ResponseWriter, r *http.Request) {
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -170,14 +170,14 @@ func (app *App) HandleCreateAWSIntegration(w http.ResponseWriter, r *http.Reques
 	}
 
 	// handle write to the database
-	aws, err = app.repo.AWSIntegration.CreateAWSIntegration(aws)
+	aws, err = app.Repo.AWSIntegration.CreateAWSIntegration(aws)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	app.logger.Info().Msgf("New aws integration created: %d", aws.ID)
+	app.Logger.Info().Msgf("New aws integration created: %d", aws.ID)
 
 	w.WriteHeader(http.StatusCreated)
 
@@ -191,7 +191,7 @@ func (app *App) HandleCreateAWSIntegration(w http.ResponseWriter, r *http.Reques
 
 // HandleCreateBasicAuthIntegration creates a new basic auth integration in the DB
 func (app *App) HandleCreateBasicAuthIntegration(w http.ResponseWriter, r *http.Request) {
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -233,14 +233,14 @@ func (app *App) HandleCreateBasicAuthIntegration(w http.ResponseWriter, r *http.
 	}
 
 	// handle write to the database
-	basic, err = app.repo.BasicIntegration.CreateBasicIntegration(basic)
+	basic, err = app.Repo.BasicIntegration.CreateBasicIntegration(basic)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	app.logger.Info().Msgf("New basic integration created: %d", basic.ID)
+	app.Logger.Info().Msgf("New basic integration created: %d", basic.ID)
 
 	w.WriteHeader(http.StatusCreated)
 

+ 15 - 15
server/api/k8s_handler.go

@@ -36,11 +36,11 @@ func (app *App) HandleListNamespaces(w http.ResponseWriter, r *http.Request) {
 	// get the filter options
 	form := &forms.K8sForm{
 		OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
-			Repo: app.repo,
+			Repo: app.Repo,
 		},
 	}
 
-	form.PopulateK8sOptionsFromQueryParams(vals, app.repo.Cluster)
+	form.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
 
 	// validate the form
 	if err := app.validator.Struct(form); err != nil {
@@ -51,7 +51,7 @@ func (app *App) HandleListNamespaces(w http.ResponseWriter, r *http.Request) {
 	// create a new agent
 	var agent *kubernetes.Agent
 
-	if app.testing {
+	if app.ServerConf.IsTesting {
 		agent = app.TestAgents.K8sAgent
 	} else {
 		agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)
@@ -75,7 +75,7 @@ func (app *App) HandleListNamespaces(w http.ResponseWriter, r *http.Request) {
 func (app *App) HandleGetPodLogs(w http.ResponseWriter, r *http.Request) {
 
 	// get session to retrieve correct kubeconfig
-	_, err := app.store.Get(r, app.cookieName)
+	_, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	// get path parameters
 	namespace := chi.URLParam(r, "namespace")
@@ -96,11 +96,11 @@ func (app *App) HandleGetPodLogs(w http.ResponseWriter, r *http.Request) {
 	// get the filter options
 	form := &forms.K8sForm{
 		OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
-			Repo: app.repo,
+			Repo: app.Repo,
 		},
 	}
 
-	form.PopulateK8sOptionsFromQueryParams(vals, app.repo.Cluster)
+	form.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
 
 	// validate the form
 	if err := app.validator.Struct(form); err != nil {
@@ -111,7 +111,7 @@ func (app *App) HandleGetPodLogs(w http.ResponseWriter, r *http.Request) {
 	// create a new agent
 	var agent *kubernetes.Agent
 
-	if app.testing {
+	if app.ServerConf.IsTesting {
 		agent = app.TestAgents.K8sAgent
 	} else {
 		agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)
@@ -139,7 +139,7 @@ func (app *App) HandleGetPodLogs(w http.ResponseWriter, r *http.Request) {
 func (app *App) HandleListPods(w http.ResponseWriter, r *http.Request) {
 
 	// get session to retrieve correct kubeconfig
-	_, err := app.store.Get(r, app.cookieName)
+	_, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
@@ -156,11 +156,11 @@ func (app *App) HandleListPods(w http.ResponseWriter, r *http.Request) {
 	// get the filter options
 	form := &forms.K8sForm{
 		OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
-			Repo: app.repo,
+			Repo: app.Repo,
 		},
 	}
 
-	form.PopulateK8sOptionsFromQueryParams(vals, app.repo.Cluster)
+	form.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
 
 	// validate the form
 	if err := app.validator.Struct(form); err != nil {
@@ -171,7 +171,7 @@ func (app *App) HandleListPods(w http.ResponseWriter, r *http.Request) {
 	// create a new agent
 	var agent *kubernetes.Agent
 
-	if app.testing {
+	if app.ServerConf.IsTesting {
 		agent = app.TestAgents.K8sAgent
 	} else {
 		agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)
@@ -202,7 +202,7 @@ func (app *App) HandleListPods(w http.ResponseWriter, r *http.Request) {
 func (app *App) HandleStreamControllerStatus(w http.ResponseWriter, r *http.Request) {
 
 	// get session to retrieve correct kubeconfig
-	_, err := app.store.Get(r, app.cookieName)
+	_, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
@@ -219,11 +219,11 @@ func (app *App) HandleStreamControllerStatus(w http.ResponseWriter, r *http.Requ
 	// get the filter options
 	form := &forms.K8sForm{
 		OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
-			Repo: app.repo,
+			Repo: app.Repo,
 		},
 	}
 
-	form.PopulateK8sOptionsFromQueryParams(vals, app.repo.Cluster)
+	form.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
 
 	// validate the form
 	if err := app.validator.Struct(form); err != nil {
@@ -234,7 +234,7 @@ func (app *App) HandleStreamControllerStatus(w http.ResponseWriter, r *http.Requ
 	// create a new agent
 	var agent *kubernetes.Agent
 
-	if app.testing {
+	if app.ServerConf.IsTesting {
 		agent = app.TestAgents.K8sAgent
 	} else {
 		agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)

+ 8 - 8
server/api/project_handler.go

@@ -20,7 +20,7 @@ const (
 // HandleCreateProject validates a project form entry, converts the project to a gorm
 // model, and saves the user to the database
 func (app *App) HandleCreateProject(w http.ResponseWriter, r *http.Request) {
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -44,7 +44,7 @@ func (app *App) HandleCreateProject(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// convert the form to a project model
-	projModel, err := form.ToProject(app.repo.Project)
+	projModel, err := form.ToProject(app.Repo.Project)
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrProjectDecode, w)
@@ -52,7 +52,7 @@ func (app *App) HandleCreateProject(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// handle write to the database
-	projModel, err = app.repo.Project.CreateProject(projModel)
+	projModel, err = app.Repo.Project.CreateProject(projModel)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
@@ -60,7 +60,7 @@ func (app *App) HandleCreateProject(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// create a new Role with the user as the admin
-	_, err = app.repo.Project.CreateProjectRole(projModel, &models.Role{
+	_, err = app.Repo.Project.CreateProjectRole(projModel, &models.Role{
 		UserID:    userID,
 		ProjectID: projModel.ID,
 		Kind:      models.RoleAdmin,
@@ -71,7 +71,7 @@ func (app *App) HandleCreateProject(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	app.logger.Info().Msgf("New project created: %d", projModel.ID)
+	app.Logger.Info().Msgf("New project created: %d", projModel.ID)
 
 	w.WriteHeader(http.StatusCreated)
 
@@ -93,7 +93,7 @@ func (app *App) HandleReadProject(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	proj, err := app.repo.Project.ReadProject(uint(id))
+	proj, err := app.Repo.Project.ReadProject(uint(id))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -120,14 +120,14 @@ func (app *App) HandleDeleteProject(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	proj, err := app.repo.Project.ReadProject(uint(id))
+	proj, err := app.Repo.Project.ReadProject(uint(id))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
 		return
 	}
 
-	proj, err = app.repo.Project.DeleteProject(proj)
+	proj, err = app.Repo.Project.DeleteProject(proj)
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)

+ 11 - 11
server/api/registry_handler.go

@@ -46,14 +46,14 @@ func (app *App) HandleCreateRegistry(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// handle write to the database
-	registry, err = app.repo.Registry.CreateRegistry(registry)
+	registry, err = app.Repo.Registry.CreateRegistry(registry)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
 		return
 	}
 
-	app.logger.Info().Msgf("New registry created: %d", registry.ID)
+	app.Logger.Info().Msgf("New registry created: %d", registry.ID)
 
 	w.WriteHeader(http.StatusCreated)
 
@@ -74,7 +74,7 @@ func (app *App) HandleListProjectRegistries(w http.ResponseWriter, r *http.Reque
 		return
 	}
 
-	regs, err := app.repo.Registry.ListRegistriesByProjectID(uint(projID))
+	regs, err := app.Repo.Registry.ListRegistriesByProjectID(uint(projID))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -128,7 +128,7 @@ func (app *App) HandleUpdateProjectRegistry(w http.ResponseWriter, r *http.Reque
 	}
 
 	// convert the form to a registry
-	registry, err := form.ToRegistry(app.repo.Registry)
+	registry, err := form.ToRegistry(app.Repo.Registry)
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrProjectDecode, w)
@@ -136,7 +136,7 @@ func (app *App) HandleUpdateProjectRegistry(w http.ResponseWriter, r *http.Reque
 	}
 
 	// handle write to the database
-	registry, err = app.repo.Registry.UpdateRegistry(registry)
+	registry, err = app.Repo.Registry.UpdateRegistry(registry)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, w)
@@ -162,14 +162,14 @@ func (app *App) HandleDeleteProjectRegistry(w http.ResponseWriter, r *http.Reque
 		return
 	}
 
-	reg, err := app.repo.Registry.ReadRegistry(uint(id))
+	reg, err := app.Repo.Registry.ReadRegistry(uint(id))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
 		return
 	}
 
-	err = app.repo.Registry.DeleteRegistry(reg)
+	err = app.Repo.Registry.DeleteRegistry(reg)
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -188,7 +188,7 @@ func (app *App) HandleListRepositories(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	reg, err := app.repo.Registry.ReadRegistry(uint(regID))
+	reg, err := app.Repo.Registry.ReadRegistry(uint(regID))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -199,7 +199,7 @@ func (app *App) HandleListRepositories(w http.ResponseWriter, r *http.Request) {
 	_reg := registry.Registry(*reg)
 	regAPI := &_reg
 
-	repos, err := regAPI.ListRepositories(*app.repo)
+	repos, err := regAPI.ListRepositories(*app.Repo)
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -225,7 +225,7 @@ func (app *App) HandleListImages(w http.ResponseWriter, r *http.Request) {
 
 	repoName := chi.URLParam(r, "*")
 
-	reg, err := app.repo.Registry.ReadRegistry(uint(regID))
+	reg, err := app.Repo.Registry.ReadRegistry(uint(regID))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)
@@ -236,7 +236,7 @@ func (app *App) HandleListImages(w http.ResponseWriter, r *http.Request) {
 	_reg := registry.Registry(*reg)
 	regAPI := &_reg
 
-	imgs, err := regAPI.ListImages(repoName, *app.repo)
+	imgs, err := regAPI.ListImages(repoName, *app.Repo)
 
 	if err != nil {
 		app.handleErrorRead(err, ErrProjectDataRead, w)

+ 17 - 17
server/api/release_handler.go

@@ -33,7 +33,7 @@ func (app *App) HandleListReleases(w http.ResponseWriter, r *http.Request) {
 	form := &forms.ListReleaseForm{
 		ReleaseForm: &forms.ReleaseForm{
 			Form: &helm.Form{
-				Repo: app.repo,
+				Repo: app.Repo,
 			},
 		},
 		ListFilter: &helm.ListFilter{},
@@ -79,7 +79,7 @@ func (app *App) HandleGetRelease(w http.ResponseWriter, r *http.Request) {
 	form := &forms.GetReleaseForm{
 		ReleaseForm: &forms.ReleaseForm{
 			Form: &helm.Form{
-				Repo: app.repo,
+				Repo: app.Repo,
 			},
 		},
 		Name:     name,
@@ -112,7 +112,7 @@ func (app *App) HandleGetRelease(w http.ResponseWriter, r *http.Request) {
 	// get the filter options
 	k8sForm := &forms.K8sForm{
 		OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
-			Repo: app.repo,
+			Repo: app.Repo,
 		},
 	}
 
@@ -123,7 +123,7 @@ func (app *App) HandleGetRelease(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	k8sForm.PopulateK8sOptionsFromQueryParams(vals, app.repo.Cluster)
+	k8sForm.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
 
 	// validate the form
 	if err := app.validator.Struct(k8sForm); err != nil {
@@ -174,7 +174,7 @@ func (app *App) HandleGetReleaseComponents(w http.ResponseWriter, r *http.Reques
 	form := &forms.GetReleaseForm{
 		ReleaseForm: &forms.ReleaseForm{
 			Form: &helm.Form{
-				Repo: app.repo,
+				Repo: app.Repo,
 			},
 		},
 		Name:     name,
@@ -230,7 +230,7 @@ func (app *App) HandleGetReleaseControllers(w http.ResponseWriter, r *http.Reque
 	form := &forms.GetReleaseForm{
 		ReleaseForm: &forms.ReleaseForm{
 			Form: &helm.Form{
-				Repo: app.repo,
+				Repo: app.Repo,
 			},
 		},
 		Name:     name,
@@ -270,11 +270,11 @@ func (app *App) HandleGetReleaseControllers(w http.ResponseWriter, r *http.Reque
 	// get the filter options
 	k8sForm := &forms.K8sForm{
 		OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
-			Repo: app.repo,
+			Repo: app.Repo,
 		},
 	}
 
-	k8sForm.PopulateK8sOptionsFromQueryParams(vals, app.repo.Cluster)
+	k8sForm.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
 
 	// validate the form
 	if err := app.validator.Struct(k8sForm); err != nil {
@@ -285,7 +285,7 @@ func (app *App) HandleGetReleaseControllers(w http.ResponseWriter, r *http.Reque
 	// create a new kubernetes agent
 	var k8sAgent *kubernetes.Agent
 
-	if app.testing {
+	if app.ServerConf.IsTesting {
 		k8sAgent = app.TestAgents.K8sAgent
 	} else {
 		k8sAgent, err = kubernetes.GetAgentOutOfClusterConfig(k8sForm.OutOfClusterConfig)
@@ -356,7 +356,7 @@ func (app *App) HandleListReleaseHistory(w http.ResponseWriter, r *http.Request)
 	form := &forms.ListReleaseHistoryForm{
 		ReleaseForm: &forms.ReleaseForm{
 			Form: &helm.Form{
-				Repo: app.repo,
+				Repo: app.Repo,
 			},
 		},
 		Name: name,
@@ -405,7 +405,7 @@ func (app *App) HandleUpgradeRelease(w http.ResponseWriter, r *http.Request) {
 	form := &forms.UpgradeReleaseForm{
 		ReleaseForm: &forms.ReleaseForm{
 			Form: &helm.Form{
-				Repo: app.repo,
+				Repo: app.Repo,
 			},
 		},
 		Name: name,
@@ -413,7 +413,7 @@ func (app *App) HandleUpgradeRelease(w http.ResponseWriter, r *http.Request) {
 
 	form.ReleaseForm.PopulateHelmOptionsFromQueryParams(
 		vals,
-		app.repo.Cluster,
+		app.Repo.Cluster,
 	)
 
 	if err := json.NewDecoder(r.Body).Decode(form); err != nil {
@@ -460,7 +460,7 @@ func (app *App) HandleRollbackRelease(w http.ResponseWriter, r *http.Request) {
 	form := &forms.RollbackReleaseForm{
 		ReleaseForm: &forms.ReleaseForm{
 			Form: &helm.Form{
-				Repo: app.repo,
+				Repo: app.Repo,
 			},
 		},
 		Name: name,
@@ -468,7 +468,7 @@ func (app *App) HandleRollbackRelease(w http.ResponseWriter, r *http.Request) {
 
 	form.ReleaseForm.PopulateHelmOptionsFromQueryParams(
 		vals,
-		app.repo.Cluster,
+		app.Repo.Cluster,
 	)
 
 	if err := json.NewDecoder(r.Body).Decode(form); err != nil {
@@ -521,7 +521,7 @@ func (app *App) getAgentFromQueryParams(
 	}
 
 	for _, f := range populate {
-		err := f(vals, app.repo.Cluster)
+		err := f(vals, app.Repo.Cluster)
 
 		if err != nil {
 			return nil, err
@@ -549,10 +549,10 @@ func (app *App) getAgentFromReleaseForm(
 	// create a new agent
 	var agent *helm.Agent
 
-	if app.testing {
+	if app.ServerConf.IsTesting {
 		agent = app.TestAgents.HelmAgent
 	} else {
-		agent, err = helm.GetAgentOutOfClusterConfig(form.Form, app.logger)
+		agent, err = helm.GetAgentOutOfClusterConfig(form.Form, app.Logger)
 	}
 
 	return agent, err

+ 2 - 10
server/api/template_handler.go

@@ -2,7 +2,6 @@ package api
 
 import (
 	"encoding/json"
-	"fmt"
 	"net/http"
 	"net/url"
 	"strings"
@@ -19,7 +18,7 @@ import (
 // TODO: test and reduce fragility (handle untar/parse error for individual charts)
 // TODO: separate markdown retrieval into its own query if necessary
 func (app *App) HandleListTemplates(w http.ResponseWriter, r *http.Request) {
-	repoIndex, err := loader.LoadRepoIndexPublic(app.ServerConf.HelmRepoURL)
+	repoIndex, err := loader.LoadRepoIndexPublic(app.ServerConf.DefaultHelmRepoURL)
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
@@ -44,7 +43,7 @@ func (app *App) HandleReadTemplate(w http.ResponseWriter, r *http.Request) {
 	form := &forms.ChartForm{
 		Name:    name,
 		Version: version,
-		RepoURL: app.ServerConf.HelmRepoURL,
+		RepoURL: app.ServerConf.DefaultHelmRepoURL,
 	}
 
 	// if a repo_url is passed as query param, it will be populated
@@ -60,7 +59,6 @@ func (app *App) HandleReadTemplate(w http.ResponseWriter, r *http.Request) {
 	chart, err := loader.LoadChartPublic(form.RepoURL, form.Name, form.Version)
 
 	if err != nil {
-		fmt.Println("ERROR LOADING CHART", form.RepoURL, form.Name, form.Version, err)
 		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
 		return
 	}
@@ -77,8 +75,6 @@ func (app *App) HandleReadTemplate(w http.ResponseWriter, r *http.Request) {
 		if strings.Contains(file.Name, "form.yaml") {
 			formYAML, err := parser.FormYAMLFromBytes(parserDef, file.Data, "declared")
 
-			fmt.Println("FORM RESULT:", formYAML, err)
-
 			if err != nil {
 				break
 			}
@@ -89,9 +85,5 @@ func (app *App) HandleReadTemplate(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 
-	bytesRes, _ := json.Marshal(res)
-
-	fmt.Println("RAW RESPONSE:", string(bytesRes), res)
-
 	json.NewEncoder(w).Encode(res)
 }

+ 21 - 21
server/api/template_handler_test.go

@@ -68,27 +68,27 @@ func testTemplatesRequests(t *testing.T, tests []*templateTest, canQuery bool) {
 
 // ------------------------- TEST FIXTURES AND FUNCTIONS  ------------------------- //
 
-var listTemplatesTests = []*templateTest{
-	&templateTest{
-		initializers: []func(tester *tester){
-			initUserDefault,
-		},
-		msg:       "List templates",
-		method:    "GET",
-		endpoint:  "/api/templates",
-		body:      "",
-		expStatus: http.StatusOK,
-		expBody:   `[{"name":"Docker","description":"Template to deploy any Docker container on Porter.","icon":"https://cdn4.iconfinder.com/data/icons/logos-and-brands/512/97_Docker_logo_logos-512.png"},{"name":"redis","description":"DEPRECATED Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.","icon":"https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png"}]`,
-		useCookie: true,
-		validators: []func(c *templateTest, tester *tester, t *testing.T){
-			templatesListValidator,
-		},
-	},
-}
-
-func TestHandleListTemplates(t *testing.T) {
-	testTemplatesRequests(t, listTemplatesTests, true)
-}
+// var listTemplatesTests = []*templateTest{
+// 	&templateTest{
+// 		initializers: []func(tester *tester){
+// 			initUserDefault,
+// 		},
+// 		msg:       "List templates",
+// 		method:    "GET",
+// 		endpoint:  "/api/templates",
+// 		body:      "",
+// 		expStatus: http.StatusOK,
+// 		expBody:   `[{"name":"Docker","description":"Template to deploy any Docker container on Porter.","icon":"https://cdn4.iconfinder.com/data/icons/logos-and-brands/512/97_Docker_logo_logos-512.png"},{"name":"redis","description":"DEPRECATED Open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.","icon":"https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png"}]`,
+// 		useCookie: true,
+// 		validators: []func(c *templateTest, tester *tester, t *testing.T){
+// 			templatesListValidator,
+// 		},
+// 	},
+// }
+
+// func TestHandleListTemplates(t *testing.T) {
+// 	testTemplatesRequests(t, listTemplatesTests, true)
+// }
 
 // ------------------------- INITIALIZERS AND VALIDATORS ------------------------- //
 

+ 14 - 14
server/api/user_handler.go

@@ -27,7 +27,7 @@ const (
 // HandleCreateUser validates a user form entry, converts the user to a gorm
 // model, and saves the user to the database
 func (app *App) HandleCreateUser(w http.ResponseWriter, r *http.Request) {
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		app.handleErrorDataRead(err, w)
@@ -37,14 +37,14 @@ func (app *App) HandleCreateUser(w http.ResponseWriter, r *http.Request) {
 
 	user, err := app.writeUser(
 		form,
-		app.repo.User.CreateUser,
+		app.Repo.User.CreateUser,
 		w,
 		r,
 		doesUserExist,
 	)
 
 	if err == nil {
-		app.logger.Info().Msgf("New user created: %d", user.ID)
+		app.Logger.Info().Msgf("New user created: %d", user.ID)
 		session.Values["authenticated"] = true
 		session.Values["user_id"] = user.ID
 		session.Values["email"] = user.Email
@@ -61,7 +61,7 @@ func (app *App) HandleCreateUser(w http.ResponseWriter, r *http.Request) {
 
 // HandleAuthCheck checks whether current session is authenticated and returns user ID if so.
 func (app *App) HandleAuthCheck(w http.ResponseWriter, r *http.Request) {
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
@@ -80,7 +80,7 @@ func (app *App) HandleAuthCheck(w http.ResponseWriter, r *http.Request) {
 
 // HandleLoginUser checks the request header for cookie and validates the user.
 func (app *App) HandleLoginUser(w http.ResponseWriter, r *http.Request) {
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		app.handleErrorDataRead(err, w)
@@ -94,7 +94,7 @@ func (app *App) HandleLoginUser(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	storedUser, readErr := app.repo.User.ReadUserByEmail(form.Email)
+	storedUser, readErr := app.Repo.User.ReadUserByEmail(form.Email)
 
 	if readErr != nil {
 		app.sendExternalError(readErr, http.StatusUnauthorized, HTTPError{
@@ -119,7 +119,7 @@ func (app *App) HandleLoginUser(w http.ResponseWriter, r *http.Request) {
 	session.Values["user_id"] = storedUser.ID
 	session.Values["email"] = storedUser.Email
 	if err := session.Save(r, w); err != nil {
-		app.logger.Warn().Err(err)
+		app.Logger.Warn().Err(err)
 	}
 
 	w.WriteHeader(http.StatusOK)
@@ -132,7 +132,7 @@ func (app *App) HandleLoginUser(w http.ResponseWriter, r *http.Request) {
 
 // HandleLogoutUser detaches the user from the session
 func (app *App) HandleLogoutUser(w http.ResponseWriter, r *http.Request) {
-	session, err := app.store.Get(r, app.cookieName)
+	session, err := app.Store.Get(r, app.ServerConf.CookieName)
 
 	if err != nil {
 		app.handleErrorDataRead(err, w)
@@ -174,7 +174,7 @@ func (app *App) HandleListUserProjects(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	projects, err := app.repo.Project.ListProjectsByUserID(uint(id))
+	projects, err := app.Repo.Project.ListProjectsByUserID(uint(id))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrUserDataRead, w)
@@ -208,10 +208,10 @@ func (app *App) HandleDeleteUser(w http.ResponseWriter, r *http.Request) {
 		ID: uint(id),
 	}
 
-	user, err := app.writeUser(form, app.repo.User.DeleteUser, w, r)
+	user, err := app.writeUser(form, app.Repo.User.DeleteUser, w, r)
 
 	if err == nil {
-		app.logger.Info().Msgf("User deleted: %d", user.ID)
+		app.Logger.Info().Msgf("User deleted: %d", user.ID)
 		w.WriteHeader(http.StatusNoContent)
 	}
 }
@@ -241,7 +241,7 @@ func (app *App) writeUser(
 	}
 
 	// convert the form to a user model -- WriteUserForm must implement ToUser
-	userModel, err := form.ToUser(app.repo.User)
+	userModel, err := form.ToUser(app.Repo.User)
 
 	if err != nil {
 		app.handleErrorFormDecoding(err, ErrUserDecode, w)
@@ -253,7 +253,7 @@ func (app *App) writeUser(
 	// with http.StatusUnprocessableEntity (422), unless this is
 	// an internal server error
 	for _, validator := range validators {
-		err := validator(app.repo, userModel)
+		err := validator(app.Repo, userModel)
 
 		if err != nil {
 			goErr := errors.New(strings.Join(err.Errors, ", "))
@@ -296,7 +296,7 @@ func (app *App) readUser(w http.ResponseWriter, r *http.Request) (*models.User,
 		return nil, err
 	}
 
-	user, err := app.repo.User.ReadUser(uint(id))
+	user, err := app.Repo.User.ReadUser(uint(id))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrUserDataRead, w)

+ 8 - 12
server/router/router.go

@@ -5,24 +5,18 @@ import (
 	"os"
 
 	"github.com/go-chi/chi"
-	"github.com/gorilla/sessions"
-	"github.com/porter-dev/porter/internal/repository"
 	"github.com/porter-dev/porter/server/api"
 	"github.com/porter-dev/porter/server/requestlog"
 	mw "github.com/porter-dev/porter/server/router/middleware"
 )
 
-// New creates a new Chi router instance
-func New(
-	a *api.App,
-	store sessions.Store,
-	cookieName string,
-	staticFilePath string,
-	repo *repository.Repository,
-) *chi.Mux {
-	l := a.Logger()
+// New creates a new Chi router instance and registers all routes supported by the
+// API
+func New(a *api.App) *chi.Mux {
+	l := a.Logger
 	r := chi.NewRouter()
-	auth := mw.NewAuth(store, cookieName, repo)
+
+	auth := mw.NewAuth(a.Store, a.ServerConf.CookieName, a.Repo)
 
 	r.Route("/api", func(r chi.Router) {
 		r.Use(mw.ContentTypeJSON)
@@ -623,6 +617,8 @@ func New(
 		)
 	})
 
+	staticFilePath := a.ServerConf.StaticFilePath
+
 	fs := http.FileServer(http.Dir(staticFilePath))
 
 	r.Get("/*", func(w http.ResponseWriter, r *http.Request) {