Jelajahi Sumber

repository package and interface

Alexander Belanger 5 tahun lalu
induk
melakukan
ce2b96a63e

+ 4 - 1
cmd/app/main.go

@@ -5,6 +5,8 @@ import (
 	"log"
 	"net/http"
 
+	"github.com/porter-dev/porter/internal/repository"
+
 	"github.com/porter-dev/porter/server/api"
 
 	adapter "github.com/porter-dev/porter/internal/adapter"
@@ -26,8 +28,9 @@ func main() {
 	}
 
 	validator := vr.New()
+	repo := repository.NewDefaultRepository(db)
 
-	a := api.New(logger, db, validator)
+	a := api.New(logger, repo, validator)
 
 	appRouter := router.New(a)
 

+ 0 - 40
internal/queries/user.go

@@ -1,40 +0,0 @@
-package queries
-
-import (
-	"github.com/porter-dev/porter/internal/models"
-	"gorm.io/gorm"
-)
-
-// CreateUser adds a new User row to the Users table in the database
-func CreateUser(db *gorm.DB, user *models.User) (*models.User, error) {
-	if err := db.Create(user).Error; err != nil {
-		return nil, err
-	}
-	return user, nil
-}
-
-// ReadUser finds a single user based on their unique id
-func ReadUser(db *gorm.DB, id uint) (*models.User, error) {
-	user := &models.User{}
-	if err := db.Where("id = ?", id).First(&user).Error; err != nil {
-		return nil, err
-	}
-	return user, nil
-}
-
-// UpdateUser modifies an existing User in the database
-func UpdateUser(db *gorm.DB, user *models.User) (*models.User, error) {
-	if err := db.First(&models.User{}, user.ID).Updates(user).Error; err != nil {
-		return nil, err
-	}
-
-	return user, nil
-}
-
-// DeleteUser deletes a single user using their unique id
-func DeleteUser(db *gorm.DB, user *models.User) (*models.User, error) {
-	if err := db.First(&models.User{}, user.ID).Delete(&user).Error; err != nil {
-		return nil, err
-	}
-	return user, nil
-}

+ 16 - 0
internal/repository/repository.go

@@ -0,0 +1,16 @@
+package repository
+
+import "gorm.io/gorm"
+
+// Repository collects the repositories for each model
+type Repository struct {
+	User UserRepository
+}
+
+// NewDefaultRepository returns a Repository which uses
+// gorm.DB for querying the database
+func NewDefaultRepository(db *gorm.DB) *Repository {
+	return &Repository{
+		User: *NewDefaultUserRepository(db),
+	}
+}

+ 62 - 0
internal/repository/user.go

@@ -0,0 +1,62 @@
+package repository
+
+import (
+	"github.com/porter-dev/porter/internal/models"
+	"gorm.io/gorm"
+)
+
+// WriteUser is the function type for all User write operations
+type WriteUser func(user *models.User) (*models.User, error)
+
+// UserRepository represents the set of queries on the User model
+type UserRepository interface {
+	CreateUser(user *models.User) (*models.User, error)
+	ReadUser(id uint) (*models.User, error)
+	UpdateUser(user *models.User) (*models.User, error)
+	DeleteUser(user *models.User) (*models.User, error)
+}
+
+// DefaultUserRepository uses gorm.DB for querying the database
+type DefaultUserRepository struct {
+	db *gorm.DB
+}
+
+// NewDefaultUserRepository returns a DefaultUserRepository which uses
+// gorm.DB for querying the database
+func NewDefaultUserRepository(db *gorm.DB) *DefaultUserRepository {
+	return &DefaultUserRepository{db}
+}
+
+// CreateUser adds a new User row to the Users table in the database
+func (repo DefaultUserRepository) CreateUser(user *models.User) (*models.User, error) {
+	if err := repo.db.Create(user).Error; err != nil {
+		return nil, err
+	}
+	return user, nil
+}
+
+// ReadUser finds a single user based on their unique id
+func (repo DefaultUserRepository) ReadUser(id uint) (*models.User, error) {
+	user := &models.User{}
+	if err := repo.db.Where("id = ?", id).First(&user).Error; err != nil {
+		return nil, err
+	}
+	return user, nil
+}
+
+// UpdateUser modifies an existing User in the database
+func (repo DefaultUserRepository) UpdateUser(user *models.User) (*models.User, error) {
+	if err := repo.db.First(&models.User{}, user.ID).Updates(user).Error; err != nil {
+		return nil, err
+	}
+
+	return user, nil
+}
+
+// DeleteUser deletes a single user using their unique id
+func (repo DefaultUserRepository) DeleteUser(user *models.User) (*models.User, error) {
+	if err := repo.db.First(&models.User{}, user.ID).Delete(&user).Error; err != nil {
+		return nil, err
+	}
+	return user, nil
+}

+ 4 - 4
server/api/api.go

@@ -5,14 +5,14 @@ import (
 	ut "github.com/go-playground/universal-translator"
 	"github.com/go-playground/validator/v10"
 	lr "github.com/porter-dev/porter/internal/logger"
-	"gorm.io/gorm"
+	"github.com/porter-dev/porter/internal/repository"
 )
 
 // App represents an API instance with handler methods attached, a DB connection
 // and a logger instance
 type App struct {
 	logger     *lr.Logger
-	db         *gorm.DB
+	repo       *repository.Repository
 	validator  *validator.Validate
 	translator *ut.Translator
 }
@@ -20,7 +20,7 @@ type App struct {
 // New returns a new App instance
 func New(
 	logger *lr.Logger,
-	db *gorm.DB,
+	repo *repository.Repository,
 	validator *validator.Validate,
 ) *App {
 	// for now, will just support the english translator from the
@@ -31,7 +31,7 @@ func New(
 
 	return &App{
 		logger:     logger,
-		db:         db,
+		repo:       repo,
 		validator:  validator,
 		translator: &trans,
 	}

+ 7 - 8
server/api/user_handler.go

@@ -8,8 +8,7 @@ import (
 	"github.com/go-chi/chi"
 	"github.com/porter-dev/porter/internal/forms"
 	"github.com/porter-dev/porter/internal/models"
-	"github.com/porter-dev/porter/internal/queries"
-	"gorm.io/gorm"
+	"github.com/porter-dev/porter/internal/repository"
 )
 
 // Enumeration of user API error codes, represented as int64
@@ -25,7 +24,7 @@ const (
 func (app *App) HandleCreateUser(w http.ResponseWriter, r *http.Request) {
 	form := &forms.CreateUserForm{}
 
-	user, err := app.writeUser(form, queries.CreateUser, w, r)
+	user, err := app.writeUser(form, app.repo.User.CreateUser, w, r)
 
 	if err == nil {
 		app.logger.Info().Msgf("New user created: %d", user.ID)
@@ -43,7 +42,7 @@ func (app *App) HandleReadUser(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	user, err := queries.ReadUser(app.db, uint(id))
+	user, err := app.repo.User.ReadUser(uint(id))
 
 	if err != nil {
 		app.handleErrorRead(err, ErrUserDataRead, w)
@@ -74,7 +73,7 @@ func (app *App) HandleUpdateUser(w http.ResponseWriter, r *http.Request) {
 		ID: uint(id),
 	}
 
-	user, err := app.writeUser(form, queries.UpdateUser, w, r)
+	user, err := app.writeUser(form, app.repo.User.UpdateUser, w, r)
 
 	if err == nil {
 		app.logger.Info().Msgf("User updated: %d", user.ID)
@@ -97,7 +96,7 @@ func (app *App) HandleDeleteUser(w http.ResponseWriter, r *http.Request) {
 		Password: "testing",
 	}
 
-	user, err := app.writeUser(form, queries.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)
@@ -112,7 +111,7 @@ func (app *App) HandleDeleteUser(w http.ResponseWriter, r *http.Request) {
 // write to the database.
 func (app *App) writeUser(
 	form forms.WriteUserForm,
-	dbWrite func(db *gorm.DB, user *models.User) (*models.User, error),
+	dbWrite repository.WriteUser,
 	w http.ResponseWriter,
 	r *http.Request,
 ) (*models.User, error) {
@@ -137,7 +136,7 @@ func (app *App) writeUser(
 	}
 
 	// handle write to the database
-	user, err := dbWrite(app.db, userModel)
+	user, err := dbWrite(userModel)
 
 	if err != nil {
 		app.handleErrorDataWrite(err, ErrUserDataWrite, w)

+ 1 - 0
server/api/user_handler_test.go

@@ -0,0 +1 @@
+package api_test