Skip to content

Commit

Permalink
Merge pull request #9 from RanchoCooper/feat/repo-transaction
Browse files Browse the repository at this point in the history
improve transaction implement
  • Loading branch information
RanchoCooper authored Dec 30, 2022
2 parents b7d8614 + 92d0a05 commit 29a6bbc
Show file tree
Hide file tree
Showing 8 changed files with 140 additions and 186 deletions.
62 changes: 29 additions & 33 deletions internal/adapter/repository/mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package repository
import (
"context"
"fmt"
buitin_log "log"
builtinLog "log"
"os"
"time"

Expand All @@ -23,30 +23,18 @@ import (
* @date 2021/12/21
*/

func buildGormConfig() *gorm.Config {
logger := gormLogger.New(
buitin_log.New(os.Stdout, "\r\n", buitin_log.LstdFlags), // io writer
gormLogger.Config{
SlowThreshold: time.Second, // Slow SQL threshold
LogLevel: gormLogger.Info, // Log level
IgnoreRecordNotFoundError: false, // Ignore ErrRecordNotFound error for logger
Colorful: true, // Disable color
},
)
// logger := zapgorm2.New(log.Logger)
// logger.SetAsDefault()
// logger.LogMode(gormLogger.Info)

return &gorm.Config{
NamingStrategy: schema.NamingStrategy{SingularTable: true},
Logger: logger,
}
}

type MySQL struct {
db *gorm.DB
}

func NewMySQLClient() *MySQL {
db, err := openGormDB()
if err != nil {
panic(err)
}
return &MySQL{db: db}
}

func (c *MySQL) GetDB(ctx context.Context) *gorm.DB {
return c.db.WithContext(ctx)
}
Expand All @@ -60,24 +48,24 @@ func (c *MySQL) Close(ctx context.Context) {
if sqlDB != nil {
err := sqlDB.Close()
if err != nil {
log.SugaredLogger.Errorf("close mysql client fail. err: %v", err)
log.SugaredLogger.Errorf("close MySQL fail. err: %v", err)
}
}
log.Logger.Info("mysql client closed")
log.Logger.Info("MySQL closed")
}

func (c *MySQL) MockClient() (*gorm.DB, sqlmock.Sqlmock) {
sqlDB, mock, err := sqlmock.New()
if err != nil {
panic("mock MySQL fail, err: " + err.Error())
}
dialector := driver.New(driver.Config{
dialect := driver.New(driver.Config{
Conn: sqlDB,
DriverName: "mysql-mock",
SkipInitializeWithVersion: true,
})

c.db, err = gorm.Open(dialector, buildGormConfig())
c.db, err = gorm.Open(dialect, buildGormConfig())

return c.db, mock
}
Expand All @@ -93,7 +81,7 @@ func openGormDB() (*gorm.DB, error) {
config.Config.MySQL.ParseTime,
config.Config.MySQL.TimeZone,
)
dialector = driver.New(driver.Config{
dialect = driver.New(driver.Config{
DSN: dsn,
DriverName: "mysql",
DefaultStringSize: 255,
Expand All @@ -111,8 +99,7 @@ func openGormDB() (*gorm.DB, error) {
})
)

db, err := gorm.Open(dialector, buildGormConfig())

db, err := gorm.Open(dialect, buildGormConfig())
if err != nil {
return nil, err
}
Expand All @@ -129,10 +116,19 @@ func openGormDB() (*gorm.DB, error) {
return db, nil
}

func NewMySQLClient() *MySQL {
db, err := openGormDB()
if err != nil {
panic(err)
func buildGormConfig() *gorm.Config {
logger := gormLogger.New(
builtinLog.New(os.Stdout, "\r\n", builtinLog.LstdFlags),
gormLogger.Config{
SlowThreshold: time.Second, // Slow SQL threshold
LogLevel: gormLogger.Info, // Log level
IgnoreRecordNotFoundError: false, // Ignore ErrRecordNotFound error for logger
Colorful: true, // Disable color
},
)

return &gorm.Config{
NamingStrategy: schema.NamingStrategy{SingularTable: true},
Logger: logger,
}
return &MySQL{db: db}
}
60 changes: 14 additions & 46 deletions internal/adapter/repository/mysql/entity/example.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"gorm.io/gorm"

"go-hexagonal/internal/adapter/repository"
"go-hexagonal/internal/adapter/repository/mysql"
"go-hexagonal/internal/domain/model"
"go-hexagonal/internal/domain/repo"
)
Expand All @@ -25,14 +24,13 @@ func NewExample() *Example {
}

type Example struct {
mysql.TransactionImpl `structs:"-"` // inheritance mysql transaction implement
Id int `json:"id" gorm:"primarykey" structs:",omitempty,underline"`
Name string `json:"name" structs:",omitempty,underline"`
Alias string `json:"alias" structs:",omitempty,underline"`
CreatedAt time.Time `json:"created_at" structs:",omitempty,underline"`
UpdatedAt time.Time `json:"updated_at" structs:",omitempty,underline"`
DeletedAt gorm.DeletedAt `json:"deleted_at" structs:",omitempty,underline"`
ChangeMap map[string]interface{} `json:"-" gorm:"-" structs:"-"`
Id int `json:"id" gorm:"primarykey" structs:",omitempty,underline"`
Name string `json:"name" structs:",omitempty,underline"`
Alias string `json:"alias" structs:",omitempty,underline"`
CreatedAt time.Time `json:"created_at" structs:",omitempty,underline"`
UpdatedAt time.Time `json:"updated_at" structs:",omitempty,underline"`
DeletedAt gorm.DeletedAt `json:"deleted_at" structs:",omitempty,underline"`
ChangeMap map[string]interface{} `json:"-" gorm:"-" structs:"-"`
}

func (e Example) TableName() string {
Expand All @@ -52,13 +50,7 @@ func (e *Example) Create(ctx context.Context, tr *repository.Transaction, model
return nil, errors.Wrap(err, "copier fail")
}

// conn db
db, err := e.ConnDB(ctx, tr)
if err != nil {
return nil, err
}

// handle sql
db := tr.Conn(ctx)
err = db.Create(entity).Error
if err != nil {
return nil, err
Expand All @@ -75,13 +67,7 @@ func (e *Example) Create(ctx context.Context, tr *repository.Transaction, model
func (e *Example) Delete(ctx context.Context, tr *repository.Transaction, id int) (err error) {
entity := &Example{}

// conn db
db, err := e.ConnDB(ctx, tr)
if err != nil {
return err
}

// handle sql
db := tr.Conn(ctx)
err = db.Delete(entity, id).Error
// hard delete
// err := tx.Unscoped().Delete(entity, Id).Error
Expand All @@ -97,29 +83,17 @@ func (e *Example) Update(ctx context.Context, tr *repository.Transaction, model
entity.ChangeMap = structs.Map(entity)
entity.ChangeMap["updated_at"] = time.Now()

// conn db
db, err := e.ConnDB(ctx, tr)
if err != nil {
return err
}

// handle sql
db.Table(entity.TableName()).Where("id = ? AND deleted_at IS NULL", entity.Id).Updates(entity.ChangeMap)
db := tr.Conn(ctx)
db = db.Table(entity.TableName()).Where("id = ? AND deleted_at IS NULL", entity.Id).Updates(entity.ChangeMap)

return db.Error
}

func (e *Example) GetByID(ctx context.Context, tr *repository.Transaction, id int) (domain *model.Example, err error) {
entity := &Example{}

// conn db
db, err := e.ConnDB(ctx, tr)
if err != nil {
return nil, err
}

// handle sql
db.Table(entity.TableName()).Find(entity, id)
db := tr.Conn(ctx)
db = db.Table(entity.TableName()).Find(entity, id)

if db.Error != nil {
return nil, err
Expand All @@ -136,13 +110,7 @@ func (e *Example) GetByID(ctx context.Context, tr *repository.Transaction, id in
func (e *Example) FindByName(ctx context.Context, tr *repository.Transaction, name string) (model *model.Example, err error) {
entity := &Example{}

// conn db
db, err := e.ConnDB(ctx, tr)
if err != nil {
return nil, err
}

// handle sql
db := tr.Conn(ctx)
db.Table(entity.TableName()).Where("name = ?", name).Last(entity)
if db.Error != nil {
return nil, err
Expand Down
12 changes: 7 additions & 5 deletions internal/adapter/repository/mysql/entity/example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (

"go-hexagonal/api/dto"
"go-hexagonal/internal/adapter/repository"
"go-hexagonal/internal/adapter/repository/mysql"
"go-hexagonal/internal/domain/model"
)

Expand Down Expand Up @@ -48,10 +47,13 @@ func TestExample_Create(t *testing.T) {
Name: "rancho",
Alias: "cooper",
}
tr := mysql.NewTransaction(ctx, &sql.TxOptions{
Isolation: sql.LevelReadUncommitted,
ReadOnly: false,
})
tr := repository.NewTransaction(ctx,
repository.MySQLStore,
&sql.TxOptions{
Isolation: sql.LevelReadUncommitted,
ReadOnly: false,
},
)
example, err := exampleRepo.Create(ctx, tr, e)
assert.NoError(t, err)
assert.NotEmpty(t, example.Id)
Expand Down
2 changes: 1 addition & 1 deletion internal/adapter/repository/mysql/entity/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func TestMain(m *testing.M) {
config.Init()
log.Init()

repository.Clients.MySQL = repository.NewMySQLClient()
repository.Init(repository.WithMySQL())
_ = repository.Clients.MySQL.GetDB(ctx).AutoMigrate(&Example{})
m.Run()
}
78 changes: 0 additions & 78 deletions internal/adapter/repository/mysql/transaction.go

This file was deleted.

11 changes: 5 additions & 6 deletions internal/adapter/repository/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ type Redis struct {
db *redis.Client
}

func NewRedisClient() *Redis {
return &Redis{db: newRedisConn()}
}

func (r *Redis) GetClient() *redis.Client {
return r.db
}
Expand All @@ -36,8 +40,7 @@ func (r *Redis) Close(ctx context.Context) {
log.Logger.Info("redis client closed")
}

func (r *Redis) MockClient() redismock.ClusterClientMock {
// FIXME unverified
func (r *Redis) MockClient() redismock.ClientMock {
db, mock := redismock.NewClientMock()
r.db = db
return mock
Expand All @@ -54,7 +57,3 @@ func newRedisConn() *redis.Client {
IdleTimeout: time.Duration(config.Config.Redis.IdleTimeout) * time.Second,
})
}

func NewRedisClient() *Redis {
return &Redis{db: newRedisConn()}
}
Loading

0 comments on commit 29a6bbc

Please sign in to comment.