diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index 758efb05..5cc0ed5c 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -8,6 +8,7 @@ import ( ) type CreateDto struct { + Id *uint `json:"id"` Code *string `json:"code" validate:"maxLength=10"` Name string `json:"name" validate:"maxLength=50"` EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code" validate:"maxLength=10"` diff --git a/internal/use-case/main-use-case/installation/case.go b/internal/use-case/main-use-case/installation/case.go index f3ce5d59..8e577a30 100644 --- a/internal/use-case/main-use-case/installation/case.go +++ b/internal/use-case/main-use-case/installation/case.go @@ -1,6 +1,7 @@ package installation import ( + egos "simrs-vx/internal/domain/simgos-entities/installation" "strconv" dg "github.com/karincake/apem/db-gorm-pg" @@ -18,6 +19,7 @@ const source = "installation" func Create(input e.CreateDto) (*d.Data, error) { data := e.Installation{} + sgData := egos.MInstalasi{} event := pl.Event{ Feature: "Create", @@ -29,11 +31,6 @@ func Create(input e.CreateDto) (*d.Data, error) { 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 @@ -43,7 +40,7 @@ func Create(input e.CreateDto) (*d.Data, error) { mwRunner.setMwType(pu.MWTPost) // Run post-middleware - if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &sgData); err != nil { return err } diff --git a/internal/use-case/main-use-case/installation/middleware-runner.go b/internal/use-case/main-use-case/installation/middleware-runner.go index fce572bb..0abd6b29 100644 --- a/internal/use-case/main-use-case/installation/middleware-runner.go +++ b/internal/use-case/main-use-case/installation/middleware-runner.go @@ -2,6 +2,7 @@ package installation import ( e "simrs-vx/internal/domain/main-entities/installation" + egos "simrs-vx/internal/domain/simgos-entities/installation" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -23,7 +24,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Installation) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *egos.MInstalasi) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) diff --git a/internal/use-case/main-use-case/installation/middleware.go b/internal/use-case/main-use-case/installation/middleware.go index 3d414c9b..46c4be1d 100644 --- a/internal/use-case/main-use-case/installation/middleware.go +++ b/internal/use-case/main-use-case/installation/middleware.go @@ -1,9 +1,12 @@ package installation +import ( + plugin "simrs-vx/internal/use-case/simgos-sync-plugin/installation" +) + // example of middleware -// func init() { -// createPreMw = append(createPreMw, -// CreateMw{Name: "modif-input", Func: pm.ModifInput}, -// CreateMw{Name: "check-data", Func: pm.CheckData}, -// ) -// } +func init() { + createPostMw = append(createPostMw, + createMw{Name: "create-installation", Func: plugin.Create}, + ) +} diff --git a/internal/use-case/main-use-case/installation/tycovar.go b/internal/use-case/main-use-case/installation/tycovar.go index de8e9c9e..975ebd34 100644 --- a/internal/use-case/main-use-case/installation/tycovar.go +++ b/internal/use-case/main-use-case/installation/tycovar.go @@ -9,6 +9,8 @@ functionality. The purpose of this is to make the code more maintainable. package installation import ( + egos "simrs-vx/internal/domain/simgos-entities/installation" + "gorm.io/gorm" e "simrs-vx/internal/domain/main-entities/installation" @@ -16,7 +18,7 @@ import ( type createMw struct { Name string - Func func(input *e.CreateDto, data *e.Installation, tx *gorm.DB) error + Func func(input *e.CreateDto, data *egos.MInstalasi, tx *gorm.DB) error } type readListMw struct { diff --git a/internal/use-case/simgos-sync-plugin/installation/plugin.go b/internal/use-case/simgos-sync-plugin/installation/plugin.go new file mode 100644 index 00000000..92ef479b --- /dev/null +++ b/internal/use-case/simgos-sync-plugin/installation/plugin.go @@ -0,0 +1,46 @@ +package installation + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + sync "simrs-vx/internal/infra/sync-cfg" + + e "simrs-vx/internal/domain/main-entities/installation" + egos "simrs-vx/internal/domain/simgos-entities/installation" + + "gorm.io/gorm" +) + +var endpoint = fmt.Sprintf("%s/v1/installation", sync.O.BaseUrl) + +func Create(input *e.CreateDto, data *egos.MInstalasi, tx *gorm.DB) error { + jsonData, err := json.Marshal(input) + if err != nil { + return fmt.Errorf("failed to encode JSON: %w", err) + } + req, err := http.NewRequest("POST", endpoint, bytes.NewReader(jsonData)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + if err := json.Unmarshal(body, &data); err != nil { + return fmt.Errorf("failed to parse response JSON: %w", err) + } + + return nil +} 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 398289cd..2990d5ae 100644 --- a/internal/use-case/simgos-sync-use-case/installation/case.go +++ b/internal/use-case/simgos-sync-use-case/installation/case.go @@ -1,8 +1,9 @@ package installation import ( - e "simrs-vx/internal/domain/main-entities/installation" + erc "simrs-vx/internal/domain/references/common" "strconv" + "time" dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -11,13 +12,18 @@ import ( pu "simrs-vx/pkg/use-case-helper" "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/installation" + egos "simrs-vx/internal/domain/simgos-entities/installation" + esync "simrs-vx/internal/domain/sync-entities/installation" ) const source = "installation" -func Create(input e.CreateDto) (*d.Data, error) { - data := e.Installation{} +var now = time.Now() +func Create(input e.CreateDto) (*d.Data, error) { + sgData := egos.MInstalasi{} event := pl.Event{ Feature: "Create", Source: source, @@ -27,14 +33,35 @@ func Create(input e.CreateDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "create") err := dg.I.Transaction(func(tx *gorm.DB) error { - // TODO: Insert + // Insert Simgos + sgData, err := CreateSimgosData(input, &event, tx) + if err != nil { + errMsg := err.Error() + inputLog := esync.InstallationSimxLog{ + Date: &now, + Status: erc.PSCFailed, + ErrMessage: &errMsg, + } - // TODO: InsertSimxLog - - if resData, err := CreateData(input, &event, tx); err != nil { - return err + // InsertSimxLog + if err = CreateSimxLogData(input, inputLog, &event, tx); err != nil { + return err + } } else { - data = *resData + inputLog := esync.InstallationSimxLog{ + Date: &now, + Status: erc.PSCSuccess, + } + + // InsertSimxLog + if err = CreateSimxLogData(input, inputLog, &event, tx); err != nil { + return err + } + } + + // InsertSimxLink + if err = CreateInstallationLinkData(*input.Id, sgData.NoInstalasi, &event, tx); err != nil { + return err } pl.SetLogInfo(&event, nil, "complete") @@ -52,7 +79,7 @@ func Create(input e.CreateDto) (*d.Data, error) { "structure": "single-data", "status": "created", }, - Data: data.ToResponse(), + Data: sgData, }, nil } @@ -156,61 +183,61 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { }, nil } -func Update(input e.UpdateDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Code: input.Code} - var data *e.Installation - var err error - - event := pl.Event{ - Feature: "Update", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "update") - - err = dg.I.Transaction(func(tx *gorm.DB) error { - pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") - if data, err = ReadDetailData(rdDto, &event, tx); err != nil { - return err - } - - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { - return err - } - - 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 { - return err - } - - return nil - }) - - if err != nil { - return nil, err - } - - return &d.Data{ - Meta: d.IS{ - "source": source, - "structure": "single-data", - "status": "updated", - }, - Data: data.ToResponse(), - }, nil - -} +//func Update(input e.UpdateDto) (*d.Data, error) { +// rdDto := e.ReadDetailDto{Code: input.Code} +// var data *e.Installation +// var err error +// +// event := pl.Event{ +// Feature: "Update", +// Source: source, +// } +// +// // Start log +// pl.SetLogInfo(&event, input, "started", "update") +// +// err = dg.I.Transaction(func(tx *gorm.DB) error { +// pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") +// if data, err = ReadDetailData(rdDto, &event, tx); err != nil { +// return err +// } +// +// mwRunner := newMiddlewareRunner(&event, tx) +// mwRunner.setMwType(pu.MWTPre) +// // Run pre-middleware +// if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { +// return err +// } +// +// 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 { +// return err +// } +// +// return nil +// }) +// +// if err != nil { +// return nil, err +// } +// +// return &d.Data{ +// Meta: d.IS{ +// "source": source, +// "structure": "single-data", +// "status": "updated", +// }, +// Data: data.ToResponse(), +// }, nil +// +//} func Delete(input e.DeleteDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Code: input.Code} diff --git a/internal/use-case/simgos-sync-use-case/installation/helper.go b/internal/use-case/simgos-sync-use-case/installation/helper.go index af56b5c6..eae50f99 100644 --- a/internal/use-case/simgos-sync-use-case/installation/helper.go +++ b/internal/use-case/simgos-sync-use-case/installation/helper.go @@ -5,11 +5,13 @@ Any functions that are used internally by the use-case package installation import ( + "encoding/json" e "simrs-vx/internal/domain/main-entities/installation" esimgos "simrs-vx/internal/domain/simgos-entities/installation" + esync "simrs-vx/internal/domain/sync-entities/installation" ) -func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T, data *esimgos.MInstalasi) { +func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MInstalasi) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT @@ -19,8 +21,35 @@ func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T, data *esimgos.MInstal } data.NamaInstalasi = inputSrc.Name - data.StatusRawatInap = 1 - data.Code = *inputSrc.Code - data.Name = inputSrc.Name - data.EncounterClass_Code = inputSrc.EncounterClass_Code + data.StatusRawatInap = 0 + data.StAktif = 1 + + return +} + +func setDataSimxLog[T *e.CreateDto | *e.UpdateDto](input T, inputLog esync.InstallationSimxLog) (data esync.InstallationSimxLog) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + // encode to JSON + jsonData, _ := json.Marshal(inputSrc) + jsonString := string(jsonData) + + data.Value = &jsonString + data.Date = &now + data.Status = inputLog.Status + data.ErrMessage = inputLog.ErrMessage + + return +} + +func setDataSimxLink(simxId, simgosId uint) (data esync.InstallationLink) { + data.Simx_Id = simxId + data.Simgos_Id = simgosId + return } diff --git a/internal/use-case/simgos-sync-use-case/installation/lib.go b/internal/use-case/simgos-sync-use-case/installation/lib.go index 07afe61a..e76eb127 100644 --- a/internal/use-case/simgos-sync-use-case/installation/lib.go +++ b/internal/use-case/simgos-sync-use-case/installation/lib.go @@ -11,13 +11,13 @@ import ( e "simrs-vx/internal/domain/main-entities/installation" esimgos "simrs-vx/internal/domain/simgos-entities/installation" + esync "simrs-vx/internal/domain/sync-entities/installation" ) func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esimgos.MInstalasi, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := esimgos.MInstalasi{} - setData(&input, &data) + data := setDataSimgos(&input) var tx *gorm.DB if len(dbx) > 0 { @@ -34,6 +34,44 @@ func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esi return &data, nil } +func CreateSimxLogData(input e.CreateDto, inputLog esync.InstallationSimxLog, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataSimxLog(&input, inputLog) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func CreateInstallationLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setDataSimxLink(simxId, simgosId) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return plh.HandleCreateError(data, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Installation, *e.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") data := []e.Installation{} @@ -101,30 +139,30 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(input e.UpdateDto, data *e.Installation, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, data, "started", "DBUpdate") - setData(&input, data) - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - 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 UpdateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) error { +// pl.SetLogInfo(event, input, "started", "DBUpdate") +// setData(&input, data) +// +// var tx *gorm.DB +// if len(dbx) > 0 { +// tx = dbx[0] +// } else { +// tx = dg.I +// } +// +// 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 DeleteData(data *e.Installation, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBDelete")