diff --git a/cmd/main-migration/migrations/20251205221124.sql b/cmd/main-migration/migrations/20251205221124.sql new file mode 100644 index 00000000..3eab115a --- /dev/null +++ b/cmd/main-migration/migrations/20251205221124.sql @@ -0,0 +1,2 @@ +-- Modify "ChemoProtocol" table +ALTER TABLE "public"."ChemoProtocol" ADD COLUMN "VerifiedAt" timestamptz NULL, ADD COLUMN "VerifiedBy_User_Id" bigint NULL, ADD CONSTRAINT "fk_ChemoProtocol_VerifiedBy" FOREIGN KEY ("VerifiedBy_User_Id") REFERENCES "public"."User" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 6481f378..d1f6820b 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:8SotxMlqYq7PNXcyAsIzO4075hP1c39CA2efE7Jp1kk= +h1:BsDkwn1AzNdKnOPVb6PkonyiXM7nTdVcjRdw62i/NlQ= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -148,4 +148,5 @@ h1:8SotxMlqYq7PNXcyAsIzO4075hP1c39CA2efE7Jp1kk= 20251205073858.sql h1:GD692c2jC2mFr6esv3eQmxEpWOeIA860TGctwHAldfM= 20251205073858.sql h1:Ep03jQ9hJAJILDJfKVcmi3Z6fqmTHSq9gKQtwf070PE= 20251205211957.sql h1:zRHcvLY+nfLdUyMcfpgI8vYQcPzJUWbfjkc4cK0QGHU= -20251205214433.sql h1:cPyzSgAn5VHElC5yHtK2TCKSnBoTI65S0kcoc2GbIxQ= +20251205214433.sql h1:tgHB/fNy9XwAOWIqNI6GCqGXeJgSuZs2aHiCEj3BHZA= +20251205221124.sql h1:VthPlq3XcQOYz5VsFivb4Wof8jCAG36fAaerKmM4/OA= diff --git a/internal/domain/main-entities/chemo-plan/dto.go b/internal/domain/main-entities/chemo-plan/dto.go index ffd9803f..04be0ebc 100644 --- a/internal/domain/main-entities/chemo-plan/dto.go +++ b/internal/domain/main-entities/chemo-plan/dto.go @@ -32,17 +32,17 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` Includes string `json:"includes"` } type UpdateDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` CreateDto } type DeleteDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` } type MetaDto struct { @@ -71,7 +71,7 @@ func (d ChemoPlan) ToResponse() ResponseDto { PlanDate: d.PlanDate, RealizationDate: d.RealizationDate, Notes: d.Notes, - Status: d.Status, + Status: *d.Status, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/chemo-plan/entity.go b/internal/domain/main-entities/chemo-plan/entity.go index 1f3f3ca5..6bb156b3 100644 --- a/internal/domain/main-entities/chemo-plan/entity.go +++ b/internal/domain/main-entities/chemo-plan/entity.go @@ -10,12 +10,12 @@ import ( type ChemoPlan struct { ecore.Main - Parent_Id *uint `json:"parent_id"` // chemo.Id - Protocol_Id *uint `json:"protocol_id"` - SeriesNumber *uint16 `json:"seriesNumber"` // series ke - - CycleNumber *uint `json:"cycleNumber"` // cycle ke - - PlanDate *time.Time `json:"planDate"` - RealizationDate *time.Time `json:"realizationDate"` - Notes *string `json:"notes"` - Status ere.StatusProtocolChemo `json:"status"` + Parent_Id *uint `json:"parent_id"` // chemo.Id + Protocol_Id *uint `json:"protocol_id"` + SeriesNumber *uint16 `json:"seriesNumber"` // series ke - + CycleNumber *uint `json:"cycleNumber"` // cycle ke - + PlanDate *time.Time `json:"planDate"` + RealizationDate *time.Time `json:"realizationDate"` + Notes *string `json:"notes"` + Status *ere.StatusProtocolChemo `json:"status"` } diff --git a/internal/domain/main-entities/chemo-protocol/dto.go b/internal/domain/main-entities/chemo-protocol/dto.go index e329cf67..e485770a 100644 --- a/internal/domain/main-entities/chemo-protocol/dto.go +++ b/internal/domain/main-entities/chemo-protocol/dto.go @@ -12,21 +12,25 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ec "simrs-vx/internal/domain/main-entities/chemo" + ep "simrs-vx/internal/domain/main-entities/chemo-plan" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id" validate:"required"` - Chemo_Id *uint `json:"chemo_id" validate:"required"` - Patient_Weight *float32 `json:"patient_weight"` - Patient_Height *float32 `json:"patient_height"` - Diagnoses *string `json:"diagnoses" validate:"required"` - Interval *uint `json:"interval" validate:"required"` - Cycle *uint `json:"cycle" validate:"required"` - Series *uint16 `json:"series" validate:"required"` - StartDate *time.Time `json:"startDate"` - EndDate *time.Time `json:"endDate"` - Status_Code erc.DataVerifiedCode `json:"-"` - Patient_Id *uint `json:"patient_id"` + Encounter_Id *uint `json:"encounter_id" validate:"required"` + Chemo_Id *uint `json:"chemo_id" validate:"required"` + Patient_Weight *float32 `json:"patient_weight"` + Patient_Height *float32 `json:"patient_height"` + Diagnoses *string `json:"diagnoses" validate:"required"` + Interval *uint `json:"interval" validate:"required"` + Cycle *uint `json:"cycle" validate:"required"` + Series *uint16 `json:"series" validate:"required"` + StartDate *time.Time `json:"startDate"` + EndDate *time.Time `json:"endDate"` + Patient_Id *uint `json:"patient_id"` + ChemoPlans *[]ep.CreateDto `json:"chemoPlans" validate:"required"` + + Id *uint `json:"-"` + Status_Code erc.DataVerifiedCode `json:"-"` } type ReadListDto struct { @@ -36,7 +40,8 @@ type ReadListDto struct { } type FilterDto struct { - Chemo_Id *uint `json:"chemo-id"` + Chemo_Id *uint `json:"chemo-id"` + Patient_Id *uint `json:"patient-id"` } type ReadDetailDto struct { diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 83ef759b..0cac9a76 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -130,9 +130,9 @@ const ( ETCEncounter EntityTypeCode = "encounter" ETCMCU EntityTypeCode = "mcu" - SPCComplete StatusProtocolChemo = "complete" - SPCPlanned StatusProtocolChemo = "planned" - SPCSchedule StatusProtocolChemo = "schedule" + SPCComplete StatusProtocolChemo = "complete" // Terealisasi + SPCPlanned StatusProtocolChemo = "planned" // Terencana + SPCSchedule StatusProtocolChemo = "schedule" // Terjadwal ) func (ec EncounterClassCode) Code() string { diff --git a/internal/interface/main-handler/chemo/handler.go b/internal/interface/main-handler/chemo/handler.go index 18435479..5aa2be44 100644 --- a/internal/interface/main-handler/chemo/handler.go +++ b/internal/interface/main-handler/chemo/handler.go @@ -3,20 +3,16 @@ package chemo import ( "net/http" - rw "github.com/karincake/risoles" - sf "github.com/karincake/semprit" - - // ua "github.com/karincake/tumpeng/auth/svc" - - e "simrs-vx/internal/domain/main-entities/chemo" - - erc "simrs-vx/internal/domain/references/common" - - u "simrs-vx/internal/use-case/main-use-case/chemo" - pa "simrs-vx/internal/lib/auth" d "github.com/karincake/dodol" + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" + + erc "simrs-vx/internal/domain/references/common" + + e "simrs-vx/internal/domain/main-entities/chemo" + u "simrs-vx/internal/use-case/main-use-case/chemo" ) type myBase struct{} @@ -45,6 +41,7 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { return } dto := e.ReadDetailDto{} + sf.UrlQueryParam(&dto, *r.URL) dto.Id = uint16(id) res, err := u.ReadDetail(dto) rw.DataResponse(w, res, err) diff --git a/internal/use-case/main-use-case/chemo-plan/case.go b/internal/use-case/main-use-case/chemo-plan/case.go index 7b1ffeb9..eda5a526 100644 --- a/internal/use-case/main-use-case/chemo-plan/case.go +++ b/internal/use-case/main-use-case/chemo-plan/case.go @@ -1,7 +1,6 @@ package chemo_plan import ( - "errors" erc "simrs-vx/internal/domain/references/common" "strconv" @@ -13,13 +12,14 @@ import ( "gorm.io/gorm" - e "simrs-vx/internal/domain/main-entities/chemo-protocol" + e "simrs-vx/internal/domain/main-entities/chemo-plan" + ep "simrs-vx/internal/domain/main-entities/chemo-protocol" ) -const source = "chemo-protocol" +const source = "chemo-plan" -func Create(input e.CreateDto) (*d.Data, error) { - data := e.ChemoProtocol{} +func Create(input ep.CreateDto) (*d.Data, error) { + data := []e.ChemoPlan{} event := pl.Event{ Feature: "Create", @@ -30,43 +30,14 @@ func Create(input e.CreateDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "create") 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 - } - - //// get chemo data from encounter - //dataChemo, err := getChemoEncounter(input.Encounter_Id, &event) - //if err != nil { - // return err - //} - // - //input.Chemo_Id = &dataChemo.Id - - // determine status code chemo-protocol - //switch dataChemo.Encounter.Ambulatory.Class_Code { - //case ere.ACCChemo: - // input.Status_Code = erc.DVCVerified - //default: - // input.Status_Code = erc.DVCNew - //} - input.Status_Code = erc.DVCNew - if resData, err := CreateData(input, &event, tx); err != nil { + if resData, err := CreateData(&input, &event, tx); err != nil { return err } else { data = *resData } - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { - return err - } - pl.SetLogInfo(&event, nil, "complete") return nil @@ -82,13 +53,13 @@ func Create(input e.CreateDto) (*d.Data, error) { "structure": "single-data", "status": "created", }, - Data: data.ToResponse(), + Data: e.ToResponseList(data), }, nil } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.ChemoProtocol - var dataList []e.ChemoProtocol + var data *e.ChemoPlan + var dataList []e.ChemoPlan var metaList *e.MetaDto var err error @@ -140,7 +111,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { } func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { - var data *e.ChemoProtocol + var data *e.ChemoPlan var err error event := pl.Event{ @@ -186,9 +157,9 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { }, nil } -func Update(input e.UpdateDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} - var data *e.ChemoProtocol +func Update(input ep.UpdateDto) (*d.Data, error) { + rdDto := e.ReadListDto{FilterDto: e.FilterDto{Parent_Id: &input.Id}} + var data []e.ChemoPlan var err error event := pl.Event{ @@ -201,29 +172,15 @@ func Update(input e.UpdateDto) (*d.Data, error) { err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") - if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + if data, _, err = ReadListData(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 { + 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 }) @@ -237,14 +194,14 @@ func Update(input e.UpdateDto) (*d.Data, error) { "structure": "single-data", "status": "updated", }, - Data: data.ToResponse(), + Data: e.ToResponseList(data), }, nil } func Delete(input e.DeleteDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id} - var data *e.ChemoProtocol + var data *e.ChemoPlan var err error event := pl.Event{ @@ -295,65 +252,3 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } - -func Verify(input e.VerifyDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} - var data *e.ChemoProtocol - var err error - - event := pl.Event{ - Feature: "Verify", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "verify") - - 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 - } - - if data.Status_Code != erc.DVCNew { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-state-mismatch", - Detail: "data is not new", - Raw: errors.New("data is not new"), - } - return pl.SetLogError(&event, input) - } - - data.VerifiedAt = pu.GetTimeNow() - data.Status_Code = erc.DVCVerified - data.VerifiedBy_User_Id = &input.AuthInfo.User_Id - - err = tx.Save(&data).Error - if 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 - }) - - if err != nil { - } - - return &d.Data{ - Meta: d.IS{ - "source": source, - "structure": "single-data", - "status": "verify", - }, - Data: data.ToResponse(), - }, nil -} diff --git a/internal/use-case/main-use-case/chemo-plan/helper.go b/internal/use-case/main-use-case/chemo-plan/helper.go index a06f5f20..b9dcca60 100644 --- a/internal/use-case/main-use-case/chemo-plan/helper.go +++ b/internal/use-case/main-use-case/chemo-plan/helper.go @@ -5,100 +5,31 @@ Any functions that are used internally by the use-case package chemo_plan import ( - ec "simrs-vx/internal/domain/main-entities/chemo" - e "simrs-vx/internal/domain/main-entities/chemo-plan" - erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" - pl "simrs-vx/pkg/logger" - pu "simrs-vx/pkg/use-case-helper" - dg "github.com/karincake/apem/db-gorm-pg" - gh "github.com/karincake/getuk" + e "simrs-vx/internal/domain/main-entities/chemo-plan" + ep "simrs-vx/internal/domain/main-entities/chemo-protocol" ) -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ChemoPlan) { - var inputSrc *e.CreateDto - if inputT, ok := any(input).(*e.CreateDto); ok { +func setData[T *ep.CreateDto | *ep.UpdateDto](input T, data []e.ChemoPlan) { + var inputSrc *ep.CreateDto + if inputT, ok := any(input).(*ep.CreateDto); ok { inputSrc = inputT } else { - inputTemp := any(input).(*e.UpdateDto) + inputTemp := any(input).(*ep.UpdateDto) inputSrc = &inputTemp.CreateDto } - data.Chemo_Id = inputSrc.Chemo_Id - data.Patient_Weight = inputSrc.Patient_Weight - data.Patient_Height = inputSrc.Patient_Height - data.Diagnoses = inputSrc.Diagnoses - data.Interval = inputSrc.Interval - data.Cycle = inputSrc.Cycle - data.Series = inputSrc.Series - data.StartDate = inputSrc.StartDate - data.EndDate = inputSrc.EndDate - data.Status_Code = inputSrc.Status_Code -} - -func getChemoEncounterReg(event *pl.Event) (*ec.Chemo, error) { - pl.SetLogInfo(event, nil, "started", "DBReadChemoEncounterReg") - data := ec.Chemo{} - - var tx = dg.I - - if err := tx.Model(&ec.Chemo{}). - Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). - Joins(`LEFT JOIN "Ambulatory" "a" ON "a"."Encounter_Id" = "e"."Id"`). - Where(`"Chemo"."Status_Code" = ? AND "a"."Class_Code" = ?`, erc.DVCVerified, ere.ACCReg). - Order("\"CreatedAt\" DESC"). - First(&data). - Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { - return nil, processedErr - } + for _, cp := range *inputSrc.ChemoPlans { + data = append(data, e.ChemoPlan{ + Parent_Id: inputSrc.Chemo_Id, + Protocol_Id: inputSrc.Id, + SeriesNumber: cp.SeriesNumber, + CycleNumber: cp.CycleNumber, + PlanDate: cp.PlanDate, + }) } - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func getChemoFromLatestEncounter(event *pl.Event) (*ec.Chemo, error) { - pl.SetLogInfo(event, nil, "started", "DBReadChemoFromLatestEncounter") - data := ec.Chemo{} - - var tx = dg.I - - if err := tx.Model(&ec.Chemo{}). - Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). - Joins(`LEFT JOIN "Ambulatory" "a" ON "a"."Encounter_Id" = "e"."Id"`). - Where(`"a"."Class_Code" IN (?)"`, []string{string(ere.ACCReg), string(ere.ACCChemo)}). - Where(`"Chemo"."Status_Code" = ?`, erc.DVCVerified). - Scopes(gh.Preload("Encounter.Ambulatory")). - Order("\"Chemo\".\"CreatedAt\" DESC"). - First(&data). - Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func getChemoEncounter(encounterId *uint, event *pl.Event) (*ec.Chemo, error) { - pl.SetLogInfo(event, encounterId, "started", "DBReadChemoEncounter") - data := ec.Chemo{} - - var tx = dg.I - - if err := tx.Model(&ec.Chemo{}). - Where(`"Encounter_Id" = ? AND "Status_Code"`, encounterId, erc.DVCVerified). - Scopes(gh.Preload("Encounter.Ambulatory")). - First(&data). - Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil + status := ere.SPCPlanned + data[0].Status = &status } diff --git a/internal/use-case/main-use-case/chemo-plan/lib.go b/internal/use-case/main-use-case/chemo-plan/lib.go index 1b05a81b..3b40325a 100644 --- a/internal/use-case/main-use-case/chemo-plan/lib.go +++ b/internal/use-case/main-use-case/chemo-plan/lib.go @@ -12,14 +12,15 @@ import ( dg "github.com/karincake/apem/db-gorm-pg" gh "github.com/karincake/getuk" - e "simrs-vx/internal/domain/main-entities/chemo-protocol" + e "simrs-vx/internal/domain/main-entities/chemo-plan" + ep "simrs-vx/internal/domain/main-entities/chemo-protocol" ) -func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ChemoProtocol, error) { +func CreateData(input *ep.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.ChemoPlan, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := e.ChemoProtocol{} - setData(&input, &data) + data := []e.ChemoPlan{} + setData(input, data) var tx *gorm.DB if len(dbx) > 0 { @@ -36,9 +37,9 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ChemoPr return &data, nil } -func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ChemoProtocol, *e.MetaDto, error) { +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ChemoPlan, *e.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") - data := []e.ChemoProtocol{} + data := []e.ChemoPlan{} pagination := gh.Pagination{} count := int64(0) meta := e.MetaDto{} @@ -51,7 +52,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch } tx = tx. - Model(&e.ChemoProtocol{}). + Model(&e.ChemoPlan{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). @@ -73,9 +74,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch return data, &meta, nil } -func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ChemoProtocol, error) { +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ChemoPlan, error) { pl.SetLogInfo(event, input, "started", "DBReadDetail") - data := e.ChemoProtocol{} + data := e.ChemoPlan{} var tx *gorm.DB if len(dbx) > 0 { @@ -98,9 +99,9 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(input e.UpdateDto, data *e.ChemoProtocol, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateData(input *ep.UpdateDto, data []e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - setData(&input, data) + setData(input, data) var tx *gorm.DB if len(dbx) > 0 { @@ -123,7 +124,7 @@ func UpdateData(input e.UpdateDto, data *e.ChemoProtocol, event *pl.Event, dbx . return nil } -func DeleteData(data *e.ChemoProtocol, event *pl.Event, dbx ...*gorm.DB) error { +func DeleteData(data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBDelete") var tx *gorm.DB if len(dbx) > 0 { diff --git a/internal/use-case/main-use-case/chemo-protocol/case.go b/internal/use-case/main-use-case/chemo-protocol/case.go index ab481b34..793ab06b 100644 --- a/internal/use-case/main-use-case/chemo-protocol/case.go +++ b/internal/use-case/main-use-case/chemo-protocol/case.go @@ -2,7 +2,6 @@ package chemo_protocol import ( "errors" - erc "simrs-vx/internal/domain/references/common" "strconv" dg "github.com/karincake/apem/db-gorm-pg" @@ -13,9 +12,12 @@ import ( "gorm.io/gorm" + erc "simrs-vx/internal/domain/references/common" + e "simrs-vx/internal/domain/main-entities/chemo-protocol" ee "simrs-vx/internal/domain/main-entities/encounter" + ucp "simrs-vx/internal/use-case/main-use-case/chemo-plan" ue "simrs-vx/internal/use-case/main-use-case/encounter" ) @@ -23,6 +25,7 @@ const source = "chemo-protocol" func Create(input e.CreateDto) (*d.Data, error) { data := e.ChemoProtocol{} + var err error event := pl.Event{ Feature: "Create", @@ -32,51 +35,27 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - 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 input.Patient_Id == nil { + // get encounter + dataEncounter, err := ue.ReadDetailData(ee.ReadDetailDto{Id: *input.Encounter_Id}, &event) + if err != nil { + return nil, err } - if input.Patient_Id == nil { - // get encounter - dataEncounter, err := ue.ReadDetailData(ee.ReadDetailDto{Id: *input.Encounter_Id}, &event) - if err != nil { - return err - } - - input.Patient_Id = dataEncounter.Patient_Id - } - - // get chemo data from encounter - //dataChemo, err := getChemoEncounter(input.Encounter_Id, &event) - //if err != nil { - // return err - //} - - //input.Chemo_Id = &dataChemo.Id - - // determine status code chemo-protocol - //switch dataChemo.Encounter.Ambulatory.Class_Code { - //case ere.ACCChemo: - // input.Status_Code = erc.DVCVerified - //default: - // input.Status_Code = erc.DVCNew - //} - + input.Patient_Id = dataEncounter.Patient_Id input.Status_Code = erc.DVCNew + } + err = dg.I.Transaction(func(tx *gorm.DB) error { + // Insert Chemo-Protocol if resData, err := CreateData(input, &event, tx); err != nil { return err } else { data = *resData } - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + // Insert Chemo-Plans + if data.ChemoPlans, err = ucp.CreateData(&input, &event, tx); err != nil { return err } @@ -113,6 +92,15 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "readList") + if input.Patient_Id == nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-validation-fail", + Detail: "patient-id is required", + } + return nil, pl.SetLogError(&event, input) + } + err = dg.I.Transaction(func(tx *gorm.DB) error { mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) diff --git a/internal/use-case/main-use-case/chemo/case.go b/internal/use-case/main-use-case/chemo/case.go index 1a0851ff..b940fa37 100644 --- a/internal/use-case/main-use-case/chemo/case.go +++ b/internal/use-case/main-use-case/chemo/case.go @@ -15,9 +15,6 @@ import ( erc "simrs-vx/internal/domain/references/common" e "simrs-vx/internal/domain/main-entities/chemo" - ee "simrs-vx/internal/domain/main-entities/encounter" - - ue "simrs-vx/internal/use-case/main-use-case/encounter" ) const source = "chemo" @@ -73,7 +70,6 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.Chemo var dataList []e.Chemo var metaList *e.MetaDto var err error @@ -86,37 +82,17 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "readList") - err = dg.I.Transaction(func(tx *gorm.DB) error { - mwRunner := newMiddlewareRunner(&event, tx) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { - return err + if input.Patient_Id == nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-validation-fail", + Detail: "patient-id is required", } + return nil, pl.SetLogError(&event, input) + } - // Get Encounter - dataEncounter, err := ue.ReadDetailData(ee.ReadDetailDto{Id: *input.Encounter_Id}, &event) - if err != nil { - return err - } - - input.Patient_Id = dataEncounter.Patient_Id - input.Encounter_Id = nil - - if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { - return err - } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { - return err - } - - return nil - }) - - if err != nil { + input.Encounter_Id = nil + if dataList, metaList, err = ReadListData(input, &event); err != nil { return nil, err }