Merge branch 'dev' of github.com:dikstub-rssa/simrs-be into feat/file-generator-169

This commit is contained in:
dpurbosakti
2025-12-05 14:09:26 +07:00
45 changed files with 1821 additions and 238 deletions

No files matched your search

@@ -81,8 +81,8 @@ type Mr struct {
}
type Provider struct {
Kode string `json:"kdProvider" json:"kode"` // API sometimes uses different keys
NmProvider string `json:"nmProvider" json:"nama"`
Kode string `son:"kode"`
NmProvider string `json:"nama"`
}
type Poli struct {
@@ -78,8 +78,14 @@ type TRujukan struct {
type ReadListDto struct {
FilterDto
Includes string `json:"includes"`
Pagination ecore.Pagination
Includes string `json:"includes"`
Pagination ecore.Pagination
Patient_Identifier *string `json:"patient-identifier"`
StartDate *string `json:"start-date"`
EndDate *string `json:"end-date"`
PaymentMethod_Code *string `json:"paymentMethod-code"`
Status_Code *string `json:"status-code"`
Unit_Code *string `json:"unit-code"`
pa.AuthInfo
}
@@ -89,7 +95,6 @@ type FilterDto struct {
Patient *ep.Patient `json:"patient,omitempty"`
RegisteredAt *time.Time `json:"registeredAt"`
Class_Code ere.EncounterClassCode `json:"class-code" validate:"maxLength=10"`
Unit_Code *string `json:"unit-code"`
Specialist_Code *string `json:"specialist-code"`
Subspecialist_Code *string `json:"subspecialist-code"`
VisitDate time.Time `json:"visitDate"`
@@ -15,7 +15,7 @@ type Patient struct {
RegisteredAt *time.Time `json:"registeredAt"`
RegisteredBy_User_Name *string `json:"registeredBy_user_name" gorm:"size:100"`
Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"`
Number *string `json:"number" gorm:"unique;size:15"`
Number *string `json:"number" gorm:"size:15;unique"`
Parent_Number *string `json:"parent_number"`
Parent *Patient `json:"parent,omitempty" gorm:"foreignKey:Parent_Number;references:Number"`
}
@@ -0,0 +1,12 @@
package procedureroomorder
import (
ecore "simrs-vx/internal/domain/base-entities/core"
)
type ProcedureRoomOrderItem struct {
ecore.BigMain
ProcedureRoomOrder_Id uint64 `json:"procedureRoomOrder_id"`
ProcedureRoom_Code string `json:"procedureRoom_code" gorm:"size:20"`
Note string `json:"note" gorm:"size:255"`
}
@@ -18,7 +18,8 @@ type ReadListDto struct {
}
type FilterDto struct {
Encounter_Id uint64 `json:"encounter-id"`
Encounter_Id uint64 `json:"encounter-id"`
ProcedureRoomOrder_Id uint64 `json:"procedure-room-order-id"`
}
type ReadDetailDto struct {
@@ -1,14 +1,13 @@
package procedureroomorder
import (
ecore "simrs-vx/internal/domain/base-entities/core"
epr "simrs-vx/internal/domain/main-entities/procedure-room"
epro "simrs-vx/internal/domain/main-entities/procedure-room-order"
eb "simrs-vx/internal/domain/main-entities/procedure-room-order-item/base"
)
type ProcedureRoomOrderItem struct {
ecore.BigMain
ProcedureRoomOrder_Id uint64 `json:"procedureRoomOrder_id"`
ProcedureRoom_Code string `json:"procedureRoom_code" gorm:"size:20"`
ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty" gorm:"foreignKey:ProcedureRoom_Code;references:Code"`
Note string `json:"note" gorm:"size:255"`
eb.ProcedureRoomOrderItem
ProcedureRoomOrder *epro.ProcedureRoomOrder `json:"procedureRoomOrder,omitempty" gorm:"foreignKey:ProcedureRoomOrder_Id;references:Id"`
ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty" gorm:"foreignKey:ProcedureRoom_Code;references:Code"`
}
@@ -9,9 +9,9 @@ import (
)
type CreateDto struct {
Encounter_Id uint64 `json:"encounter_id" validate:"required"`
Infra_Code string `json:"infra_code" validate:"required"`
MaterialPackage_Code string `json:"materialPackage_code" validate:"required"`
Encounter_Id uint64 `json:"encounter_id" validate:"required"`
// Infra_Code string `json:"infra_code" validate:"required"`
MaterialPackage_Code *string `json:"materialPackage_code"`
}
type ReadListDto struct {
@@ -48,7 +48,7 @@ type ResponseDto struct {
Encounter_Id uint64 `json:"encounter_id"`
Encounter *ec.Encounter `json:"encounter,omitempty"`
Infra_Code string `json:"procedure"`
MaterialPackage_Code string `json:"materialPackage_code"`
MaterialPackage_Code *string `json:"materialPackage_code"`
Status_Code erc.DataStatusCode `json:"status_code"`
ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty"`
MaterialPackage *emp.MaterialPackage `json:"materialPackage,omitempty"`
@@ -56,8 +56,8 @@ type ResponseDto struct {
func (d ProcedureRoomOrder) ToResponse() ResponseDto {
resp := ResponseDto{
Encounter_Id: d.Encounter_Id,
Infra_Code: d.Infra_Code,
Encounter_Id: d.Encounter_Id,
// Infra_Code: d.Infra_Code,
MaterialPackage_Code: d.MaterialPackage_Code,
Status_Code: d.Status_Code,
}
@@ -5,15 +5,20 @@ import (
ecore "simrs-vx/internal/domain/base-entities/core"
emp "simrs-vx/internal/domain/main-entities/material-package"
epr "simrs-vx/internal/domain/main-entities/procedure-room"
eproi "simrs-vx/internal/domain/main-entities/procedure-room-order-item/base"
)
type ProcedureRoomOrder struct {
ecore.BigMain
Encounter_Id uint64 `json:"encounter_id"`
Infra_Code string `json:"infra_code" gorm:"size:20"`
ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty" gorm:"foreignKey:Infra_Code;references:Code"`
MaterialPackage_Code string `json:"materialPackage_code" gorm:"size:20"`
MaterialPackage *emp.MaterialPackage `json:"materialPackage,omitempty" gorm:"foreignKey:MaterialPackage_Code;references:Code"`
Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:20"`
Encounter_Id uint64 `json:"encounter_id"`
// Infra_Code string `json:"infra_code" gorm:"size:20"`
// ProcedureRoom *epr.ProcedureRoom `json:"procedureRoom,omitempty" gorm:"foreignKey:Infra_Code;references:Code"`
MaterialPackage_Code *string `json:"materialPackage_code" gorm:"size:20"`
MaterialPackage *emp.MaterialPackage `json:"materialPackage,omitempty" gorm:"foreignKey:MaterialPackage_Code;references:Code"`
Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:20"`
Items []eproi.ProcedureRoomOrderItem `json:"items,omitempty" gorm:"foreignKey:ProcedureRoomOrder_Id;references:Id"`
}
func (d ProcedureRoomOrder) IsNotNew() bool {
return d.Status_Code != erc.DSCNew
}
@@ -25,7 +25,7 @@ type ReadListDto struct {
type FilterDto struct {
Infra_Code *string `json:"infra-code"`
Type_Code string `json:"type_code"`
Type_Code string `json:"type-code"`
Unit_Code *string `json:"unit-code"`
Specialist_Code *string `json:"specialist-code"`
Subspecialist_Code *string `json:"subspecialist-code"`
@@ -386,3 +386,34 @@ type RecordAction struct {
SpecimentDest_Code *string `json:"specimentDest" gorm:"size:100"`
TissueInfo []string `json:"tissueInfo" gorm:"size:100"`
}
type SoapiSrc struct {
Id string `json:"id,omitempty"`
Code string `json:"code,omitempty"`
Name string `json:"name,omitempty"`
IndName string `json:"indName,omitempty"`
}
type EarlyMedicValue struct {
Vaccinated bool `json:"vaccinated,omitempty"`
CaseStatus string `json:"case-status,omitempty"`
EncounterStatus string `json:"encounter-status,omitempty"`
PrimaryComplain string `json:"pri-complain,omitempty"`
CurrentDiseaseHistory string `json:"cur-disea-hist,omitempty"`
SpO2 int `json:"spo2,omitempty"`
SystolicBloodPressure int `json:"syst-bp,omitempty"`
DiastolicBloodPressure int `json:"diast-bp,omitempty"`
RespiratoryRate int `json:"resp-rate,omitempty"`
Pulse int `json:"pulse,omitempty"`
Weight int `json:"weight,omitempty"`
BloodType string `json:"blood-type,omitempty"`
Temperature int `json:"temp,omitempty"`
Height int `json:"height,omitempty"`
PhysicalExamination string `json:"physical-exam,omitempty"`
DiagnoseSrc []SoapiSrc `json:"diagnoseSrc,omitempty"`
ProcedureSrc []SoapiSrc `json:"procedureSrc,omitempty"`
EarlyMedicDiagnose string `json:"early-med-diag,omitempty"`
EarlyMedicPlan string `json:"early-med-plan,omitempty"`
Therapy string `json:"therapy,omitempty"`
ExpectedOutcome []SoapiSrc `json:"expected-outcome,omitempty"`
}
@@ -0,0 +1,51 @@
package t_diagnosadanterapi
import "time"
type TDiagnosaDanTerapi struct {
Idxterapi uint `json:"idxterapi" gorm:"column:idxterapi;primaryKey"`
Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"`
Nomr string `json:"nomr" gorm:"column:nomr"`
Tanggal time.Time `json:"tanggal" gorm:"column:tanggal"`
TekananDarah string `json:"tekanan_darah" gorm:"column:tekanan_darah"`
GolonganDarah string `json:"golongan_darah" gorm:"column:golongan_darah"`
TinggiBadan float64 `json:"tinggi_badan" gorm:"column:tinggi_badan"`
BeratBadan float64 `json:"berat_badan" gorm:"column:berat_badan"`
Diagnosa string `json:"diagnosa" gorm:"column:diagnosa"`
Komplikasi string `json:"komplikasi" gorm:"column:komplikasi"`
Terapi string `json:"terapi" gorm:"column:terapi"`
Anamnesa string `json:"anamnesa" gorm:"column:anamnesa"`
Kdpoly uint `json:"kdpoly" gorm:"column:kdpoly"`
Kddokter uint `json:"kddokter" gorm:"column:kddokter"`
Kdtujuanrujuk uint `json:"kdtujuanrujuk" gorm:"column:kdtujuanrujuk"`
Nip string `json:"nip" gorm:"column:nip"`
IcdCode string `json:"icd_code" gorm:"column:icd_code"`
KunjunganBl uint `json:"kunjungan_bl" gorm:"column:kunjungan_bl"`
KasusBl uint `json:"kasus_bl" gorm:"column:kasus_bl"`
Icdcm string `json:"icdcm" gorm:"column:icdcm"`
Icd9 string `json:"icd_9" gorm:"column:icd_9"`
Klb uint `json:"klb" gorm:"column:klb"`
Bedah uint `json:"bedah" gorm:"column:bedah"`
Jenis uint `json:"jenis" gorm:"column:jenis"`
Perawat string `json:"perawat" gorm:"column:perawat"`
Status string `json:"status" gorm:"column:status"`
PemeriksaanFisik string `json:"pemeriksaan_fisik" gorm:"column:pemeriksaan_fisik"`
RiwayatPasien string `json:"riwayat_pasien" gorm:"column:riwayat_pasien"`
TindakanMedis string `json:"tindakan_medis" gorm:"column:tindakan_medis"`
Rajal uint `json:"rajal" gorm:"column:rajal"`
UserBatal string `json:"user_batal" gorm:"column:user_batal"`
TglBatal *time.Time `json:"tgl_batal" gorm:"column:tgl_batal"`
SudahVaksin string `json:"sudah_vaksin" gorm:"column:sudah_vaksin"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
DenyutJantung string `json:"denyut_jantung" gorm:"column:denyut_jantung"`
Pernapasan string `json:"pernapasan" gorm:"column:pernapasan"`
Suhu string `json:"suhu" gorm:"column:suhu"`
Sp02 string `json:"sp02" gorm:"column:sp02"`
TujuanPerawatan string `json:"tujuan_perawatan" gorm:"column:tujuan_perawatan"`
TargetCapaian string `json:"target_capaian" gorm:"column:target_capaian"`
}
// TableName overrides the table name used by GORM
func (TDiagnosaDanTerapi) TableName() string {
return "t_diagnosadanterapi"
}
@@ -0,0 +1,23 @@
package t_icd_cm
import "time"
type TIcdCm struct {
Idx uint `json:"idx" gorm:"column:idx;primaryKey"`
Nomr string `json:"nomr" gorm:"column:nomr"`
Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"`
Kddokter uint `json:"kddokter" gorm:"column:kddokter"`
Icd string `json:"icd" gorm:"column:icd"`
IcdVerified string `json:"icd_verified" gorm:"column:icd_verified"`
StatusRajal uint16 `json:"status_rajal" gorm:"column:status_rajal"`
Tanggal time.Time `json:"tanggal" gorm:"column:tanggal"`
StatusVerif uint16 `json:"status_verif" gorm:"column:status_verif"`
IcdVerifiedOrder uint16 `json:"icd_verified_order" gorm:"column:icd_verified_order"`
IcdVerifBy string `json:"icd_verif_by" gorm:"column:icd_verif_by"`
IcdVerifDate *time.Time `json:"icd_verif_date" gorm:"column:icd_verif_date"`
IcdActive uint16 `json:"icd_active" gorm:"column:icd_active"`
}
func (TIcdCm) TableName() string {
return "t_icd_cm"
}
@@ -0,0 +1,24 @@
package t_icd
import "time"
type TIcd struct {
Idx uint `json:"idx" gorm:"column:idx;primaryKey"`
Nomr string `json:"nomr" gorm:"column:nomr"`
Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"`
Kddokter uint `json:"kddokter" gorm:"column:kddokter"`
Icd string `json:"icd" gorm:"column:icd"`
IcdVerified string `json:"icd_verified" gorm:"column:icd_verified"`
StatusRajal uint16 `json:"status_rajal" gorm:"column:status_rajal"`
Tanggal time.Time `json:"tanggal" gorm:"column:tanggal"`
StatusVerif uint16 `json:"status_verif" gorm:"column:status_verif"`
IcdVerifiedOrder uint16 `json:"icd_verified_order" gorm:"column:icd_verified_order"`
IcdVerifBy string `json:"icd_verif_by" gorm:"column:icd_verif_by"`
IcdVerifDate *time.Time `json:"icd_verif_date" gorm:"column:icd_verif_date"`
IcdActive uint16 `json:"icd_active" gorm:"column:icd_active"`
StSebabMati uint16 `json:"st_sebab_mati" gorm:"column:st_sebab_mati"`
}
func (TIcd) TableName() string {
return "t_icd"
}
@@ -0,0 +1,22 @@
package t_rekammedik
import "time"
type TRekammedik struct {
TglKirim *time.Time `json:"tgl_kirim" gorm:"column:tgl_kirim"`
TglTerima *time.Time `json:"tgl_terima" gorm:"column:tgl_terima"`
Idxdaftar int `json:"idxdaftar" gorm:"column:idxdaftar"`
Kdpoly int `json:"kdpoly" gorm:"column:kdpoly"`
Pengirim string `json:"pengirim" gorm:"column:pengirim"`
Penerima string `json:"penerima" gorm:"column:penerima"`
Statusrm int `json:"statusrm" gorm:"column:statusrm"`
PenerimaPoly string `json:"penerima_poly" gorm:"column:penerima_poly"`
JamKirimRm string `json:"jam_kirim_rm" gorm:"column:jam_kirim_rm"`
JamTerimaRm string `json:"jam_terima_rm" gorm:"column:jam_terima_rm"`
PjBerkasRm string `json:"pj_berkas_rm" gorm:"column:pj_berkas_rm"`
StatusFisikBerkas string `json:"status_fisik_berkas" gorm:"column:status_fisik_berkas"`
}
func (TRekammedik) TableName() string {
return "t_rekammedik"
}
@@ -0,0 +1,29 @@
package Soapi
import (
ecore "simrs-vx/internal/domain/base-entities/core"
erc "simrs-vx/internal/domain/references/common"
"time"
)
type SoapiLink struct {
ecore.Main
Simx_Id uint `json:"simx_id" gorm:"unique"`
Simgos_Id uint `json:"simgos_id" gorm:"unique"`
}
type SoapiSimxLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
type SoapiSimgosLog struct {
ecore.Main
Value *string `json:"value"`
Date *time.Time `json:"date"`
Status erc.ProcessStatusCode `json:"status"`
ErrMessage *string `json:"errMessage"`
}
@@ -68,4 +68,4 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
dto.Id = uint16(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
}
@@ -34,6 +34,9 @@ import (
practiceschedule "simrs-vx/internal/interface/main-handler/practice-schedule"
prescription "simrs-vx/internal/interface/main-handler/prescription"
prescriptionitem "simrs-vx/internal/interface/main-handler/prescription-item"
procedureroom "simrs-vx/internal/interface/main-handler/procedure-room"
procedureroomorder "simrs-vx/internal/interface/main-handler/procedure-room-order"
procedureroomorderitem "simrs-vx/internal/interface/main-handler/procedure-room-order-item"
responsibledoctorhist "simrs-vx/internal/interface/main-handler/responsible-doctor-hist"
resume "simrs-vx/internal/interface/main-handler/resume"
sbar "simrs-vx/internal/interface/main-handler/sbar"
@@ -270,6 +273,16 @@ func SetRoutes() http.Handler {
"DELETE /{id}": materialorder.O.Delete,
"PATCH /{id}/complete": materialorder.O.Complete,
})
hc.RegCrud(r, "/v1/procedure-room", procedureroom.O)
hk.GroupRoutes("/v1/procedure-room-order", r, auth.GuardMW, hk.MapHandlerFunc{
"GET /": procedureroomorder.O.GetList,
"GET /{id}": procedureroomorder.O.GetDetail,
"POST /": procedureroomorder.O.Create,
"PATCH /{id}": procedureroomorder.O.Update,
"DELETE /{id}": procedureroomorder.O.Delete,
"PATCH /{id}/submit": procedureroomorder.O.Submit,
})
hc.RegCrud(r, "/v1/procedure-room-order-item", procedureroomorderitem.O)
hk.GroupRoutes("/v1/consultation", r, auth.GuardMW, hk.MapHandlerFunc{
"GET /": consultation.O.GetList,
"GET /{id}": consultation.O.GetDetail,
@@ -0,0 +1,71 @@
package procedureroomorder
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/procedure-room-order-item"
u "simrs-vx/internal/use-case/main-use-case/procedure-room-order-item"
)
type myBase struct{}
var O myBase
func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
dto := e.CreateDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.Create(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) {
dto := e.ReadListDto{}
sf.UrlQueryParam(&dto, *r.URL)
res, err := u.ReadList(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.ReadDetailDto{}
dto.Id = uint64(id)
res, err := u.ReadDetail(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.UpdateDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint64(id)
res, err := u.Update(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.DeleteDto{}
dto.Id = uint64(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -0,0 +1,83 @@
package procedureroomorder
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/procedure-room-order"
u "simrs-vx/internal/use-case/main-use-case/procedure-room-order"
)
type myBase struct{}
var O myBase
func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
dto := e.CreateDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.Create(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) {
dto := e.ReadListDto{}
sf.UrlQueryParam(&dto, *r.URL)
res, err := u.ReadList(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.ReadDetailDto{}
dto.Id = uint64(id)
res, err := u.ReadDetail(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.UpdateDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint64(id)
res, err := u.Update(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.DeleteDto{}
dto.Id = uint64(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Submit(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id <= 0 {
return
}
dto := e.ReadDetailDto{}
dto.Id = uint64(id)
res, err := u.Submit(dto)
rw.DataResponse(w, res, err)
}
@@ -0,0 +1,71 @@
package procedureroom
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/procedure-room"
u "simrs-vx/internal/use-case/main-use-case/procedure-room"
)
type myBase struct{}
var O myBase
func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
dto := e.CreateDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.Create(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) {
dto := e.ReadListDto{}
sf.UrlQueryParam(&dto, *r.URL)
res, err := u.ReadList(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.ReadDetailDto{}
dto.Id = uint16(id)
res, err := u.ReadDetail(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.UpdateDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint16(id)
res, err := u.Update(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id == 0 {
return
}
dto := e.DeleteDto{}
dto.Id = uint16(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -7,6 +7,7 @@ import (
installation "simrs-vx/internal/domain/sync-entities/installation"
internalreference "simrs-vx/internal/domain/sync-entities/internal-reference"
patient "simrs-vx/internal/domain/sync-entities/patient"
soapi "simrs-vx/internal/domain/sync-entities/soapi"
specialist "simrs-vx/internal/domain/sync-entities/specialist"
subspecialist "simrs-vx/internal/domain/sync-entities/subspecialist"
unit "simrs-vx/internal/domain/sync-entities/unit"
@@ -38,5 +39,8 @@ func getSyncEntities() []any {
&internalreference.InternalReferenceLink{},
&internalreference.InternalReferenceSimxLog{},
&internalreference.InternalReferenceSimgosLog{},
&soapi.SoapiLink{},
&soapi.SoapiSimxLog{},
&soapi.SoapiSimgosLog{},
}
}
@@ -137,4 +137,4 @@ func DeleteData(data *e.AntibioticInUse, event *pl.Event, dbx ...*gorm.DB) error
pl.SetLogInfo(event, nil, "complete")
return nil
}
}
@@ -100,4 +100,4 @@ func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, inpu
func (me *middlewareRunner) setMwType(mwType pu.MWType) {
me.MwType = mwType
}
}
@@ -6,4 +6,4 @@ package antibioticinuse
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
// }
@@ -41,4 +41,4 @@ var readDetailPostMw []readDetailMw
var updatePreMw []readDetailMw
var updatePostMw []readDetailMw
var deletePreMw []readDetailMw
var deletePostMw []readDetailMw
var deletePostMw []readDetailMw
@@ -277,4 +277,4 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
Data: data.ToResponse(),
}, nil
}
}
@@ -137,4 +137,4 @@ func DeleteData(data *e.AntibioticSrc, event *pl.Event, dbx ...*gorm.DB) error {
pl.SetLogInfo(event, nil, "complete")
return nil
}
}
@@ -65,12 +65,43 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En
tx.Where("\"Responsible_Doctor_Code\" = ?", *input.AuthInfo.Doctor_Code) //
}
tx.Scopes(gh.Preload(input.Includes)).
Scopes(gh.Filter(input.FilterDto)).
if input.StartDate != nil && input.EndDate != nil {
tx = tx.Where(
"DATE(\"Encounter\".\"RegisteredAt\") >= DATE(?) AND DATE(\"Encounter\".\"RegisteredAt\") <= DATE(?)",
input.StartDate,
input.EndDate,
)
}
if input.Patient_Identifier != nil {
tx = tx.Joins("JOIN \"Patient\" ON \"Patient\".\"Id\" = \"Encounter\".\"Patient_Id\"").
Joins("JOIN \"Person\" ON \"Person\".\"Id\" = \"Patient\".\"Person_Id\"").Where("\"Person\".\"Name\" ILIKE ? OR \"Patient\".\"Number\" = ?", "%"+*input.Patient_Identifier+"%", *input.Patient_Identifier)
}
// TODO: getuk lib need to be updated to support this
if input.Status_Code != nil {
tx = tx.Where("\"Encounter\".\"Status_Code\" = ?", *input.Status_Code)
}
if input.Unit_Code != nil {
tx = tx.Where("\"Encounter\".\"Unit_Code\" = ?", *input.Unit_Code)
}
if input.PaymentMethod_Code != nil {
tx = tx.Where("\"Encounter\".\"PaymentMethod_Code\" = ?", *input.PaymentMethod_Code)
}
tx = tx.Scopes(gh.Preload(input.Includes)).
Count(&count).
Scopes(gh.Paginate(input, &pagination)).
Order("\"CreatedAt\" DESC")
// tx.Debug().Scopes(gh.Preload(input.Includes)).
// Scopes(gh.Filter(input.FilterDto)).
// Count(&count).
// Scopes(gh.Paginate(input, &pagination)).
// Order("\"CreatedAt\" DESC")
if err := tx.Find(&data).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return nil, &meta, nil
@@ -0,0 +1,276 @@
package procedureroomorderitem
import (
e "simrs-vx/internal/domain/main-entities/procedure-room-order-item"
"strconv"
dg "github.com/karincake/apem/db-gorm-pg"
d "github.com/karincake/dodol"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
"gorm.io/gorm"
)
const source = "procedure-room-order-item"
func Create(input e.CreateDto) (*d.Data, error) {
data := e.ProcedureRoomOrderItem{}
event := pl.Event{
Feature: "Create",
Source: source,
}
// 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 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
})
if err != nil {
return nil, err
}
return &d.Data{
Meta: d.II{
"source": source,
"structure": "single-data",
"status": "created",
},
Data: data.ToResponse(),
}, nil
}
func ReadList(input e.ReadListDto) (*d.Data, error) {
var data *e.ProcedureRoomOrderItem
var dataList []e.ProcedureRoomOrderItem
var metaList *e.MetaDto
var err error
event := pl.Event{
Feature: "ReadList",
Source: source,
}
// 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 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 {
return nil, err
}
return &d.Data{
Meta: d.IS{
"source": source,
"structure": "list-data",
"status": "fetched",
"page_number": strconv.Itoa(metaList.PageNumber),
"page_size": strconv.Itoa(metaList.PageSize),
"record_totalCount": strconv.Itoa(metaList.Count),
"record_currentCount": strconv.Itoa(len(dataList)),
},
Data: e.ToResponseList(dataList),
}, nil
}
func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
var data *e.ProcedureRoomOrderItem
var err error
event := pl.Event{
Feature: "ReadDetail",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "readDetail")
err = dg.I.Transaction(func(tx *gorm.DB) error {
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil {
return err
}
if data, err = ReadDetailData(input, &event, tx); err != nil {
return err
}
mwRunner.setMwType(pu.MWTPost)
// Run post-middleware
if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, 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": "fetched",
},
Data: data.ToResponse(),
}, nil
}
func Update(input e.UpdateDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: input.Id}
var data *e.ProcedureRoomOrderItem
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{Id: input.Id}
var data *e.ProcedureRoomOrderItem
var err error
event := pl.Event{
Feature: "Delete",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "delete")
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.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil {
return err
}
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 {
return err
}
return nil
})
if err != nil {
return nil, err
}
return &d.Data{
Meta: d.IS{
"source": source,
"structure": "single-data",
"status": "deleted",
},
Data: data.ToResponse(),
}, nil
}
@@ -0,0 +1,23 @@
/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package procedureroomorderitem
import (
e "simrs-vx/internal/domain/main-entities/procedure-room-order-item"
)
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureRoomOrderItem) {
var inputSrc *e.CreateDto
if inputT, ok := any(input).(*e.CreateDto); ok {
inputSrc = inputT
} else {
inputTemp := any(input).(*e.UpdateDto)
inputSrc = &inputTemp.CreateDto
}
data.ProcedureRoomOrder_Id = inputSrc.ProcedureRoomOrder_Id
data.ProcedureRoom_Code = inputSrc.ProcedureRoom_Code
data.Note = inputSrc.Note
}
@@ -0,0 +1,151 @@
package procedureroomorderitem
import (
e "simrs-vx/internal/domain/main-entities/procedure-room-order-item"
plh "simrs-vx/pkg/lib-helper"
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"
"gorm.io/gorm"
)
func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoomOrderItem, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
deletedData := e.ProcedureRoomOrderItem{}
tx.Unscoped().
Where("\"ProcedureRoomOrder_Id\" = ? AND \"ProcedureRoom_Code\" = ?", input.ProcedureRoomOrder_Id, input.ProcedureRoom_Code).
First(&deletedData)
if deletedData.Id != 0 {
if err := tx.Unscoped().Model(e.ProcedureRoomOrderItem{}).Where("\"Id\" = ?", deletedData.Id).Update("\"DeletedAt\"", nil).Error; err != nil {
return nil, plh.HandleCreateError(input, event, err)
}
return &deletedData, nil
}
data := e.ProcedureRoomOrderItem{}
setData(&input, &data)
if err := tx.Create(&data).Error; err != nil {
return nil, plh.HandleCreateError(input, event, err)
}
pl.SetLogInfo(event, nil, "complete")
return &data, nil
}
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ProcedureRoomOrderItem, *e.MetaDto, error) {
pl.SetLogInfo(event, input, "started", "DBReadList")
data := []e.ProcedureRoomOrderItem{}
pagination := gh.Pagination{}
count := int64(0)
meta := e.MetaDto{}
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
tx = tx.
Model(&e.ProcedureRoomOrderItem{}).
Scopes(gh.Preload(input.Includes)).
Scopes(gh.Filter(input.FilterDto)).
Count(&count).
Scopes(gh.Paginate(input, &pagination)).
Order("\"CreatedAt\" DESC")
if err := tx.Find(&data).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return nil, &meta, nil
}
return nil, nil, plh.HandleListError(input, event, err)
}
meta.Count = int(count)
meta.PageNumber = pagination.PageNumber
meta.PageSize = pagination.PageSize
pl.SetLogInfo(event, nil, "complete")
return data, &meta, nil
}
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoomOrderItem, error) {
pl.SetLogInfo(event, input, "started", "DBReadDetail")
data := e.ProcedureRoomOrderItem{}
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
if err := tx.Scopes(gh.Preload(input.Includes)).First(&data, input.Id).Error; err != nil {
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
return nil, processedErr
}
}
pl.SetLogInfo(event, nil, "complete")
return &data, nil
}
func UpdateData(input e.UpdateDto, data *e.ProcedureRoomOrderItem, 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 DeleteData(data *e.ProcedureRoomOrderItem, 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.I
}
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
}
@@ -0,0 +1,103 @@
package procedureroomorderitem
import (
e "simrs-vx/internal/domain/main-entities/procedure-room-order-item"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
"gorm.io/gorm"
)
type middlewareRunner struct {
Event *pl.Event
Tx *gorm.DB
MwType pu.MWType
}
// NewMiddlewareExecutor creates a new middleware executor
func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner {
return &middlewareRunner{
Event: event,
Tx: tx,
}
}
// ExecuteCreateMiddleware executes create middleware
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ProcedureRoomOrderItem) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ProcedureRoomOrderItem) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrderItem) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrderItem) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrderItem) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) setMwType(mwType pu.MWType) {
me.MwType = mwType
}
@@ -0,0 +1,9 @@
package procedureroomorderitem
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
@@ -0,0 +1,44 @@
/*
DESCRIPTION:
A sample, part of the package that contains type, constants, and/or variables.
In this sample it also provides type and variable regarding the needs of the
middleware to separate from main use-case which has the basic CRUD
functionality. The purpose of this is to make the code more maintainable.
*/
package procedureroomorderitem
import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/procedure-room-order-item"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.ProcedureRoomOrderItem, tx *gorm.DB) error
}
type readListMw struct {
Name string
Func func(input *e.ReadListDto, data *e.ProcedureRoomOrderItem, tx *gorm.DB) error
}
type readDetailMw struct {
Name string
Func func(input *e.ReadDetailDto, data *e.ProcedureRoomOrderItem, tx *gorm.DB) error
}
type UpdateMw = readDetailMw
type DeleteMw = readDetailMw
var createPreMw []createMw // preprocess middleware
var createPostMw []createMw // postprocess middleware
var readListPreMw []readListMw // ..
var readListPostMw []readListMw // ..
var readDetailPreMw []readDetailMw
var readDetailPostMw []readDetailMw
var updatePreMw []readDetailMw
var updatePostMw []readDetailMw
var deletePreMw []readDetailMw
var deletePostMw []readDetailMw
@@ -0,0 +1,338 @@
package procedureroomorder
import (
"errors"
"strconv"
"gorm.io/gorm"
dg "github.com/karincake/apem/db-gorm-pg"
d "github.com/karincake/dodol"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
e "simrs-vx/internal/domain/main-entities/procedure-room-order"
erc "simrs-vx/internal/domain/references/common"
)
const source = "procedure-room-order"
func Create(input e.CreateDto) (*d.Data, error) {
data := e.ProcedureRoomOrder{}
event := pl.Event{
Feature: "Create",
Source: source,
}
// 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 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
})
if err != nil {
return nil, err
}
return &d.Data{
Meta: d.II{
"source": source,
"structure": "single-data",
"status": "created",
},
Data: data.ToResponse(),
}, nil
}
func ReadList(input e.ReadListDto) (*d.Data, error) {
var data *e.ProcedureRoomOrder
var dataList []e.ProcedureRoomOrder
var metaList *e.MetaDto
var err error
event := pl.Event{
Feature: "ReadList",
Source: source,
}
// 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 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 {
return nil, err
}
return &d.Data{
Meta: d.IS{
"source": source,
"structure": "list-data",
"status": "fetched",
"page_number": strconv.Itoa(metaList.PageNumber),
"page_size": strconv.Itoa(metaList.PageSize),
"record_totalCount": strconv.Itoa(metaList.Count),
"record_currentCount": strconv.Itoa(len(dataList)),
},
Data: e.ToResponseList(dataList),
}, nil
}
func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
var data *e.ProcedureRoomOrder
var err error
event := pl.Event{
Feature: "ReadDetail",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "readDetail")
err = dg.I.Transaction(func(tx *gorm.DB) error {
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil {
return err
}
if data, err = ReadDetailData(input, &event, tx); err != nil {
return err
}
mwRunner.setMwType(pu.MWTPost)
// Run post-middleware
if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, 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": "fetched",
},
Data: data.ToResponse(),
}, nil
}
func Update(input e.UpdateDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: input.Id}
var data *e.ProcedureRoomOrder
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{Id: input.Id}
var data *e.ProcedureRoomOrder
var err error
event := pl.Event{
Feature: "Delete",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "delete")
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.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil {
return err
}
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 {
return err
}
return nil
})
if err != nil {
return nil, err
}
return &d.Data{
Meta: d.IS{
"source": source,
"structure": "single-data",
"status": "deleted",
},
Data: data.ToResponse(),
}, nil
}
func Submit(input e.ReadDetailDto) (*d.Data, error) {
var data *e.ProcedureRoomOrder
var err error
event := pl.Event{
Feature: "Process",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "process")
err = dg.I.Transaction(func(tx *gorm.DB) error {
data, err = ReadDetailData(input, &event, tx)
if err != nil {
return err
}
if data.IsNotNew() {
event.Status = "failed"
event.ErrInfo = pl.ErrorInfo{
Code: "data-state-mismatch",
Detail: source + " is not in new state",
Raw: errors.New(source + " is not in new state"),
}
return pl.SetLogError(&event, input)
}
data.Status_Code = erc.DSCSubmited
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
})
if err != nil {
return nil, err
}
return &d.Data{
Meta: d.IS{
"source": source,
"structure": "single-data",
"status": "submited",
},
Data: data.ToResponse(),
}, nil
}
@@ -0,0 +1,24 @@
/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package procedureroomorder
import (
e "simrs-vx/internal/domain/main-entities/procedure-room-order"
erc "simrs-vx/internal/domain/references/common"
)
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureRoomOrder) {
var inputSrc *e.CreateDto
if inputT, ok := any(input).(*e.CreateDto); ok {
inputSrc = inputT
} else {
inputTemp := any(input).(*e.UpdateDto)
inputSrc = &inputTemp.CreateDto
}
data.Encounter_Id = inputSrc.Encounter_Id
data.MaterialPackage_Code = inputSrc.MaterialPackage_Code
data.Status_Code = erc.DSCNew
}
@@ -0,0 +1,140 @@
package procedureroomorder
import (
e "simrs-vx/internal/domain/main-entities/procedure-room-order"
plh "simrs-vx/pkg/lib-helper"
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"
"gorm.io/gorm"
)
func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoomOrder, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
data := e.ProcedureRoomOrder{}
setData(&input, &data)
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
if err := tx.Create(&data).Error; err != nil {
return nil, plh.HandleCreateError(input, event, err)
}
pl.SetLogInfo(event, nil, "complete")
return &data, nil
}
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ProcedureRoomOrder, *e.MetaDto, error) {
pl.SetLogInfo(event, input, "started", "DBReadList")
data := []e.ProcedureRoomOrder{}
pagination := gh.Pagination{}
count := int64(0)
meta := e.MetaDto{}
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
tx = tx.
Model(&e.ProcedureRoomOrder{}).
Scopes(gh.Preload(input.Includes)).
Scopes(gh.Filter(input.FilterDto)).
Count(&count).
Scopes(gh.Paginate(input, &pagination)).
Order("\"CreatedAt\" DESC")
if err := tx.Find(&data).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return nil, &meta, nil
}
return nil, nil, plh.HandleListError(input, event, err)
}
meta.Count = int(count)
meta.PageNumber = pagination.PageNumber
meta.PageSize = pagination.PageSize
pl.SetLogInfo(event, nil, "complete")
return data, &meta, nil
}
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureRoomOrder, error) {
pl.SetLogInfo(event, input, "started", "DBReadDetail")
data := e.ProcedureRoomOrder{}
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
if err := tx.First(&data, input.Id).Error; err != nil {
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
return nil, processedErr
}
}
pl.SetLogInfo(event, nil, "complete")
return &data, nil
}
func UpdateData(input e.UpdateDto, data *e.ProcedureRoomOrder, 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 DeleteData(data *e.ProcedureRoomOrder, 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.I
}
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
}
@@ -0,0 +1,103 @@
package procedureroomorder
import (
e "simrs-vx/internal/domain/main-entities/procedure-room-order"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
"gorm.io/gorm"
)
type middlewareRunner struct {
Event *pl.Event
Tx *gorm.DB
MwType pu.MWType
}
// NewMiddlewareExecutor creates a new middleware executor
func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner {
return &middlewareRunner{
Event: event,
Tx: tx,
}
}
// ExecuteCreateMiddleware executes create middleware
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ProcedureRoomOrder) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ProcedureRoomOrder) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrder) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrder) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureRoomOrder) error {
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
func (me *middlewareRunner) setMwType(mwType pu.MWType) {
me.MwType = mwType
}
@@ -0,0 +1,9 @@
package procedureroomorder
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
@@ -0,0 +1,44 @@
/*
DESCRIPTION:
A sample, part of the package that contains type, constants, and/or variables.
In this sample it also provides type and variable regarding the needs of the
middleware to separate from main use-case which has the basic CRUD
functionality. The purpose of this is to make the code more maintainable.
*/
package procedureroomorder
import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/procedure-room-order"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.ProcedureRoomOrder, tx *gorm.DB) error
}
type readListMw struct {
Name string
Func func(input *e.ReadListDto, data *e.ProcedureRoomOrder, tx *gorm.DB) error
}
type readDetailMw struct {
Name string
Func func(input *e.ReadDetailDto, data *e.ProcedureRoomOrder, tx *gorm.DB) error
}
type UpdateMw = readDetailMw
type DeleteMw = readDetailMw
var createPreMw []createMw // preprocess middleware
var createPostMw []createMw // postprocess middleware
var readListPreMw []readListMw // ..
var readListPostMw []readListMw // ..
var readDetailPreMw []readDetailMw
var readDetailPostMw []readDetailMw
var updatePreMw []readDetailMw
var updatePostMw []readDetailMw
var deletePreMw []readDetailMw
var deletePostMw []readDetailMw