diff --git a/internal/use-case/simgos-sync-use-case/division/case.go b/internal/use-case/simgos-sync-use-case/division/case.go index 14dd0886..699848e9 100644 --- a/internal/use-case/simgos-sync-use-case/division/case.go +++ b/internal/use-case/simgos-sync-use-case/division/case.go @@ -3,21 +3,24 @@ package division import ( pl "simrs-vx/pkg/logger" - dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" "gorm.io/gorm" + dualtx "simrs-vx/pkg/dualtrx-helper" + e "simrs-vx/internal/domain/main-entities/division" esimgos "simrs-vx/internal/domain/simgos-entities/division" - esync "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/division" + elog "simrs-vx/internal/domain/sync-entities/log" ) const source = "division" func Create(input e.CreateDto) (*d.Data, error) { var ( - txSync = dg.I.Begin() - txSimgos = dg.IS["simrs"].Begin() + sgData *esimgos.MUnit + syncLink *esync.DivisionLink + err error ) event := pl.Event{ @@ -28,31 +31,26 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - // STEP 1: Insert to simgos - sgData, err := CreateSimgosData(input, &event, txSimgos) + err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // STEP 1: Insert to simgos + sgData, err = CreateSimgosData(input, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 2: Insert to Link + syncLink, err = CreateLinkData(*input.Id, sgData.KodeUnit, &event, tx.Sync) + if err != nil { + return err + } + + return nil + }) + if err != nil { - return nil, err - } - - // STEP 2: Insert to Link - syncLink, err := CreateLinkData(*input.Id, sgData.KodeUnit, &event, txSync) - if err != nil { - txSimgos.Rollback() - return nil, err - } - - // STEP 3: Commit two trx - if err = txSync.Commit().Error; err != nil { - txSync.Rollback() - txSimgos.Rollback() - return nil, err - } - - if err = txSimgos.Commit().Error; err != nil { - // STEP 4: Rollback Partial - go func() { - _ = DeleteLinkData(syncLink, &event) - }() + if syncLink != nil { + go func() { _ = DeleteLinkData(syncLink, &event) }() + } return nil, err } @@ -67,7 +65,7 @@ func Create(input e.CreateDto) (*d.Data, error) { }, nil } -func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { +func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { event := pl.Event{ Feature: "Create", Source: source, @@ -76,14 +74,13 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - err := dg.I.Transaction(func(tx *gorm.DB) error { - // InsertSimxLog + tx := dualtx.NewTx() + err := tx.Sync.Transaction(func(tx *gorm.DB) error { + // Insert to Log if err := CreateLogData(input, &event, tx); err != nil { return err } - pl.SetLogInfo(&event, nil, "complete") - return nil }) @@ -103,11 +100,6 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - var ( - txSimgos = dg.IS["simrs"].Begin() - err error - ) - event := pl.Event{ Feature: "Update", Source: source, @@ -116,23 +108,21 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") - // STEP 1: Get Installation Link + // STEP 1: Get Link syncLink, err := ReadDetailLinkData(*input.Id, &event) if err != nil { return nil, err } - // Step 2: Update Simgos - err = UpdateSimgosData(input, syncLink, &event, txSimgos) - if err != nil { - return nil, err - } + tx := dualtx.NewTx() + err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // Step 2: Update Simgos + if err = UpdateSimgosData(input, syncLink, &event, tx); err != nil { + return err + } - // STEP 4: Commit two trx - if err = txSimgos.Commit().Error; err != nil { - txSimgos.Rollback() - return nil, err - } + return nil + }) pl.SetLogInfo(&event, nil, "complete") @@ -146,12 +136,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - var ( - txSync = dg.I.Begin() - txSimgos = dg.IS["simrs"].Begin() - sgData *esimgos.MUnit - err error - ) + var isLinkDeleted bool event := pl.Event{ Feature: "Delete", @@ -161,43 +146,41 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") - // STEP 1: Get Installation Link + // STEP 1: Get Link syncLink, err := ReadDetailLinkData(*input.Id, &event) if err != nil { return nil, err } // STEP 2: Get Simgos - sgData, err = ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) + sgData, err := ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) if err != nil { return nil, err } - // STEP 3: Delete M_Unit Simgos - err = HardDeleteSimgosData(sgData, &event, txSimgos) + err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // STEP 3: Delete Simgos + err = HardDeleteSimgosData(sgData, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 4: Delete Link + err = DeleteLinkData(syncLink, &event, tx.Sync) + if err != nil { + return err + } + + isLinkDeleted = true + return nil + }) + if err != nil { - return nil, err - } - - // STEP 4: Delete Installation Link - err = DeleteLinkData(syncLink, &event, txSync) - if err != nil { - txSimgos.Rollback() - return nil, err - } - - // STEP 4: Commit two trx - if err = txSync.Commit().Error; err != nil { - txSync.Rollback() - txSimgos.Rollback() - return nil, err - } - - if err = txSimgos.Commit().Error; err != nil { - // STEP 5: Rollback Partial - go func() { - _, _ = CreateLinkData(uint(*input.Id), sgData.KodeUnit, &event) - }() + if isLinkDeleted { + go func() { + _, _ = CreateLinkData(uint(*input.Id), sgData.KodeUnit, &event) + }() + } return nil, err } diff --git a/internal/use-case/simgos-sync-use-case/installation/case.go b/internal/use-case/simgos-sync-use-case/installation/case.go index c920fca1..f4b8d2b1 100644 --- a/internal/use-case/simgos-sync-use-case/installation/case.go +++ b/internal/use-case/simgos-sync-use-case/installation/case.go @@ -1,24 +1,27 @@ package installation import ( - dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" pl "simrs-vx/pkg/logger" "gorm.io/gorm" + dualtx "simrs-vx/pkg/dualtrx-helper" + e "simrs-vx/internal/domain/main-entities/installation" esimgos "simrs-vx/internal/domain/simgos-entities/installation" - esync "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/installation" + elog "simrs-vx/internal/domain/sync-entities/log" ) const source = "installation" func Create(input e.CreateDto) (*d.Data, error) { var ( - txSync = dg.I.Begin() - txSimgos = dg.IS["simrs"].Begin() + sgData *esimgos.MInstalasi + syncLink *esync.InstallationLink + err error ) event := pl.Event{ @@ -29,31 +32,26 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - // STEP 1: Insert to simgos - sgData, err := CreateSimgosData(input, &event, txSimgos) + err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // STEP 1: Insert to simgos + sgData, err = CreateSimgosData(input, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 2: Insert to Link + syncLink, err = CreateLinkData(*input.Id, sgData.No_Instalasi, &event, tx.Sync) + if err != nil { + return err + } + + return nil + }) + if err != nil { - return nil, err - } - - // STEP 2: Insert to Link - syncLink, err := CreateLinkData(*input.Id, sgData.No_Instalasi, &event, txSync) - if err != nil { - txSimgos.Rollback() - return nil, err - } - - // STEP 3: Commit two trx - if err = txSync.Commit().Error; err != nil { - txSync.Rollback() - txSimgos.Rollback() - return nil, err - } - - if err = txSimgos.Commit().Error; err != nil { - // STEP 4: Rollback Partial - go func() { - _ = DeleteLinkData(syncLink, &event) - }() + if syncLink != nil { + go func() { _ = DeleteLinkData(syncLink, &event) }() + } return nil, err } @@ -68,7 +66,7 @@ func Create(input e.CreateDto) (*d.Data, error) { }, nil } -func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { +func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { event := pl.Event{ Feature: "Create", Source: source, @@ -77,14 +75,13 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - err := dg.I.Transaction(func(tx *gorm.DB) error { - // InsertSimxLog + tx := dualtx.NewTx() + err := tx.Sync.Transaction(func(tx *gorm.DB) error { + // Insert to Log if err := CreateLogData(input, &event, tx); err != nil { return err } - pl.SetLogInfo(&event, nil, "complete") - return nil }) @@ -104,11 +101,6 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - var ( - txSimgos = dg.IS["simrs"].Begin() - err error - ) - event := pl.Event{ Feature: "Update", Source: source, @@ -117,23 +109,21 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") - // STEP 1: Get Installation Link + // STEP 1: Get Link syncLink, err := ReadDetailLinkData(*input.Id, &event) if err != nil { return nil, err } - // Step 2: Update Simgos - err = UpdateSimgosData(input, syncLink, &event, txSimgos) - if err != nil { - return nil, err - } + tx := dualtx.NewTx() + err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // Step 2: Update Simgos + if err = UpdateSimgosData(input, syncLink, &event, tx); err != nil { + return err + } - // STEP 4: Commit two trx - if err = txSimgos.Commit().Error; err != nil { - txSimgos.Rollback() - return nil, err - } + return nil + }) pl.SetLogInfo(&event, nil, "complete") @@ -147,12 +137,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - var ( - txSync = dg.I.Begin() - txSimgos = dg.IS["simrs"].Begin() - sgData *esimgos.MInstalasi - err error - ) + var isLinkDeleted bool event := pl.Event{ Feature: "Delete", @@ -162,43 +147,42 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") - // STEP 1: Get Installation Link + // STEP 1: Get Link syncLink, err := ReadDetailLinkData(*input.Id, &event) if err != nil { return nil, err } // STEP 2: Get Simgos - sgData, err = ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) + sgData, err := ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) if err != nil { return nil, err } - // STEP 3: Delete M_Instalation Simgos - err = SoftDeleteSimgosData(sgData, &event, txSimgos) + err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // STEP 3: Delete Simgos + err = SoftDeleteSimgosData(sgData, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 4: Delete Link + err = DeleteLinkData(syncLink, &event, tx.Sync) + if err != nil { + return err + } + + isLinkDeleted = true + return nil + }) + if err != nil { - return nil, err - } + if isLinkDeleted { + go func() { + _, _ = CreateLinkData(uint(*input.Id), sgData.No_Instalasi, &event) + }() + } - // STEP 4: Delete Installation Link - err = DeleteLinkData(syncLink, &event, txSync) - if err != nil { - txSimgos.Rollback() - return nil, err - } - - // STEP 4: Commit two trx - if err = txSync.Commit().Error; err != nil { - txSync.Rollback() - txSimgos.Rollback() - return nil, err - } - - if err = txSimgos.Commit().Error; err != nil { - // STEP 5: Rollback Partial - go func() { - _, _ = CreateLinkData(uint(*input.Id), sgData.No_Instalasi, &event) - }() return nil, err } diff --git a/internal/use-case/simgos-sync-use-case/specialist/case.go b/internal/use-case/simgos-sync-use-case/specialist/case.go index 4e6de31d..58da2a2f 100644 --- a/internal/use-case/simgos-sync-use-case/specialist/case.go +++ b/internal/use-case/simgos-sync-use-case/specialist/case.go @@ -3,21 +3,24 @@ package specialist import ( pl "simrs-vx/pkg/logger" - dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" "gorm.io/gorm" + dualtx "simrs-vx/pkg/dualtrx-helper" + e "simrs-vx/internal/domain/main-entities/specialist" esimgos "simrs-vx/internal/domain/simgos-entities/specialist" - esync "simrs-vx/internal/domain/sync-entities/log" + elog "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/specialist" ) const source = "specialist" func Create(input e.CreateDto) (*d.Data, error) { var ( - txSync = dg.I.Begin() - txSimgos = dg.IS["simrs"].Begin() + sgData *esimgos.MPolihfis + syncLink *esync.SpecialistLink + err error ) event := pl.Event{ @@ -28,34 +31,28 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - // STEP 1: Insert to simgos - sgData, err := CreateSimgosData(input, &event, txSimgos) + err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // STEP 1: Insert to simgos + sgData, err = CreateSimgosData(input, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 2: Insert to Link + syncLink, err = CreateLinkData(*input.Id, sgData.Id, &event, tx.Sync) + if err != nil { + return err + } + + return nil + }) + if err != nil { + if syncLink != nil { + go func() { _ = DeleteLinkData(syncLink, &event) }() + } return nil, err } - - // STEP 2: Insert to Link - syncLink, err := CreateLinkData(*input.Id, sgData.Id, &event, txSync) - if err != nil { - txSimgos.Rollback() - return nil, err - } - - // STEP 3: Commit two trx - if err = txSync.Commit().Error; err != nil { - txSync.Rollback() - txSimgos.Rollback() - return nil, err - } - - if err = txSimgos.Commit().Error; err != nil { - // STEP 4: Rollback Partial - go func() { - _ = DeleteLinkData(syncLink, &event) - }() - return nil, err - } - pl.SetLogInfo(&event, nil, "complete") return &d.Data{ @@ -67,7 +64,7 @@ func Create(input e.CreateDto) (*d.Data, error) { }, nil } -func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { +func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { event := pl.Event{ Feature: "Create", Source: source, @@ -76,14 +73,13 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - err := dg.I.Transaction(func(tx *gorm.DB) error { - // InsertSimxLog + tx := dualtx.NewTx() + err := tx.Sync.Transaction(func(tx *gorm.DB) error { + // Insert to Log if err := CreateLogData(input, &event, tx); err != nil { return err } - pl.SetLogInfo(&event, nil, "complete") - return nil }) @@ -103,11 +99,6 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - var ( - txSimgos = dg.IS["simrs"].Begin() - err error - ) - event := pl.Event{ Feature: "Update", Source: source, @@ -122,17 +113,16 @@ func Update(input e.UpdateDto) (*d.Data, error) { return nil, err } - // Step 2: Update Simgos - err = UpdateSimgosData(input, syncLink, &event, txSimgos) - if err != nil { - return nil, err - } + tx := dualtx.NewTx() + err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // Step 2: Update Simgos + err = UpdateSimgosData(input, syncLink, &event, tx) + if err != nil { + return err + } - // STEP 4: Commit two trx - if err = txSimgos.Commit().Error; err != nil { - txSimgos.Rollback() - return nil, err - } + return nil + }) pl.SetLogInfo(&event, nil, "complete") @@ -146,12 +136,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - var ( - txSync = dg.I.Begin() - txSimgos = dg.IS["simrs"].Begin() - sgData *esimgos.MPolihfis - err error - ) + var isLinkDeleted bool event := pl.Event{ Feature: "Delete", @@ -161,43 +146,41 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") - // STEP 1: Get Installation Link + // STEP 1: Get Link syncLink, err := ReadDetailLinkData(*input.Id, &event) if err != nil { return nil, err } // STEP 2: Get Simgos - sgData, err = ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) + sgData, err := ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) if err != nil { return nil, err } - // STEP 3: Delete M_Unit Simgos - err = HardDeleteSimgosData(sgData, &event, txSimgos) + err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // STEP 3: Delete Simgos + err = HardDeleteSimgosData(sgData, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 4: Delete Link + err = DeleteLinkData(syncLink, &event, tx.Sync) + if err != nil { + return err + } + + isLinkDeleted = true + return nil + }) + if err != nil { - return nil, err - } - - // STEP 4: Delete Installation Link - err = DeleteLinkData(syncLink, &event, txSync) - if err != nil { - txSimgos.Rollback() - return nil, err - } - - // STEP 4: Commit two trx - if err = txSync.Commit().Error; err != nil { - txSync.Rollback() - txSimgos.Rollback() - return nil, err - } - - if err = txSimgos.Commit().Error; err != nil { - // STEP 5: Rollback Partial - go func() { - _, _ = CreateLinkData(uint(*input.Id), sgData.Id, &event) - }() + if isLinkDeleted { + go func() { + _, _ = CreateLinkData(uint(*input.Id), sgData.Id, &event) + }() + } return nil, err } diff --git a/internal/use-case/simgos-sync-use-case/subspecialist/case.go b/internal/use-case/simgos-sync-use-case/subspecialist/case.go index e16d50bd..50b6c09b 100644 --- a/internal/use-case/simgos-sync-use-case/subspecialist/case.go +++ b/internal/use-case/simgos-sync-use-case/subspecialist/case.go @@ -1,23 +1,25 @@ package subspecialist import ( + dualtx "simrs-vx/pkg/dualtrx-helper" pl "simrs-vx/pkg/logger" - dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" "gorm.io/gorm" e "simrs-vx/internal/domain/main-entities/subspecialist" //esimgos "simrs-vx/internal/domain/simgos-entities/specialist" - esync "simrs-vx/internal/domain/sync-entities/log" + elog "simrs-vx/internal/domain/sync-entities/log" + //esync "simrs-vx/internal/domain/sync-entities/subspecialist" ) const source = "subspecialist" func Create(input e.CreateDto) (*d.Data, error) { //var ( - // txSync = dg.I.Begin() - // txSimgos = dg.IS["simrs"].Begin() + // sgData *esimgos.MUnit + // syncLink *esync.SubspecialistLink + // err error //) event := pl.Event{ @@ -28,31 +30,26 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - //// STEP 1: Insert to simgos - //sgData, err := CreateSimgosData(input, &event, txSimgos) + //err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // // STEP 1: Insert to simgos + // sgData, err = CreateSimgosData(input, &event, tx.Simgos) + // if err != nil { + // return err + // } + // + // // STEP 2: Insert to Link + // syncLink, err = CreateLinkData(*input.Id, sgData.KodeUnit, &event, tx.Sync) + // if err != nil { + // return err + // } + // + // return nil + //}) + // //if err != nil { - // return nil, err - //} - // - //// STEP 2: Insert to Link - //syncLink, err := CreateLinkData(*input.Id, sgData.Id, &event, txSync) - //if err != nil { - // txSimgos.Rollback() - // return nil, err - //} - // - //// STEP 3: Commit two trx - //if err = txSync.Commit().Error; err != nil { - // txSync.Rollback() - // txSimgos.Rollback() - // return nil, err - //} - // - //if err = txSimgos.Commit().Error; err != nil { - // // STEP 4: Rollback Partial - // go func() { - // _ = DeleteLinkData(syncLink, &event) - // }() + // if syncLink != nil { + // go func() { _ = DeleteLinkData(syncLink, &event) }() + // } // return nil, err //} @@ -67,7 +64,7 @@ func Create(input e.CreateDto) (*d.Data, error) { }, nil } -func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { +func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { event := pl.Event{ Feature: "Create", Source: source, @@ -76,8 +73,9 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - err := dg.I.Transaction(func(tx *gorm.DB) error { - // InsertSimxLog + tx := dualtx.NewTx() + err := tx.Sync.Transaction(func(tx *gorm.DB) error { + // Insert to Log if err := CreateLogData(input, &event, tx); err != nil { return err } @@ -103,11 +101,6 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - //var ( - // txSimgos = dg.IS["simrs"].Begin() - // err error - //) - event := pl.Event{ Feature: "Update", Source: source, @@ -116,23 +109,21 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") - //// STEP 1: Get Installation Link + //// STEP 1: Get Link //syncLink, err := ReadDetailLinkData(*input.Id, &event) //if err != nil { // return nil, err //} // - //// Step 2: Update Simgos - //err = UpdateSimgosData(input, syncLink, &event, txSimgos) - //if err != nil { - // return nil, err - //} + //tx := dualtx.NewTx() + //err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // // Step 2: Update Simgos + // if err = UpdateSimgosData(input, syncLink, &event, tx); err != nil { + // return err + // } // - //// STEP 4: Commit two trx - //if err = txSimgos.Commit().Error; err != nil { - // txSimgos.Rollback() - // return nil, err - //} + // return nil + //}) pl.SetLogInfo(&event, nil, "complete") @@ -146,12 +137,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - //var ( - // txSync = dg.I.Begin() - // txSimgos = dg.IS["simrs"].Begin() - // sgData *esimgos.MPolihfis - // err error - //) + //var isLinkDeleted bool event := pl.Event{ Feature: "Delete", @@ -161,43 +147,41 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") - //// STEP 1: Get Installation Link + //// STEP 1: Get Link //syncLink, err := ReadDetailLinkData(*input.Id, &event) //if err != nil { // return nil, err //} // //// STEP 2: Get Simgos - //sgData, err = ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) + //sgData, err := ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) //if err != nil { // return nil, err //} // - //// STEP 3: Delete M_Unit Simgos - //err = HardDeleteSimgosData(sgData, &event, txSimgos) + //err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // // STEP 3: Delete Simgos + // err = HardDeleteSimgosData(sgData, &event, tx.Simgos) + // if err != nil { + // return err + // } + // + // // STEP 4: Delete Link + // err = DeleteLinkData(syncLink, &event, tx.Sync) + // if err != nil { + // return err + // } + // + // isLinkDeleted = true + // return nil + //}) + // //if err != nil { - // return nil, err - //} - // - //// STEP 4: Delete Installation Link - //err = DeleteLinkData(syncLink, &event, txSync) - //if err != nil { - // txSimgos.Rollback() - // return nil, err - //} - // - //// STEP 4: Commit two trx - //if err = txSync.Commit().Error; err != nil { - // txSync.Rollback() - // txSimgos.Rollback() - // return nil, err - //} - // - //if err = txSimgos.Commit().Error; err != nil { - // // STEP 5: Rollback Partial - // go func() { - // _, _ = CreateLinkData(uint(*input.Id), sgData.Id, &event) - // }() + // if isLinkDeleted { + // go func() { + // _, _ = CreateLinkData(uint(*input.Id), sgData.KodeUnit, &event) + // }() + // } // return nil, err //} diff --git a/internal/use-case/simgos-sync-use-case/unit/case.go b/internal/use-case/simgos-sync-use-case/unit/case.go index bb87f1c6..42094d22 100644 --- a/internal/use-case/simgos-sync-use-case/unit/case.go +++ b/internal/use-case/simgos-sync-use-case/unit/case.go @@ -3,21 +3,24 @@ package unit import ( pl "simrs-vx/pkg/logger" - dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" "gorm.io/gorm" + dualtx "simrs-vx/pkg/dualtrx-helper" + e "simrs-vx/internal/domain/main-entities/unit" esimgos "simrs-vx/internal/domain/simgos-entities/unit" - esync "simrs-vx/internal/domain/sync-entities/log" + elog "simrs-vx/internal/domain/sync-entities/log" + esync "simrs-vx/internal/domain/sync-entities/unit" ) const source = "unit" func Create(input e.CreateDto) (*d.Data, error) { var ( - txSync = dg.I.Begin() - txSimgos = dg.IS["simrs"].Begin() + sgData *esimgos.MPloy + syncLink *esync.UnitLink + err error ) event := pl.Event{ @@ -28,31 +31,26 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - // STEP 1: Insert to simgos - sgData, err := CreateSimgosData(input, &event, txSimgos) + err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // STEP 1: Insert to simgos + sgData, err = CreateSimgosData(input, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 2: Insert to Link + syncLink, err = CreateLinkData(*input.Id, sgData.Kode, &event, tx.Sync) + if err != nil { + return err + } + + return nil + }) + if err != nil { - return nil, err - } - - // STEP 2: Insert to Link - syncLink, err := CreateLinkData(*input.Id, sgData.Kode, &event, txSync) - if err != nil { - txSimgos.Rollback() - return nil, err - } - - // STEP 3: Commit two trx - if err = txSync.Commit().Error; err != nil { - txSync.Rollback() - txSimgos.Rollback() - return nil, err - } - - if err = txSimgos.Commit().Error; err != nil { - // STEP 4: Rollback Partial - go func() { - _ = DeleteLinkData(syncLink, &event) - }() + if syncLink != nil { + go func() { _ = DeleteLinkData(syncLink, &event) }() + } return nil, err } @@ -67,7 +65,7 @@ func Create(input e.CreateDto) (*d.Data, error) { }, nil } -func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { +func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { event := pl.Event{ Feature: "Create", Source: source, @@ -76,14 +74,13 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - err := dg.I.Transaction(func(tx *gorm.DB) error { - // InsertSimxLog + tx := dualtx.NewTx() + err := tx.Sync.Transaction(func(tx *gorm.DB) error { + // Insert to Log if err := CreateLogData(input, &event, tx); err != nil { return err } - pl.SetLogInfo(&event, nil, "complete") - return nil }) @@ -103,11 +100,6 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - var ( - txSimgos = dg.IS["simrs"].Begin() - err error - ) - event := pl.Event{ Feature: "Update", Source: source, @@ -122,17 +114,16 @@ func Update(input e.UpdateDto) (*d.Data, error) { return nil, err } - // Step 2: Update Simgos - err = UpdateSimgosData(input, syncLink, &event, txSimgos) - if err != nil { - return nil, err - } + tx := dualtx.NewTx() + err = tx.Simgos.Transaction(func(tx *gorm.DB) error { + // Step 2: Update Simgos + err = UpdateSimgosData(input, syncLink, &event, tx) + if err != nil { + return err + } - // STEP 4: Commit two trx - if err = txSimgos.Commit().Error; err != nil { - txSimgos.Rollback() - return nil, err - } + return nil + }) pl.SetLogInfo(&event, nil, "complete") @@ -146,12 +137,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - var ( - txSync = dg.I.Begin() - txSimgos = dg.IS["simrs"].Begin() - sgData *esimgos.MPloy - err error - ) + var isLinkDeleted bool event := pl.Event{ Feature: "Delete", @@ -168,36 +154,34 @@ func Delete(input e.DeleteDto) (*d.Data, error) { } // STEP 2: Get Simgos - sgData, err = ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) + sgData, err := ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) if err != nil { return nil, err } - // STEP 3: Delete M_Poly Simgos - err = HardDeleteSimgosData(sgData, &event, txSimgos) + err = dualtx.WithDualTx(func(tx *dualtx.Dualtx) error { + // STEP 3: Delete M_Poly Simgos + err = HardDeleteSimgosData(sgData, &event, tx.Simgos) + if err != nil { + return err + } + + // STEP 4: Delete Installation Link + err = DeleteLinkData(syncLink, &event, tx.Sync) + if err != nil { + return err + } + + isLinkDeleted = true + return nil + }) + if err != nil { - return nil, err - } - - // STEP 4: Delete Installation Link - err = DeleteLinkData(syncLink, &event, txSync) - if err != nil { - txSimgos.Rollback() - return nil, err - } - - // STEP 4: Commit two trx - if err = txSync.Commit().Error; err != nil { - txSync.Rollback() - txSimgos.Rollback() - return nil, err - } - - if err = txSimgos.Commit().Error; err != nil { - // STEP 5: Rollback Partial - go func() { - _, _ = CreateLinkData(uint(*input.Id), sgData.Kode, &event) - }() + if isLinkDeleted { + go func() { + _, _ = CreateLinkData(uint(*input.Id), sgData.Kode, &event) + }() + } return nil, err } diff --git a/pkg/dualtrx-helper/dualtrx-helper.go b/pkg/dualtrx-helper/dualtrx-helper.go new file mode 100644 index 00000000..2f16203c --- /dev/null +++ b/pkg/dualtrx-helper/dualtrx-helper.go @@ -0,0 +1,66 @@ +package dualtrx_helper + +import ( + dg "github.com/karincake/apem/db-gorm-pg" + "gorm.io/gorm" +) + +type Dualtx struct { + Sync *gorm.DB + Simgos *gorm.DB +} + +func NewDualtx() *Dualtx { + return &Dualtx{ + Sync: dg.I.Begin(), + Simgos: dg.IS["simrs"].Begin(), + } +} + +func NewTx() *Dualtx { + return &Dualtx{ + Sync: dg.I, + Simgos: dg.IS["simrs"], + } +} + +func (t *Dualtx) Commit() error { + if err := t.Sync.Commit().Error; err != nil { + return err + } + + if err := t.Simgos.Commit().Error; err != nil { + return err + } + return nil +} + +func (t *Dualtx) Rollback() { + t.Sync.Rollback() + t.Simgos.Rollback() +} + +type DualTxFunc func(tx *Dualtx) error + +func WithDualTx(fn DualTxFunc) error { + var ( + tx = NewDualtx() + err error + ) + + defer func() { + if err != nil { + tx.Rollback() + } + }() + + if err = fn(tx); err != nil { + return err + } + + if err = tx.Commit(); err != nil { + return err + } + + return nil +}