add create installation

This commit is contained in:
vanilia
2025-11-13 17:28:20 +07:00
parent 3ebd3a38d0
commit e75025f87d
9 changed files with 254 additions and 110 deletions
@@ -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"`
@@ -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
}
@@ -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)
@@ -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},
)
}
@@ -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 {
@@ -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
}
@@ -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}
@@ -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
}
@@ -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")