From 8911bb678c411b16245a5a0d3ef763c60c67700b Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 17 Nov 2025 16:17:26 +0700 Subject: [PATCH] add divisi --- internal/domain/main-entities/division/dto.go | 1 + .../use-case/main-use-case/division/case.go | 97 +++++---- .../division/middleware-runner.go | 38 +++- .../main-use-case/division/middleware.go | 23 ++- .../main-use-case/division/tycovar.go | 31 ++- .../main-use-case/unit/middleware-runner.go | 4 +- .../simgos-sync-plugin/division/plugin.go | 56 +++-- .../simgos-sync-plugin/installation/plugin.go | 54 +++-- .../simgos-sync-plugin/unit/plugin.go | 54 +++-- .../simgos-sync-use-case/division/case.go | 194 +++++++++--------- .../simgos-sync-use-case/division/helper.go | 30 ++- .../simgos-sync-use-case/division/lib.go | 176 ++++++++-------- 12 files changed, 431 insertions(+), 327 deletions(-) diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index 30f0b238..d74b54f7 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -6,6 +6,7 @@ import ( ) type CreateDto struct { + Id *uint `json:"id"` Code string `json:"code" validate:"maxLength=10"` Name string `json:"name" validate:"maxLength=50"` Parent_Code *string `json:"parent_code"` diff --git a/internal/use-case/main-use-case/division/case.go b/internal/use-case/main-use-case/division/case.go index c955aed7..4be7ce82 100644 --- a/internal/use-case/main-use-case/division/case.go +++ b/internal/use-case/main-use-case/division/case.go @@ -2,6 +2,8 @@ package division import ( e "simrs-vx/internal/domain/main-entities/division" + erc "simrs-vx/internal/domain/references/common" + esync "simrs-vx/internal/domain/sync-entities/log" "strconv" dg "github.com/karincake/apem/db-gorm-pg" @@ -25,36 +27,32 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") + mwRunner := newMiddlewareRunner(&event) err := dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { - return err - } - if resData, err := CreateData(input, &event, tx); err != nil { return err } else { data = *resData + id := uint(data.Id) + input.Id = &id } - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input); err != nil { return err } - pl.SetLogInfo(&event, nil, "complete") - return nil }) - if err != nil { + if err = runLogMiddleware(err, input, mwRunner); err != nil { return nil, err } + pl.SetLogInfo(&event, nil, "complete") + return &d.Data{ Meta: d.II{ "source": source, @@ -80,7 +78,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readList") err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event, tx) + mwRunner := newMiddlewareRunner(&event) mwRunner.setMwType(pu.MWTPre) // Run pre-middleware if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { @@ -131,7 +129,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "readDetail") err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event, tx) + mwRunner := newMiddlewareRunner(&event) mwRunner.setMwType(pu.MWTPre) // Run pre-middleware if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { @@ -177,6 +175,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") + mwRunner := newMiddlewareRunner(&event) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -184,32 +183,26 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { - return err - } - + input.Id = &data.Id if err := UpdateData(input, data, &event, tx); err != nil { return err } - pl.SetLogInfo(&event, nil, "complete") - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(updatePreMw, &input); err != nil { return err } return nil }) - if err != nil { + if err = runLogMiddleware(err, input, mwRunner); err != nil { return nil, err } + pl.SetLogInfo(&event, nil, "complete") + return &d.Data{ Meta: d.IS{ "source": source, @@ -233,6 +226,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") + mwRunner := newMiddlewareRunner(&event) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -240,30 +234,26 @@ func Delete(input e.DeleteDto) (*d.Data, error) { return err } - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { - return err - } - + input.Id = &data.Id if err := DeleteData(data, &event, tx); err != nil { return err } - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(deletePreMw, &input); err != nil { return err } return nil }) - if err != nil { + if err = runLogMiddleware(err, input, mwRunner); err != nil { return nil, err } + pl.SetLogInfo(&event, nil, "complete") + return &d.Data{ Meta: d.IS{ "source": source, @@ -274,3 +264,32 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error { + var errMsg string + inputLog := esync.SimxLogDto{ + Payload: input, + Method: erc.CCCreate, + } + + if err != nil { + // Run log-middleware + errMsg = err.Error() + inputLog.ErrMessage = &errMsg + inputLog.IsSuccess = false + + // create log failed + if errMiddleware := mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); errMiddleware != nil { + return errMiddleware + } + return err + } + + // create log success + inputLog.IsSuccess = true + if err = mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); err != nil { + return err + } + + return nil +} diff --git a/internal/use-case/main-use-case/division/middleware-runner.go b/internal/use-case/main-use-case/division/middleware-runner.go index 915cce28..b39e3176 100644 --- a/internal/use-case/main-use-case/division/middleware-runner.go +++ b/internal/use-case/main-use-case/division/middleware-runner.go @@ -2,6 +2,7 @@ package division import ( e "simrs-vx/internal/domain/main-entities/division" + esync "simrs-vx/internal/domain/sync-entities/log" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -15,21 +16,36 @@ type middlewareRunner struct { } // NewMiddlewareExecutor creates a new middleware executor -func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { +func newMiddlewareRunner(event *pl.Event) *middlewareRunner { return &middlewareRunner{ Event: event, - Tx: tx, } } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Division) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto) error { for _, middleware := range middlewares { - logData := pu.GetLogData(input, data) + logData := pu.GetLogData(input, nil) pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - if err := middleware.Func(input, data, me.Tx); err != nil { + if err := middleware.Func(input); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +// ExecuteCreateMiddleware executes createlog middleware +func (me *middlewareRunner) RunCreateLogMiddleware(middlewares []createLogMw, input *esync.SimxLogDto) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, nil) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input); err != nil { return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) } @@ -68,13 +84,13 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Division) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []updateMw, input *e.UpdateDto) error { for _, middleware := range middlewares { - logData := pu.GetLogData(input, data) + logData := pu.GetLogData(input, nil) pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - if err := middleware.Func(input, data, me.Tx); err != nil { + if err := middleware.Func(input); err != nil { return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) } @@ -83,13 +99,13 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Division) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []deleteMw, input *e.DeleteDto) error { for _, middleware := range middlewares { - logData := pu.GetLogData(input, data) + logData := pu.GetLogData(input, nil) pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - if err := middleware.Func(input, data, me.Tx); err != nil { + if err := middleware.Func(input); err != nil { return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) } diff --git a/internal/use-case/main-use-case/division/middleware.go b/internal/use-case/main-use-case/division/middleware.go index f066ffb8..317b137a 100644 --- a/internal/use-case/main-use-case/division/middleware.go +++ b/internal/use-case/main-use-case/division/middleware.go @@ -1,9 +1,20 @@ package division +import ( + plugin "simrs-vx/internal/use-case/simgos-sync-plugin/division" +) + // example of middleware -// func init() { -// createPreMw = append(createPreMw, -// CreateMw{Name: "modif-input", Func: pm.ModifInput}, -// CreateMw{Name: "check-data", Func: pm.CheckData}, -// ) -// } +func init() { + createPreMw = append(createPreMw, + createMw{Name: "create-unit", Func: plugin.Create}) + + createSimxLogMw = append(createSimxLogMw, + createLogMw{Name: "create-log", Func: plugin.CreateLog}) + + updatePreMw = append(updatePreMw, + updateMw{Name: "update-unit", Func: plugin.Update}) + + deletePreMw = append(deletePreMw, + deleteMw{Name: "delete-unit", Func: plugin.Delete}) +} diff --git a/internal/use-case/main-use-case/division/tycovar.go b/internal/use-case/main-use-case/division/tycovar.go index c7733117..cef873ee 100644 --- a/internal/use-case/main-use-case/division/tycovar.go +++ b/internal/use-case/main-use-case/division/tycovar.go @@ -12,11 +12,27 @@ import ( "gorm.io/gorm" e "simrs-vx/internal/domain/main-entities/division" + elog "simrs-vx/internal/domain/sync-entities/log" ) type createMw struct { Name string - Func func(input *e.CreateDto, data *e.Division, tx *gorm.DB) error + Func func(input *e.CreateDto) error +} + +type createLogMw struct { + Name string + Func func(input *elog.SimxLogDto) error +} + +type updateMw struct { + Name string + Func func(input *e.UpdateDto) error +} + +type deleteMw struct { + Name string + Func func(input *e.DeleteDto) error } type readListMw struct { @@ -29,16 +45,17 @@ type readDetailMw struct { Func func(input *e.ReadDetailDto, data *e.Division, tx *gorm.DB) error } -type UpdateMw = readDetailMw -type DeleteMw = readDetailMw +type UpdateMw = updateMw +type DeleteMw = deleteMw -var createPreMw []createMw // preprocess middleware -var createPostMw []createMw // postprocess middleware +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var createSimxLogMw []createLogMw var readListPreMw []readListMw // .. var readListPostMw []readListMw // .. var readDetailPreMw []readDetailMw var readDetailPostMw []readDetailMw -var updatePreMw []readDetailMw +var updatePreMw []updateMw var updatePostMw []readDetailMw -var deletePreMw []readDetailMw +var deletePreMw []deleteMw var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/unit/middleware-runner.go b/internal/use-case/main-use-case/unit/middleware-runner.go index 3c7fa241..f45fe208 100644 --- a/internal/use-case/main-use-case/unit/middleware-runner.go +++ b/internal/use-case/main-use-case/unit/middleware-runner.go @@ -84,7 +84,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []UpdateMw, input *e.UpdateDto) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []updateMw, input *e.UpdateDto) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, nil) @@ -99,7 +99,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []UpdateMw, input *e return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []DeleteMw, input *e.DeleteDto) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []deleteMw, input *e.DeleteDto) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, nil) diff --git a/internal/use-case/simgos-sync-plugin/division/plugin.go b/internal/use-case/simgos-sync-plugin/division/plugin.go index 06e54e31..54c1403c 100644 --- a/internal/use-case/simgos-sync-plugin/division/plugin.go +++ b/internal/use-case/simgos-sync-plugin/division/plugin.go @@ -9,8 +9,10 @@ import ( sync "simrs-vx/internal/infra/sync-cfg" - e "simrs-vx/internal/domain/main-entities/unit" + e "simrs-vx/internal/domain/main-entities/division" elog "simrs-vx/internal/domain/sync-entities/log" + + d "github.com/karincake/dodol" ) func Create(input *e.CreateDto) error { @@ -34,15 +36,18 @@ func Create(input *e.CreateDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -68,15 +73,18 @@ func CreateLog(input *elog.SimxLogDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -102,15 +110,18 @@ func Update(input *e.UpdateDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -136,15 +147,18 @@ func Delete(input *e.DeleteDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } diff --git a/internal/use-case/simgos-sync-plugin/installation/plugin.go b/internal/use-case/simgos-sync-plugin/installation/plugin.go index 06c9bebe..f2495139 100644 --- a/internal/use-case/simgos-sync-plugin/installation/plugin.go +++ b/internal/use-case/simgos-sync-plugin/installation/plugin.go @@ -11,6 +11,8 @@ import ( e "simrs-vx/internal/domain/main-entities/installation" elog "simrs-vx/internal/domain/sync-entities/log" + + d "github.com/karincake/dodol" ) func Create(input *e.CreateDto) error { @@ -34,15 +36,18 @@ func Create(input *e.CreateDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -68,15 +73,18 @@ func CreateLog(input *elog.SimxLogDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -102,15 +110,18 @@ func Update(input *e.UpdateDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -136,15 +147,18 @@ func Delete(input *e.DeleteDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } diff --git a/internal/use-case/simgos-sync-plugin/unit/plugin.go b/internal/use-case/simgos-sync-plugin/unit/plugin.go index 8462f18d..e854d898 100644 --- a/internal/use-case/simgos-sync-plugin/unit/plugin.go +++ b/internal/use-case/simgos-sync-plugin/unit/plugin.go @@ -11,6 +11,8 @@ import ( e "simrs-vx/internal/domain/main-entities/unit" elog "simrs-vx/internal/domain/sync-entities/log" + + d "github.com/karincake/dodol" ) func Create(input *e.CreateDto) error { @@ -34,15 +36,18 @@ func Create(input *e.CreateDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -68,15 +73,18 @@ func CreateLog(input *elog.SimxLogDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -102,15 +110,18 @@ func Update(input *e.UpdateDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } @@ -136,15 +147,18 @@ func Delete(input *e.DeleteDto) error { } defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf(resp.Status) - } - - _, err = io.ReadAll(resp.Body) + bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return err } + if resp.StatusCode != http.StatusOK { + errors := d.FieldError{} + _ = json.Unmarshal(bodyBytes, &errors) + + return fmt.Errorf(errors.Message) + } + return nil } 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 074bf2a7..14dd0886 100644 --- a/internal/use-case/simgos-sync-use-case/division/case.go +++ b/internal/use-case/simgos-sync-use-case/division/case.go @@ -8,17 +8,17 @@ import ( "gorm.io/gorm" e "simrs-vx/internal/domain/main-entities/division" + esimgos "simrs-vx/internal/domain/simgos-entities/division" esync "simrs-vx/internal/domain/sync-entities/log" - //esimgos "simrs-vx/internal/domain/simgos-entities/installation" ) const source = "division" func Create(input e.CreateDto) (*d.Data, error) { - //var ( - // txSync = dg.I.Begin() - // txSimgos = dg.IS["simrs"].Begin() - //) + var ( + txSync = dg.I.Begin() + txSimgos = dg.IS["simrs"].Begin() + ) event := pl.Event{ Feature: "Create", @@ -29,32 +29,32 @@ func Create(input e.CreateDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "create") // STEP 1: Insert to simgos - //sgData, err := CreateSimgosData(input, &event, txSimgos) - //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) - // }() - // return nil, err - //} + sgData, err := CreateSimgosData(input, &event, txSimgos) + 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) + }() + return nil, err + } pl.SetLogInfo(&event, nil, "complete") @@ -103,10 +103,10 @@ func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - //var ( - // txSimgos = dg.IS["simrs"].Begin() - // err error - //) + var ( + txSimgos = dg.IS["simrs"].Begin() + err error + ) event := pl.Event{ Feature: "Update", @@ -116,23 +116,23 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") - //// STEP 1: Get Installation 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 - //} - // - //// STEP 4: Commit two trx - //if err = txSimgos.Commit().Error; err != nil { - // txSimgos.Rollback() - // return nil, err - //} + // STEP 1: Get Installation 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 + } + + // STEP 4: Commit two trx + if err = txSimgos.Commit().Error; err != nil { + txSimgos.Rollback() + return nil, err + } pl.SetLogInfo(&event, nil, "complete") @@ -146,12 +146,12 @@ 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 ( + txSync = dg.I.Begin() + txSimgos = dg.IS["simrs"].Begin() + sgData *esimgos.MUnit + err error + ) event := pl.Event{ Feature: "Delete", @@ -161,45 +161,45 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") - //// STEP 1: Get Installation 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) - //if err != nil { - // return nil, err - //} - // - //// STEP 3: Delete M_Poly Simgos - //err = HardDeleteSimgosData(sgData, &event, txSimgos) - //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) - // }() - // return nil, err - //} + // STEP 1: Get Installation 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) + if err != nil { + return nil, err + } + + // STEP 3: Delete M_Unit Simgos + err = HardDeleteSimgosData(sgData, &event, txSimgos) + 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) + }() + return nil, err + } pl.SetLogInfo(&event, nil, "complete") diff --git a/internal/use-case/simgos-sync-use-case/division/helper.go b/internal/use-case/simgos-sync-use-case/division/helper.go index 210d6e7c..e180d771 100644 --- a/internal/use-case/simgos-sync-use-case/division/helper.go +++ b/internal/use-case/simgos-sync-use-case/division/helper.go @@ -8,26 +8,24 @@ import ( "encoding/json" erc "simrs-vx/internal/domain/references/common" - //e "simrs-vx/internal/domain/main-entities/division" - // esimgos "simrs-vx/internal/domain/simgos-entities/divison" TBC + e "simrs-vx/internal/domain/main-entities/division" + esimgos "simrs-vx/internal/domain/simgos-entities/division" esync "simrs-vx/internal/domain/sync-entities/division" esyncLog "simrs-vx/internal/domain/sync-entities/log" ) -//func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MPloy) { -// var inputSrc *e.CreateDto -// if inputT, ok := any(input).(*e.CreateDto); ok { -// inputSrc = inputT -// } else { -// inputTemp := any(input).(*e.UpdateDto) -// inputSrc = &inputTemp.CreateDto -// } -// -// data.Nama = inputSrc.Name -// data.Jenispoly = 0 -// -// return -//} +func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MUnit) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.NamaUnit = inputSrc.Name + return +} func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.DivisionSimxLog) { // encode to JSON diff --git a/internal/use-case/simgos-sync-use-case/division/lib.go b/internal/use-case/simgos-sync-use-case/division/lib.go index ce13068d..681be276 100644 --- a/internal/use-case/simgos-sync-use-case/division/lib.go +++ b/internal/use-case/simgos-sync-use-case/division/lib.go @@ -9,103 +9,103 @@ import ( dg "github.com/karincake/apem/db-gorm-pg" "gorm.io/gorm" - //e "simrs-vx/internal/domain/main-entities/division" + e "simrs-vx/internal/domain/main-entities/division" + esimgos "simrs-vx/internal/domain/simgos-entities/division" esync "simrs-vx/internal/domain/sync-entities/division" - //esimgos "simrs-vx/internal/domain/simgos-entities/unit" esynclog "simrs-vx/internal/domain/sync-entities/log" ) var now = time.Now() -//func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esimgos.MPloy, error) { -// pl.SetLogInfo(event, nil, "started", "DBCreate") -// -// data := setDataSimgos(&input) -// -// var tx *gorm.DB -// if len(dbx) > 0 { -// tx = dbx[0] -// } else { -// tx = dg.IS["simrs"] -// } -// -// if err := tx.Create(&data).Error; err != nil { -// return nil, plh.HandleCreateError(input, event, err) -// } -// -// pl.SetLogInfo(event, nil, "complete") -// return &data, nil -//} +func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esimgos.MUnit, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") -//func ReadDetailSimgosData(simgosId uint16, event *pl.Event) (*esimgos.MPloy, error) { -// pl.SetLogInfo(event, simgosId, "started", "DBReadDetail") -// data := esimgos.MPloy{} -// -// var tx = dg.IS["simrs"] -// -// if err := tx. -// Where("\"kode\" = ?", simgosId). -// First(&data).Error; err != nil { -// if processedErr := pu.HandleReadError(err, event, source, simgosId, data); processedErr != nil { -// return nil, processedErr -// } -// } -// -// pl.SetLogInfo(event, nil, "complete") -// return &data, nil -//} + data := setDataSimgos(&input) -//func UpdateSimgosData(input e.UpdateDto, dataSimgos *esync.DivisionLink, event *pl.Event, dbx ...*gorm.DB) error { -// pl.SetLogInfo(event, input, "started", "DBUpdate") -// -// data := setDataSimgos(&input) -// data.Kode = dataSimgos.Simgos_Id -// -// var tx *gorm.DB -// if len(dbx) > 0 { -// tx = dbx[0] -// } else { -// tx = dg.IS["simrs"] -// } -// -// if err := tx.Save(&data).Error; err != nil { -// event.Status = "failed" -// event.ErrInfo = pl.ErrorInfo{ -// Code: "data-update-fail", -// Detail: "Database update failed", -// Raw: err, -// } -// return pl.SetLogError(event, input) -// } -// -// pl.SetLogInfo(event, nil, "complete") -// return nil -//} + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } -//func HardDeleteSimgosData(data *esimgos.MPloy, event *pl.Event, dbx ...*gorm.DB) error { -// pl.SetLogInfo(event, data, "started", "DBDelete") -// -// var tx *gorm.DB -// if len(dbx) > 0 { -// tx = dbx[0] -// } else { -// tx = dg.IS["simrs"] -// } -// -// if err := tx. -// Delete(&data).Error; err != nil { -// event.Status = "failed" -// event.ErrInfo = pl.ErrorInfo{ -// Code: "data-delete-fail", -// Detail: "Database delete failed", -// Raw: err, -// } -// return pl.SetLogError(event, data) -// } -// -// pl.SetLogInfo(event, nil, "complete") -// return nil -//} + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadDetailSimgosData(simgosId uint16, event *pl.Event) (*esimgos.MUnit, error) { + pl.SetLogInfo(event, simgosId, "started", "DBReadDetail") + data := esimgos.MUnit{} + + var tx = dg.IS["simrs"] + + if err := tx. + Where("\"kode_unit\" = ?", simgosId). + First(&data).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, simgosId, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateSimgosData(input e.UpdateDto, dataSimgos *esync.DivisionLink, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, input, "started", "DBUpdate") + + data := setDataSimgos(&input) + data.KodeUnit = dataSimgos.Simgos_Id + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx.Save(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func HardDeleteSimgosData(data *esimgos.MUnit, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.IS["simrs"] + } + + if err := tx. + Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.DivisionLink, error) { pl.SetLogInfo(event, nil, "started", "DBCreate")