From dd409e5c5e1b41674db2125b887bf674bcda84f0 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 4 Sep 2025 21:15:11 +0700 Subject: [PATCH] refactor --- cmd/migration/migrations/20250904141448.sql | 10 ++++++++++ cmd/migration/migrations/atlas.sum | 3 ++- internal/domain/main-entities/doctor/entity.go | 4 ++-- .../domain/main-entities/laborant/entity.go | 2 +- internal/domain/main-entities/nurse/entity.go | 2 +- .../domain/main-entities/nutritionist/entity.go | 2 +- .../domain/main-entities/pharmacist/entity.go | 2 +- internal/use-case/main-use-case/employee/lib.go | 15 ++++++++++++++- .../main-use-case/specialist-intern/lib.go | 9 ++++++++- internal/use-case/main-use-case/user/case.go | 17 +++++++++++------ internal/use-case/main-use-case/user/helper.go | 13 ++++++++----- 11 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 cmd/migration/migrations/20250904141448.sql diff --git a/cmd/migration/migrations/20250904141448.sql b/cmd/migration/migrations/20250904141448.sql new file mode 100644 index 00000000..56a113ca --- /dev/null +++ b/cmd/migration/migrations/20250904141448.sql @@ -0,0 +1,10 @@ +-- Modify "Doctor" table +ALTER TABLE "public"."Doctor" ADD CONSTRAINT "uni_Doctor_IHS_Number" UNIQUE ("IHS_Number"), ADD CONSTRAINT "uni_Doctor_SIP_Number" UNIQUE ("SIP_Number"); +-- Modify "Laborant" table +ALTER TABLE "public"."Laborant" ADD CONSTRAINT "uni_Laborant_IHS_Number" UNIQUE ("IHS_Number"); +-- Modify "Nurse" table +ALTER TABLE "public"."Nurse" ADD CONSTRAINT "uni_Nurse_IHS_Number" UNIQUE ("IHS_Number"); +-- Modify "Nutritionist" table +ALTER TABLE "public"."Nutritionist" ADD CONSTRAINT "uni_Nutritionist_IHS_Number" UNIQUE ("IHS_Number"); +-- Modify "Pharmacist" table +ALTER TABLE "public"."Pharmacist" ADD CONSTRAINT "uni_Pharmacist_IHS_Number" UNIQUE ("IHS_Number"); diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index fe2b15b0..10859e9b 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,2 +1,3 @@ -h1:5CRUsZFEhBmTlYz30l5g/ilZWIUjrfTf7K0qa5ffXQg= +h1:G2T3Gv3jMXqZDaBw/lSU8IhowMI3z//r+ZtHxndsLc4= 20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= diff --git a/internal/domain/main-entities/doctor/entity.go b/internal/domain/main-entities/doctor/entity.go index 55d45354..cf952380 100644 --- a/internal/domain/main-entities/doctor/entity.go +++ b/internal/domain/main-entities/doctor/entity.go @@ -12,8 +12,8 @@ type Doctor struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` - SIP_Number *string `json:"sip_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` + SIP_Number *string `json:"sip_number" gorm:"unique;size:20"` Unit_Id *uint16 `json:"unit_id"` Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` Specialist_Id *uint16 `json:"specialist_id"` diff --git a/internal/domain/main-entities/laborant/entity.go b/internal/domain/main-entities/laborant/entity.go index 82870b06..eeb63bef 100644 --- a/internal/domain/main-entities/laborant/entity.go +++ b/internal/domain/main-entities/laborant/entity.go @@ -9,5 +9,5 @@ type Laborant struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` } diff --git a/internal/domain/main-entities/nurse/entity.go b/internal/domain/main-entities/nurse/entity.go index 732a58ec..c3332c45 100644 --- a/internal/domain/main-entities/nurse/entity.go +++ b/internal/domain/main-entities/nurse/entity.go @@ -11,7 +11,7 @@ type Nurse struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` Unit_Id *uint16 `json:"unit_id"` Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` Infra_Id *uint16 `json:"infra_id"` diff --git a/internal/domain/main-entities/nutritionist/entity.go b/internal/domain/main-entities/nutritionist/entity.go index 8956b8b4..be431f66 100644 --- a/internal/domain/main-entities/nutritionist/entity.go +++ b/internal/domain/main-entities/nutritionist/entity.go @@ -9,5 +9,5 @@ type Nutritionist struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` } diff --git a/internal/domain/main-entities/pharmacist/entity.go b/internal/domain/main-entities/pharmacist/entity.go index 352fa9ba..318cc97e 100644 --- a/internal/domain/main-entities/pharmacist/entity.go +++ b/internal/domain/main-entities/pharmacist/entity.go @@ -9,5 +9,5 @@ type Pharmacist struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` } diff --git a/internal/use-case/main-use-case/employee/lib.go b/internal/use-case/main-use-case/employee/lib.go index ed58bed7..377fdfb8 100644 --- a/internal/use-case/main-use-case/employee/lib.go +++ b/internal/use-case/main-use-case/employee/lib.go @@ -102,7 +102,20 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = tx.Preload("Person.Contacts") tx = tx.Preload("Person.Relatives") - if err := tx.First(&data, input.Id).Error; err != nil { + if input.User_Id != nil { + tx = tx.Where("\"User_Id\" = ?", *input.User_Id) + } + if input.Person_Id != nil { + tx = tx.Where("\"Person_Id\" = ?", *input.Person_Id) + } + if input.Number != nil { + tx = tx.Where("\"Number\" = ?", *input.Number) + } + if input.Id != 0 { + tx = tx.Where("\"Id\" = ?", input.Id) + } + + if err := tx.First(&data).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr } diff --git a/internal/use-case/main-use-case/specialist-intern/lib.go b/internal/use-case/main-use-case/specialist-intern/lib.go index aaa07acb..81c0f0a9 100644 --- a/internal/use-case/main-use-case/specialist-intern/lib.go +++ b/internal/use-case/main-use-case/specialist-intern/lib.go @@ -96,7 +96,14 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = dg.I } - if err := tx.First(&data, input.Id).Error; err != nil { + if input.User_Id != nil { + tx = tx.Where("\"User_Id\" = ?", *input.User_Id) + } + if input.Id > 0 { + tx = tx.Where("\"Id\" = ?", input.Id) + } + + if err := tx.First(&data).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr } diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index 177a62b2..ae1e8464 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -341,7 +341,12 @@ func Update(input e.UpdateDto) (*d.Data, error) { if err != nil { return err } - createInt := esi.CreateDto{} + createInt := esi.CreateDto{ + User_Id: &data.Id, + Person_Id: input.Person_Id, + Specialist_Id: input.Specialist_Id, + Subspecialist_Id: input.Subspecialist_Id, + } if readIntData != nil { if err := usi.UpdateData(esi.UpdateDto{CreateDto: createInt}, readIntData, &event, tx); err != nil { return err @@ -368,7 +373,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { switch input.Position_Code { case ero.UPCDoc: - readDoc := ed.ReadDetailDto{Employee_Id: &data.Id} + readDoc := ed.ReadDetailDto{Employee_Id: &employeeData.Id} readDocData, err := ud.ReadDetailData(readDoc, &event, tx) if err != nil { return err @@ -390,7 +395,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } case ero.UPCNur: - readNur := en.ReadDetailDto{Employee_Id: &data.Id} + readNur := en.ReadDetailDto{Employee_Id: &employeeData.Id} readNurData, err := un.ReadDetailData(readNur, &event, tx) if err != nil { return err @@ -410,7 +415,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } case ero.UPCNut: - readNut := et.ReadDetailDto{Employee_Id: &data.Id} + readNut := et.ReadDetailDto{Employee_Id: &employeeData.Id} readNutData, err := ut.ReadDetailData(readNut, &event, tx) if err != nil { return err @@ -430,7 +435,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } case ero.UPCPha: - readPha := ep.ReadDetailDto{Employee_Id: &data.Id} + readPha := ep.ReadDetailDto{Employee_Id: &employeeData.Id} readPhaData, err := up.ReadDetailData(readPha, &event, tx) if err != nil { return err @@ -450,7 +455,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } case ero.UPCLab: - readLab := el.ReadDetailDto{Employee_Id: &data.Id} + readLab := el.ReadDetailDto{Employee_Id: &employeeData.Id} readLabData, err := ul.ReadDetailData(readLab, &event, tx) if err != nil { return err diff --git a/internal/use-case/main-use-case/user/helper.go b/internal/use-case/main-use-case/user/helper.go index bdb1c75c..111d333f 100644 --- a/internal/use-case/main-use-case/user/helper.go +++ b/internal/use-case/main-use-case/user/helper.go @@ -5,6 +5,7 @@ Any functions that are used internally by the use-case package user import ( + "errors" ee "simrs-vx/internal/domain/main-entities/employee" esi "simrs-vx/internal/domain/main-entities/specialist-intern" e "simrs-vx/internal/domain/main-entities/user" @@ -56,18 +57,20 @@ func setDataEmployeeUpdate(src e.EmployeUpdateDto) ee.UpdateDto { func getPersonIdByUserId(userId uint, positionCode ero.UserPosisitionCode, event *pl.Event, tx *gorm.DB) (*uint, error) { pl.SetLogInfo(event, nil, "started", "DBGetPersonIdByUserId") if positionCode == ero.UPCInt { - person, err := usi.ReadDetailData(esi.ReadDetailDto{User_Id: &userId}, event, tx) + specInt, err := usi.ReadDetailData(esi.ReadDetailDto{User_Id: &userId}, event, tx) if err != nil { return nil, err } - - return &person.Id, nil + if specInt.Person_Id == nil { + return nil, errors.New("person id not found") + } + return specInt.Person_Id, nil } - person, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &userId}, event, tx) + emp, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &userId}, event, tx) if err != nil { return nil, err } - return &person.Id, nil + return emp.Person_Id, nil }