package unit import ( 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/unit" esimgos "simrs-vx/internal/domain/simgos-entities/unit" esync "simrs-vx/internal/domain/sync-entities/log" ) const source = "unit" func Create(input e.CreateDto) (*d.Data, error) { var ( txSync = dg.I.Begin() txSimgos = dg.IS["simrs"].Begin() ) event := pl.Event{ Feature: "Create", Source: source, } // Start log 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 } pl.SetLogInfo(&event, nil, "complete") return &d.Data{ Meta: d.II{ "source": source, "structure": "single-data", "status": "created", }, }, nil } func CreateSimxLog(input esync.SimxLogDto) (*d.Data, error) { event := pl.Event{ Feature: "Create", Source: source, } // Start log pl.SetLogInfo(&event, input, "started", "create") err := dg.I.Transaction(func(tx *gorm.DB) error { // InsertSimxLog if err := CreateLogData(input, &event, tx); err != nil { return err } pl.SetLogInfo(&event, nil, "complete") return nil }) if err != nil { return nil, err } pl.SetLogInfo(&event, nil, "complete") return &d.Data{ Meta: d.II{ "source": source, "structure": "single-data", "status": "created", }, }, nil } func Update(input e.UpdateDto) (*d.Data, error) { var ( txSimgos = dg.IS["simrs"].Begin() err error ) event := pl.Event{ Feature: "Update", Source: source, } // 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 } pl.SetLogInfo(&event, nil, "complete") return &d.Data{ Meta: d.IS{ "source": source, "structure": "single-data", "status": "updated", }, }, nil } func Delete(input e.DeleteDto) (*d.Data, error) { var ( txSync = dg.I.Begin() txSimgos = dg.IS["simrs"].Begin() sgData *esimgos.MPloy err error ) event := pl.Event{ Feature: "Delete", Source: source, } // 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 } pl.SetLogInfo(&event, nil, "complete") return &d.Data{ Meta: d.IS{ "source": source, "structure": "single-data", "status": "deleted", }, }, nil }