Skip to content

Commit

Permalink
Add UnitOfWork for all databases
Browse files Browse the repository at this point in the history
Signed-off-by: Masudur Rahman <masudjuly02@gmail.com>
  • Loading branch information
masudur-rahman committed Apr 3, 2024
1 parent 7a8a9db commit 248372e
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 0 deletions.
17 changes: 17 additions & 0 deletions sql/postgres/postgres_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ func TestPostgres_FindOne(t *testing.T) {
db, closer := initializeDB(t)
defer closer()

db, err := db.BeginTx()
assert.Nil(t, err)
defer func() {
err = db.Commit()
assert.Nil(t, err)
}()

user := TestUser{}
db = db.Table("test_user")

Expand Down Expand Up @@ -93,10 +100,13 @@ func TestPostgres_FindMany(t *testing.T) {
func TestPostgres_InsertOne(t *testing.T) {
db, closer := initializeDB(t)
defer closer()
db, err := db.BeginTx()
assert.Nil(t, err)

db = db.Table("test_user")
t.Run("insert data", func(t *testing.T) {
suffix := xid.New().String()
//suffix := "hello"
user := TestUser{
Name: "test-" + suffix,
FullName: "Test Name",
Expand All @@ -105,6 +115,13 @@ func TestPostgres_InsertOne(t *testing.T) {
id, err := db.InsertOne(&user)
assert.Nil(t, err)
assert.NotEqual(t, 0, id)
if err != nil {
err = db.Rollback()
assert.Nil(t, err)
}

err = db.Commit()
assert.Nil(t, err)
})
}

Expand Down
51 changes: 51 additions & 0 deletions uow.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package database

import (
"github.com/masudur-rahman/database/nosql"
"github.com/masudur-rahman/database/sql"
)

// UnitOfWork represents the unit of work for coordinating transactions
type UnitOfWork struct {
SQL sql.Database
NoSQL nosql.Database
}

// Begin starts a new transaction
func (uow UnitOfWork) Begin() (UnitOfWork, error) {
cp := UnitOfWork{
SQL: uow.SQL,
NoSQL: uow.NoSQL,
}
if uow.SQL != nil {
sqlTx, err := uow.SQL.BeginTx()
if err != nil {
return UnitOfWork{}, err
}
cp.SQL = sqlTx
}
// For NoSQL databases, no action needed for beginning a transaction
return cp, nil
}

// Commit commits the transaction
func (uow UnitOfWork) Commit() error {
if uow.SQL != nil {
if err := uow.SQL.Commit(); err != nil {
return err
}
}
// For NoSQL databases, no action needed for committing a transaction
return nil
}

// Rollback rolls back the transaction
func (uow UnitOfWork) Rollback() error {
if uow.SQL != nil {
if err := uow.SQL.Rollback(); err != nil {
return err
}
}
// For NoSQL databases, no action needed for rolling back a transaction
return nil
}

0 comments on commit 248372e

Please sign in to comment.