diff --git a/cmd/main-migration/migrations/20251110085551.sql b/cmd/main-migration/migrations/20251110085551.sql new file mode 100644 index 00000000..8cdcbc3b --- /dev/null +++ b/cmd/main-migration/migrations/20251110085551.sql @@ -0,0 +1,8 @@ +-- Modify "DeviceOrder" table +ALTER TABLE "public"."DeviceOrder" ADD COLUMN "Doctor_Code" text NULL; +-- Modify "Inpatient" table +ALTER TABLE "public"."Inpatient" ADD COLUMN "Infra_Code" character varying(10) NULL; +-- Modify "MaterialOrder" table +ALTER TABLE "public"."MaterialOrder" ADD COLUMN "Doctor_Code" text NULL; +-- Modify "McuOrder" table +ALTER TABLE "public"."McuOrder" ADD COLUMN "Doctor_Code" text NULL; diff --git a/cmd/main-migration/migrations/20251110091516.sql b/cmd/main-migration/migrations/20251110091516.sql new file mode 100644 index 00000000..10010abb --- /dev/null +++ b/cmd/main-migration/migrations/20251110091516.sql @@ -0,0 +1,8 @@ +-- Modify "DeviceOrder" table +ALTER TABLE "public"."DeviceOrder" DROP CONSTRAINT "fk_DeviceOrder_Doctor", DROP COLUMN "Doctor_Id", ALTER COLUMN "Doctor_Code" TYPE character varying(20), ADD CONSTRAINT "fk_DeviceOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "Inpatient" table +ALTER TABLE "public"."Inpatient" DROP CONSTRAINT "fk_Inpatient_Infra", DROP COLUMN "Infra_Id", ADD CONSTRAINT "fk_Inpatient_Infra" FOREIGN KEY ("Infra_Code") REFERENCES "public"."Infra" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "MaterialOrder" table +ALTER TABLE "public"."MaterialOrder" DROP CONSTRAINT "fk_MaterialOrder_Doctor", DROP COLUMN "Doctor_Id", ALTER COLUMN "Doctor_Code" TYPE character varying(20), ADD CONSTRAINT "fk_MaterialOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "McuOrder" table +ALTER TABLE "public"."McuOrder" DROP CONSTRAINT "fk_McuOrder_Doctor", DROP COLUMN "Doctor_Id", ALTER COLUMN "Doctor_Code" TYPE character varying(20), ADD CONSTRAINT "fk_McuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251110091948.sql b/cmd/main-migration/migrations/20251110091948.sql new file mode 100644 index 00000000..452f56ad --- /dev/null +++ b/cmd/main-migration/migrations/20251110091948.sql @@ -0,0 +1,4 @@ +-- Modify "DeviceOrderItem" table +ALTER TABLE "public"."DeviceOrderItem" ADD COLUMN "Device_Code" text NULL; +-- Modify "MaterialOrderItem" table +ALTER TABLE "public"."MaterialOrderItem" ADD COLUMN "Material_Code" text NULL; diff --git a/cmd/main-migration/migrations/20251110092729.sql b/cmd/main-migration/migrations/20251110092729.sql new file mode 100644 index 00000000..7f4702ab --- /dev/null +++ b/cmd/main-migration/migrations/20251110092729.sql @@ -0,0 +1,4 @@ +-- Modify "DeviceOrderItem" table +ALTER TABLE "public"."DeviceOrderItem" DROP CONSTRAINT "fk_DeviceOrderItem_Device", DROP COLUMN "Device_Id", ALTER COLUMN "Device_Code" TYPE character varying(10), ADD CONSTRAINT "fk_DeviceOrderItem_Device" FOREIGN KEY ("Device_Code") REFERENCES "public"."Device" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "MaterialOrderItem" table +ALTER TABLE "public"."MaterialOrderItem" DROP CONSTRAINT "fk_MaterialOrderItem_Material", DROP COLUMN "Material_Id", ALTER COLUMN "Material_Code" TYPE character varying(10), ADD CONSTRAINT "fk_MaterialOrderItem_Material" FOREIGN KEY ("Material_Code") REFERENCES "public"."Material" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251110093522.sql b/cmd/main-migration/migrations/20251110093522.sql new file mode 100644 index 00000000..8ed5f757 --- /dev/null +++ b/cmd/main-migration/migrations/20251110093522.sql @@ -0,0 +1,8 @@ +-- Modify "McuSrc" table +ALTER TABLE "public"."McuSrc" ALTER COLUMN "Code" SET NOT NULL, ADD COLUMN "Item_Code" text NULL; +-- Modify "McuSubSrc" table +ALTER TABLE "public"."McuSubSrc" ADD COLUMN "McuSrc_Code" text NULL; +-- Modify "MedicalActionSrc" table +ALTER TABLE "public"."MedicalActionSrc" ADD COLUMN "Item_Code" text NULL; +-- Modify "MedicalActionSrcItem" table +ALTER TABLE "public"."MedicalActionSrcItem" ADD COLUMN "MedicalActionSrc_Code" text NULL, ADD COLUMN "ProcedureSrc_Code" text NULL, ADD COLUMN "Item_Code" text NULL; diff --git a/cmd/main-migration/migrations/20251110100258.sql b/cmd/main-migration/migrations/20251110100258.sql new file mode 100644 index 00000000..9d902938 --- /dev/null +++ b/cmd/main-migration/migrations/20251110100258.sql @@ -0,0 +1,8 @@ +-- Modify "McuSrc" table +ALTER TABLE "public"."McuSrc" DROP CONSTRAINT "fk_McuSrc_Item", DROP COLUMN "Item_Id", ALTER COLUMN "Item_Code" TYPE character varying(50), ADD CONSTRAINT "fk_McuSrc_Item" FOREIGN KEY ("Item_Code") REFERENCES "public"."Item" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "McuSubSrc" table +ALTER TABLE "public"."McuSubSrc" DROP CONSTRAINT "fk_McuSubSrc_McuSrc", DROP COLUMN "McuSrc_Id", ALTER COLUMN "McuSrc_Code" TYPE character varying(20), ADD COLUMN "Item_Code" text NULL, ADD CONSTRAINT "fk_McuSubSrc_McuSrc" FOREIGN KEY ("McuSrc_Code") REFERENCES "public"."McuSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "MedicalActionSrc" table +ALTER TABLE "public"."MedicalActionSrc" DROP CONSTRAINT "fk_MedicalActionSrc_Item", DROP COLUMN "Item_Id", ALTER COLUMN "Item_Code" TYPE character varying(50), ADD CONSTRAINT "fk_MedicalActionSrc_Item" FOREIGN KEY ("Item_Code") REFERENCES "public"."Item" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "MedicalActionSrcItem" table +ALTER TABLE "public"."MedicalActionSrcItem" DROP CONSTRAINT "fk_MedicalActionSrcItem_Item", DROP CONSTRAINT "fk_MedicalActionSrcItem_MedicalActionSrc", DROP CONSTRAINT "fk_MedicalActionSrcItem_ProcedureSrc", DROP COLUMN "MedicalActionSrc_Id", DROP COLUMN "ProcedureSrc_Id", DROP COLUMN "Item_Id", ALTER COLUMN "MedicalActionSrc_Code" TYPE character varying(20), ALTER COLUMN "ProcedureSrc_Code" TYPE character varying(10), ALTER COLUMN "Item_Code" TYPE character varying(50), ADD CONSTRAINT "fk_MedicalActionSrcItem_Item" FOREIGN KEY ("Item_Code") REFERENCES "public"."Item" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_MedicalActionSrcItem_MedicalActionSrc" FOREIGN KEY ("MedicalActionSrc_Code") REFERENCES "public"."MedicalActionSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_MedicalActionSrcItem_ProcedureSrc" FOREIGN KEY ("ProcedureSrc_Code") REFERENCES "public"."ProcedureSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251110100545.sql b/cmd/main-migration/migrations/20251110100545.sql new file mode 100644 index 00000000..3fdc6a82 --- /dev/null +++ b/cmd/main-migration/migrations/20251110100545.sql @@ -0,0 +1,2 @@ +-- Modify "McuSubSrc" table +ALTER TABLE "public"."McuSubSrc" DROP CONSTRAINT "fk_McuSubSrc_Item", DROP COLUMN "Item_Id", ALTER COLUMN "Item_Code" TYPE character varying(50), ADD CONSTRAINT "fk_McuSubSrc_Item" FOREIGN KEY ("Item_Code") REFERENCES "public"."Item" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20251110155448.sql b/cmd/main-migration/migrations/20251110155448.sql new file mode 100644 index 00000000..203a27cb --- /dev/null +++ b/cmd/main-migration/migrations/20251110155448.sql @@ -0,0 +1,6 @@ +-- Modify "AuthPartner" table +ALTER TABLE "public"."AuthPartner" ALTER COLUMN "Id" TYPE integer; +-- Modify "UserFes" table +ALTER TABLE "public"."UserFes" ALTER COLUMN "AuthPartner_Code" TYPE character varying(50); +-- Create index "idx-userFes-name-authPartner_code" to table: "UserFes" +CREATE UNIQUE INDEX "idx-userFes-name-authPartner_code" ON "public"."UserFes" ("Name", "AuthPartner_Code"); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index ef1f8795..3fb0c8b0 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:4mUEGaMHpVG5OAo3DgtsqGkPtWwCZDAk0H5y2cG1QP4= +h1:G3qRvFBAP/TQryQugzXbMshM2Pw9VqQpw3gXWUzam0A= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -101,3 +101,11 @@ h1:4mUEGaMHpVG5OAo3DgtsqGkPtWwCZDAk0H5y2cG1QP4= 20251110062042.sql h1:WnfVUXrzYoj8qdkkjO9/JQQ8agGd4GfSHQdMjo7LDAg= 20251110063202.sql h1:hSzGfwVMWa6q3vwIQZUkxKgBNCzHjB+6GKy54zfV+oQ= 20251110063633.sql h1:/VpofIAqNS1CnazEnpW/+evbzn9Kew3xDW48r57M+Xg= +20251110085551.sql h1:bFZwSmfvVbTUr/enWB82WqjG88gpqcZ6s45btUvO0uo= +20251110091516.sql h1:KkJMwPQuaZQhiqnKrNQrgP12gw9rV8T3P2o3mtGTcvY= +20251110091948.sql h1:I4odAYrJdvNf1jPw6ppDC0XdI7v6vKBACg/ABwUgA7I= +20251110092729.sql h1:l1out8soEmVP6dNjaIOtGYo6QDcoJZRI8X1sjZ5ZGmo= +20251110093522.sql h1:nsz8jCxGjEdr/bz9g+4ozfZzIP803xONjVmucad1GMc= +20251110100258.sql h1:IBqt1VZj5WjQ+l9aAFGHOCCBtzb03KlLLihFLut7itg= +20251110100545.sql h1:6/LV7751iyKxE2xI6vO1zly+aHUwxXD/IBwLcVpKxqM= +20251110155448.sql h1:kFPobJB+cpflsXBAWUwy3lohuWvrb/VRlXnhJWl7i3Y= diff --git a/internal/domain/main-entities/auth-partner/dto.go b/internal/domain/main-entities/auth-partner/dto.go index 2b1589fb..4a723251 100644 --- a/internal/domain/main-entities/auth-partner/dto.go +++ b/internal/domain/main-entities/auth-partner/dto.go @@ -45,7 +45,7 @@ type MetaDto struct { } type ResponseDto struct { - ecore.Main + ecore.SmallMain Code string `json:"code"` Name string `json:"name"` SecretKey string `json:"secretKey"` @@ -57,7 +57,7 @@ func (d AuthPartner) ToResponse() ResponseDto { Name: d.Name, SecretKey: d.SecretKey, } - resp.Main = d.Main + resp.SmallMain = d.SmallMain return resp } diff --git a/internal/domain/main-entities/auth-partner/entity.go b/internal/domain/main-entities/auth-partner/entity.go index b4ad8e49..3a810f51 100644 --- a/internal/domain/main-entities/auth-partner/entity.go +++ b/internal/domain/main-entities/auth-partner/entity.go @@ -5,8 +5,8 @@ import ( ) type AuthPartner struct { - ecore.Main // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:50"` - Name string `json:"name" gorm:"unique;size:100"` - SecretKey string `json:"secretKey" gorm:"size:255"` + ecore.SmallMain // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:50"` + Name string `json:"name" gorm:"unique;size:100"` + SecretKey string `json:"secretKey" gorm:"size:255"` } diff --git a/internal/domain/main-entities/device-order-item/dto.go b/internal/domain/main-entities/device-order-item/dto.go index e89d5fad..afa08ed8 100644 --- a/internal/domain/main-entities/device-order-item/dto.go +++ b/internal/domain/main-entities/device-order-item/dto.go @@ -7,9 +7,9 @@ import ( ) type CreateDto struct { - DeviceOrder_Id *uint `json:"deviceOrder_id"` - Device_Id *uint `json:"device_id"` - Count uint8 `json:"count"` + DeviceOrder_Id *uint `json:"deviceOrder_id"` + Device_Code *string `json:"device_code"` + Count uint8 `json:"count"` } type ReadListDto struct { @@ -19,9 +19,9 @@ type ReadListDto struct { } type FilterDto struct { - DeviceOrder_Id *uint `json:"deviceOrder-id"` - Device_Id *uint `json:"device-id"` - Count uint8 `json:"count"` + DeviceOrder_Id *uint `json:"deviceOrder-id"` + Device_Code *string `json:"device-code"` + Count uint8 `json:"count"` } type ReadDetailDto struct { Id uint16 `json:"id"` @@ -46,7 +46,7 @@ type ResponseDto struct { ecore.Main DeviceOrder_Id *uint `json:"deviceOrder_id"` DeviceOrder *edo.DeviceOrder `json:"deviceOrder,omitempty"` - Device_Id *uint `json:"device_id"` + Device_Code *string `json:"device_code"` Device *ed.Device `json:"device,omitempty"` Count uint8 `json:"count"` } @@ -55,7 +55,7 @@ func (d DeviceOrderItem) ToResponse() ResponseDto { resp := ResponseDto{ DeviceOrder_Id: d.DeviceOrder_Id, DeviceOrder: d.DeviceOrder, - Device_Id: d.Device_Id, + Device_Code: d.Device_Code, Device: d.Device, Count: d.Count, } diff --git a/internal/domain/main-entities/device-order-item/entity.go b/internal/domain/main-entities/device-order-item/entity.go index 196415af..27197125 100644 --- a/internal/domain/main-entities/device-order-item/entity.go +++ b/internal/domain/main-entities/device-order-item/entity.go @@ -10,7 +10,7 @@ type DeviceOrderItem struct { ecore.Main // adjust this according to the needs DeviceOrder_Id *uint `json:"deviceOrder_id"` DeviceOrder *edo.DeviceOrder `json:"deviceOrder,omitempty" gorm:"foreignKey:DeviceOrder_Id;references:Id"` - Device_Id *uint `json:"device_id"` - Device *ed.Device `json:"device,omitempty" gorm:"foreignKey:Device_Id;references:Id"` + Device_Code *string `json:"device_code"` + Device *ed.Device `json:"device,omitempty" gorm:"foreignKey:Device_Code;references:Code"` Count uint8 `json:"count"` } diff --git a/internal/domain/main-entities/device-order/dto.go b/internal/domain/main-entities/device-order/dto.go index 3d944941..6371800c 100644 --- a/internal/domain/main-entities/device-order/dto.go +++ b/internal/domain/main-entities/device-order/dto.go @@ -18,7 +18,7 @@ import ( type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataStatusCode `json:"status_code"` - Doctor_Id *uint `json:"doctor_id"` + Doctor_Code *string `json:"doctor_code"` pa.AuthInfo } @@ -32,7 +32,7 @@ type ReadListDto struct { type FilterDto struct { Encounter_Id *uint `json:"encounter-id"` Status_Code erc.DataStatusCode `json:"status-code"` - Doctor_Id *uint `json:"doctor-id"` + Doctor_Code *string `json:"doctor-code"` } type ReadDetailDto struct { Id uint16 `json:"id"` @@ -57,7 +57,7 @@ type ResponseDto struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty"` - Doctor_Id *uint `json:"doctor_id"` + Doctor_Code *string `json:"doctor_code"` Doctor *ed.Doctor `json:"doctor,omitempty"` Status_Code erc.DataStatusCode `json:"status_code"` } @@ -66,7 +66,7 @@ func (d DeviceOrder) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, - Doctor_Id: d.Doctor_Id, + Doctor_Code: d.Doctor_Code, Doctor: d.Doctor, Status_Code: d.Status_Code, } diff --git a/internal/domain/main-entities/device-order/entity.go b/internal/domain/main-entities/device-order/entity.go index 7f693518..7ff4fa34 100644 --- a/internal/domain/main-entities/device-order/entity.go +++ b/internal/domain/main-entities/device-order/entity.go @@ -12,8 +12,8 @@ type DeviceOrder struct { ecore.Main // adjust this according to the needs Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` Status_Code erc.DataStatusCode `json:"status_code"` } @@ -21,6 +21,6 @@ func (d DeviceOrder) IsCompleted() bool { return d.Status_Code == erc.DSCDone } -func (d DeviceOrder) IsSameDoctor(doctor_id *uint) bool { - return d.Doctor_Id == doctor_id +func (d DeviceOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == doctor_code } diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index af8c1336..290a7766 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -37,7 +37,7 @@ type CreateDto struct { RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` SubClass_Code *string `json:"subClass_code" validate:"maxLength=10"` // for sub - Infra_Id *uint16 `json:"infra_id"` // for inpatient + Infra_Code *string `json:"infra_code"` // for inpatient Unit_Code *string `json:"unit_code"` Specialist_Code *string `json:"specialist_code"` Subspecialist_Code *string `json:"subspecialist_code"` diff --git a/internal/domain/main-entities/inpatient/dto.go b/internal/domain/main-entities/inpatient/dto.go index 11a864eb..be817ad0 100644 --- a/internal/domain/main-entities/inpatient/dto.go +++ b/internal/domain/main-entities/inpatient/dto.go @@ -10,7 +10,7 @@ import ( type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Class_Code ere.InpatientClassCode `json:"class_code" validate:"maxLength=10"` - Infra_Id *uint16 `json:"infra_id"` + Infra_Code *string `json:"infra_code"` } type ReadListDto struct { @@ -22,7 +22,7 @@ type ReadListDto struct { type FilterDto struct { Encounter_Id *uint `json:"encounter-id"` Class_Code ere.InpatientClassCode `json:"class-code"` - Infra_Id *uint16 `json:"infra-id"` + Infra_Code *string `json:"infra-code"` } type ReadDetailDto struct { @@ -48,7 +48,7 @@ type ResponseDto struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Class_Code ere.InpatientClassCode `json:"class_code"` - Infra_Id *uint16 `json:"infra_id"` + Infra_Code *string `json:"infra_code"` Infra *ei.Infra `json:"infra,omitempty"` } @@ -56,7 +56,7 @@ func (d Inpatient) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Class_Code: d.Class_Code, - Infra_Id: d.Infra_Id, + Infra_Code: d.Infra_Code, Infra: d.Infra, } resp.Main = d.Main diff --git a/internal/domain/main-entities/inpatient/entity.go b/internal/domain/main-entities/inpatient/entity.go index f88eb2fb..39cc2dbe 100644 --- a/internal/domain/main-entities/inpatient/entity.go +++ b/internal/domain/main-entities/inpatient/entity.go @@ -10,6 +10,6 @@ type Inpatient struct { ecore.Main // adjust this according to the needs Encounter_Id *uint `json:"encounter_id"` Class_Code ere.InpatientClassCode `json:"class_code" gorm:"size:10"` - Infra_Id *uint16 `json:"infra_id"` - Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id;references:Id"` + Infra_Code *string `json:"infra_code" gorm:"size:10"` + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` } diff --git a/internal/domain/main-entities/material-order-item/dto.go b/internal/domain/main-entities/material-order-item/dto.go index b76792bf..c8fd363d 100644 --- a/internal/domain/main-entities/material-order-item/dto.go +++ b/internal/domain/main-entities/material-order-item/dto.go @@ -8,7 +8,7 @@ import ( type CreateDto struct { MaterialOrder_Id *uint `json:"materialOrder_id"` - Material_Id *uint `json:"material_id"` + Material_Code *string `json:"material_code"` Count *uint16 `json:"count"` } @@ -20,7 +20,7 @@ type ReadListDto struct { type FilterDto struct { MaterialOrder_Id *uint `json:"materialOrder-id"` - Material_Id *uint `json:"material-id"` + Material_Code *string `json:"material-code"` Count *uint16 `json:"count"` } type ReadDetailDto struct { @@ -46,7 +46,7 @@ type ResponseDto struct { ecore.Main MaterialOrder_Id *uint `json:"materialOrder_id"` MaterialOrder *emo.MaterialOrder `json:"materialOrder,omitempty"` - Material_Id *uint `json:"material_id"` + Material_Code *string `json:"material_code"` Material *em.Material `json:"material,omitempty"` Count *uint16 `json:"count"` } @@ -55,7 +55,7 @@ func (d MaterialOrderItem) ToResponse() ResponseDto { resp := ResponseDto{ MaterialOrder_Id: d.MaterialOrder_Id, MaterialOrder: d.MaterialOrder, - Material_Id: d.Material_Id, + Material_Code: d.Material_Code, Material: d.Material, Count: d.Count, } diff --git a/internal/domain/main-entities/material-order-item/entity.go b/internal/domain/main-entities/material-order-item/entity.go index 432a36b9..2a85122a 100644 --- a/internal/domain/main-entities/material-order-item/entity.go +++ b/internal/domain/main-entities/material-order-item/entity.go @@ -10,7 +10,7 @@ type MaterialOrderItem struct { ecore.Main // adjust this according to the needs MaterialOrder_Id *uint `json:"materialOrder_id"` MaterialOrder *emo.MaterialOrder `json:"materialOrder,omitempty" gorm:"foreignKey:MaterialOrder_Id;references:Id"` - Material_Id *uint `json:"material_id"` - Material *em.Material `json:"material,omitempty" gorm:"foreignKey:Material_Id;references:Id"` + Material_Code *string `json:"material_code"` + Material *em.Material `json:"material,omitempty" gorm:"foreignKey:Material_Code;references:Code"` Count *uint16 `json:"count"` } diff --git a/internal/domain/main-entities/material-order/dto.go b/internal/domain/main-entities/material-order/dto.go index bd4f5c91..b830119d 100644 --- a/internal/domain/main-entities/material-order/dto.go +++ b/internal/domain/main-entities/material-order/dto.go @@ -18,7 +18,7 @@ import ( type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataStatusCode `json:"status_code"` - Doctor_Id *uint `json:"doctor_id"` + Doctor_Code *string `json:"doctor_code"` pa.AuthInfo } @@ -56,7 +56,7 @@ type ResponseDto struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty"` - Doctor_Id *uint `json:"doctor_id"` + Doctor_Code *string `json:"doctor_code"` Doctor *ed.Doctor `json:"doctor,omitempty"` Status_Code erc.DataStatusCode `json:"status_code"` } @@ -65,7 +65,7 @@ func (d MaterialOrder) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, - Doctor_Id: d.Doctor_Id, + Doctor_Code: d.Doctor_Code, Doctor: d.Doctor, Status_Code: d.Status_Code, } diff --git a/internal/domain/main-entities/material-order/entity.go b/internal/domain/main-entities/material-order/entity.go index 27b5c011..aec23316 100644 --- a/internal/domain/main-entities/material-order/entity.go +++ b/internal/domain/main-entities/material-order/entity.go @@ -12,8 +12,8 @@ type MaterialOrder struct { ecore.Main // adjust this according to the needs Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` Status_Code erc.DataStatusCode `json:"status_code"` } @@ -21,6 +21,6 @@ func (d MaterialOrder) IsCompleted() bool { return d.Status_Code == erc.DSCDone } -func (d MaterialOrder) IsSameDoctor(doctor_id *uint) bool { - return d.Doctor_Id == doctor_id +func (d MaterialOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == doctor_code } diff --git a/internal/domain/main-entities/mcu-order/dto.go b/internal/domain/main-entities/mcu-order/dto.go index e63a3e08..594f72d7 100644 --- a/internal/domain/main-entities/mcu-order/dto.go +++ b/internal/domain/main-entities/mcu-order/dto.go @@ -22,7 +22,7 @@ import ( type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor_id"` + Doctor_Code *string `json:"doctor_code"` SpecimenPickTime *time.Time `json:"specimenPickTime"` ExaminationDate *time.Time `json:"examinationDate"` Number uint8 `json:"number"` @@ -42,7 +42,7 @@ type ReadListDto struct { type FilterDto struct { Encounter_Id *uint `json:"encounter-id"` Status_Code erc.DataStatusCode `json:"status-code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor-id"` + Doctor_Code *string `json:"doctor-code"` SpecimenPickTime *time.Time `json:"specimenPickTime"` ExaminationDate *time.Time `json:"examinationDate"` Number uint8 `json:"number"` @@ -79,7 +79,7 @@ type ResponseDto struct { Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty"` Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor_id"` + Doctor_Code *string `json:"doctor_code"` Doctor *ed.Doctor `json:"doctor,omitempty"` SpecimenPickTime *time.Time `json:"specimenPickTime"` ExaminationDate *time.Time `json:"examinationDate"` @@ -93,7 +93,7 @@ func (d McuOrder) ToResponse() ResponseDto { Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, Status_Code: d.Status_Code, - Doctor_Id: d.Doctor_Id, + Doctor_Code: d.Doctor_Code, Doctor: d.Doctor, SpecimenPickTime: d.SpecimenPickTime, ExaminationDate: d.ExaminationDate, diff --git a/internal/domain/main-entities/mcu-order/entity.go b/internal/domain/main-entities/mcu-order/entity.go index bf4e2e77..b9e5d0d7 100644 --- a/internal/domain/main-entities/mcu-order/entity.go +++ b/internal/domain/main-entities/mcu-order/entity.go @@ -15,8 +15,8 @@ type McuOrder struct { Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` SpecimenPickTime *time.Time `json:"specimenPickTime"` ExaminationDate *time.Time `json:"examinationDate"` Number uint8 `json:"number"` @@ -29,6 +29,6 @@ func (d McuOrder) IsCompleted() bool { return d.Status_Code == erc.DSCDone } -func (d McuOrder) IsSameDoctor(doctor_id *uint) bool { - return d.Doctor_Id == doctor_id +func (d McuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == doctor_code } diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index 7ab13428..6db7af65 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -6,10 +6,10 @@ import ( ) type CreateDto struct { - Code string `json:"code" validate:"maxLength=20"` + Code *string `json:"code" validate:"maxLength=20"` Name string `json:"name" validate:"maxLength=50"` McuSrcCategory_Code *string `json:"mcuSrcCategory_code" validate:"maxLength=20"` - Item_Id *uint `json:"item_id"` + Item_Code *string `json:"item_code"` } type ReadListDto struct { @@ -27,17 +27,18 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id *uint16 `json:"id"` Code *string `json:"code"` } type UpdateDto struct { - Id uint16 `json:"id"` + Id *uint16 `json:"id"` CreateDto } type DeleteDto struct { - Id uint16 `json:"id"` + Id *uint16 `json:"id"` + Code *string `json:"code"` } type MetaDto struct { @@ -51,7 +52,7 @@ type ResponseDto struct { Code string `json:"code"` Name string `json:"name"` McuSrcCategory_Code *string `json:"mcuSrcCategory_code"` - Item_Id *uint `json:"item_id"` + Item_Code *string `json:"item_code"` Item *ei.Item `json:"item,omitempty"` } @@ -60,7 +61,7 @@ func (d McuSrc) ToResponse() ResponseDto { Code: d.Code, Name: d.Name, McuSrcCategory_Code: d.McuSrcCategory_Code, - Item_Id: d.Item_Id, + Item_Code: d.Item_Code, Item: d.Item, } resp.Main = d.Main diff --git a/internal/domain/main-entities/mcu-src/entity.go b/internal/domain/main-entities/mcu-src/entity.go index d3f4fca1..91ef8b99 100644 --- a/internal/domain/main-entities/mcu-src/entity.go +++ b/internal/domain/main-entities/mcu-src/entity.go @@ -8,10 +8,10 @@ import ( type McuSrc struct { ecore.Main // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:20"` + Code string `json:"code" gorm:"unique;size:20;not null"` Name string `json:"name" gorm:"size:50"` McuSrcCategory_Code *string `json:"mcuSrcCategory_code" gorm:"size:20"` McuSrcCategory *emsc.McuSrcCategory `json:"mcuSrcCategory,omitempty" gorm:"foreignKey:McuSrcCategory_Code;references:Code"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` + Item_Code *string `json:"item_code"` + Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Code;references:Code"` } diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go index f1b6d3bb..fde77fd2 100644 --- a/internal/domain/main-entities/mcu-sub-src/dto.go +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -7,10 +7,10 @@ import ( ) type CreateDto struct { - Code string `json:"code" validate:"maxLength=20"` - Name string `json:"name" validate:"maxLength=50"` - McuSrc_Id *uint `json:"mcuSrc_id"` - Item_Id *uint `json:"item_id"` + Code *string `json:"code" validate:"maxLength=20"` + Name string `json:"name" validate:"maxLength=50"` + McuSrc_Code *string `json:"mcuSrc_code"` + Item_Code *string `json:"item_code"` } type ReadListDto struct { @@ -21,24 +21,25 @@ type ReadListDto struct { } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code *string `json:"code"` + Name *string `json:"name"` CheckupCategory_Code *string `json:"checkupCategory-code"` Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id *uint16 `json:"id"` Code *string `json:"code"` } type UpdateDto struct { - Id uint16 `json:"id"` + Id *uint16 `json:"id"` CreateDto } type DeleteDto struct { - Id uint16 `json:"id"` + Id *uint16 `json:"id"` + Code *string `json:"code"` } type MetaDto struct { @@ -49,22 +50,22 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Code string `json:"code"` - Name string `json:"name"` - McuSrc_Id *uint `json:"mcuSrc_id"` - McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty"` + Code string `json:"code"` + Name string `json:"name"` + McuSrc_Code *string `json:"mcuSrc_code"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Item_Code *string `json:"item_code"` + Item *ei.Item `json:"item,omitempty"` } func (d McuSubSrc) ToResponse() ResponseDto { resp := ResponseDto{ - Code: d.Code, - Name: d.Name, - McuSrc_Id: d.McuSrc_Id, - McuSrc: d.McuSrc, - Item_Id: d.Item_Id, - Item: d.Item, + Code: d.Code, + Name: d.Name, + McuSrc_Code: d.McuSrc_Code, + McuSrc: d.McuSrc, + Item_Code: d.Item_Code, + Item: d.Item, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/mcu-sub-src/entity.go b/internal/domain/main-entities/mcu-sub-src/entity.go index 02559abb..888ebf90 100644 --- a/internal/domain/main-entities/mcu-sub-src/entity.go +++ b/internal/domain/main-entities/mcu-sub-src/entity.go @@ -7,11 +7,11 @@ import ( ) type McuSubSrc struct { - ecore.Main // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:20"` - Name string `json:"name" gorm:"size:50"` - McuSrc_Id *uint `json:"mcuSrc_id"` - McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Id;references:Id"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` + ecore.Main // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:20"` + Name string `json:"name" gorm:"size:50"` + McuSrc_Code *string `json:"mcuSrc_code"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` + Item_Code *string `json:"item_code"` + Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Code;references:Code"` } diff --git a/internal/domain/main-entities/medical-action-src-item/dto.go b/internal/domain/main-entities/medical-action-src-item/dto.go index 540a6ca5..849e6b18 100644 --- a/internal/domain/main-entities/medical-action-src-item/dto.go +++ b/internal/domain/main-entities/medical-action-src-item/dto.go @@ -8,9 +8,9 @@ import ( ) type CreateDto struct { - MedicalActionSrc_Id *uint `json:"medicalActionSrc_id"` - ProcedureSrc_Id *uint `json:"procedureSrc_id"` - Item_Id *uint `json:"item_id"` + MedicalActionSrc_Code *string `json:"medicalActionSrc_code"` + ProcedureSrc_Code *string `json:"procedureSrc_code"` + Item_Code *string `json:"item_code"` } type ReadListDto struct { @@ -20,9 +20,9 @@ type ReadListDto struct { } type FilterDto struct { - MedicalActionSrc_Id *uint `json:"medicalActionSrc-id"` - ProcedureSrc_Id *uint `json:"procedureSrc-id"` - Item_Id *uint `json:"item-id"` + MedicalActionSrc_Code *string `json:"medicalActionSrc-code"` + ProcedureSrc_Code *string `json:"procedureSrc-code"` + Item_Code *string `json:"item-code"` } type ReadDetailDto struct { @@ -46,22 +46,22 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - MedicalActionSrc_Id *uint `json:"medicalActionSrc_id"` - MedicalActionSrc *emas.MedicalActionSrc `json:"medicalActionSrc,omitempty"` - ProcedureSrc_Id *uint `json:"procedureSrc_id"` - ProcedureSrc *eps.ProcedureSrc `json:"procedureSrc,omitempty"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty"` + MedicalActionSrc_Code *string `json:"medicalActionSrc_code"` + MedicalActionSrc *emas.MedicalActionSrc `json:"medicalActionSrc,omitempty"` + ProcedureSrc_Code *string `json:"procedureSrc_code"` + ProcedureSrc *eps.ProcedureSrc `json:"procedureSrc,omitempty"` + Item_Code *string `json:"item_code"` + Item *ei.Item `json:"item,omitempty"` } func (d MedicalActionSrcItem) ToResponse() ResponseDto { resp := ResponseDto{ - MedicalActionSrc_Id: d.MedicalActionSrc_Id, - MedicalActionSrc: d.MedicalActionSrc, - ProcedureSrc_Id: d.ProcedureSrc_Id, - ProcedureSrc: d.ProcedureSrc, - Item_Id: d.Item_Id, - Item: d.Item, + MedicalActionSrc_Code: d.MedicalActionSrc_Code, + MedicalActionSrc: d.MedicalActionSrc, + ProcedureSrc_Code: d.ProcedureSrc_Code, + ProcedureSrc: d.ProcedureSrc, + Item_Code: d.Item_Code, + Item: d.Item, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/medical-action-src-item/entity.go b/internal/domain/main-entities/medical-action-src-item/entity.go index 59ecb828..2474c08b 100644 --- a/internal/domain/main-entities/medical-action-src-item/entity.go +++ b/internal/domain/main-entities/medical-action-src-item/entity.go @@ -8,11 +8,11 @@ import ( ) type MedicalActionSrcItem struct { - ecore.Main // adjust this according to the needs - MedicalActionSrc_Id *uint `json:"medicalActionSrc_id"` - MedicalActionSrc *emas.MedicalActionSrc `json:"medicalActionSrc,omitempty" gorm:"foreignKey:MedicalActionSrc_Id;references:Id"` - ProcedureSrc_Id *uint `json:"procedureSrc_id"` - ProcedureSrc *eps.ProcedureSrc `json:"procedureSrc,omitempty" gorm:"foreignKey:ProcedureSrc_Id;references:Id"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` + ecore.Main // adjust this according to the needs + MedicalActionSrc_Code *string `json:"medicalActionSrc_code"` + MedicalActionSrc *emas.MedicalActionSrc `json:"medicalActionSrc,omitempty" gorm:"foreignKey:MedicalActionSrc_Code;references:Code"` + ProcedureSrc_Code *string `json:"procedureSrc_code"` + ProcedureSrc *eps.ProcedureSrc `json:"procedureSrc,omitempty" gorm:"foreignKey:ProcedureSrc_Code;references:Code"` + Item_Code *string `json:"item_code"` + Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Code;references:Code"` } diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index 32e248d8..9316677f 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -6,10 +6,10 @@ import ( ) type CreateDto struct { - Code string `json:"code" validate:"maxLength=20"` - Name string `json:"name" validate:"maxLength=50"` - Type_Code string `json:"type_code" validate:"maxLength=20"` - Item_Id *uint `json:"item_id"` + Code *string `json:"code" validate:"maxLength=20"` + Name string `json:"name" validate:"maxLength=50"` + Type_Code string `json:"type_code" validate:"maxLength=20"` + Item_Code *string `json:"item_code"` } type ReadListDto struct { @@ -20,25 +20,26 @@ type ReadListDto struct { } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` - Type_Code string `json:"type_code"` - Item_Id *uint `json:"item-id"` - Search string `json:"search" gormhelper:"searchColumns=Code,Name"` + Code *string `json:"code"` + Name string `json:"name"` + Type_Code string `json:"type_code"` + Item_Code *string `json:"item-code"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { - Id uint16 `json:"id"` - Code string `json:"code"` + Id *uint16 `json:"id"` + Code *string `json:"code"` } type UpdateDto struct { - Id uint `json:"id"` + Id *uint `json:"id"` CreateDto } type DeleteDto struct { - Id uint `json:"id"` + Id *uint `json:"id"` + Code *string `json:"code"` } type MetaDto struct { @@ -52,7 +53,7 @@ type ResponseDto struct { Code string `json:"code"` Name string `json:"name"` Type_Code string `json:"type_code"` - Item_Id *uint `json:"item_id"` + Item_Code *string `json:"item_code"` Item *ei.Item `json:"item,omitempty"` } @@ -61,7 +62,7 @@ func (d MedicalActionSrc) ToResponse() ResponseDto { Code: d.Code, Name: d.Name, Type_Code: d.Type_Code, - Item_Id: d.Item_Id, + Item_Code: d.Item_Code, Item: d.Item, } resp.Main = d.Main diff --git a/internal/domain/main-entities/medical-action-src/entity.go b/internal/domain/main-entities/medical-action-src/entity.go index 60f15816..db3672a6 100644 --- a/internal/domain/main-entities/medical-action-src/entity.go +++ b/internal/domain/main-entities/medical-action-src/entity.go @@ -10,6 +10,6 @@ type MedicalActionSrc struct { Code string `json:"code" gorm:"unique;size:20"` Name string `json:"name" gorm:"size:50"` Type_Code string `json:"type_code" gorm:"size:20"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` + Item_Code *string `json:"item_code"` + Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Code;references:Code"` } diff --git a/internal/domain/main-entities/user-fes/dto.go b/internal/domain/main-entities/user-fes/dto.go index 6cb3636b..3cf9d68e 100644 --- a/internal/domain/main-entities/user-fes/dto.go +++ b/internal/domain/main-entities/user-fes/dto.go @@ -41,6 +41,13 @@ type DeleteDto struct { Id uint `json:"id"` } +type LoginDto struct { + Name string `json:"name" validate:"required"` + Duration uint32 `json:"duration"` + AuthPartner_Code string `json:"X-AuthPartner-Code" validate:"required"` + AuthPartner_SecretKey string `json:"X-AuthPartner-SecretKey" validate:"required"` +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` @@ -59,8 +66,8 @@ func (d UserFes) ToResponse() ResponseDto { resp := ResponseDto{ Name: d.Name, AuthPartner_Code: d.AuthPartner_Code, - AuthPartner: d.AuthPartner, - User_Name: d.User_Name, + // AuthPartner: d.AuthPartner, + User_Name: d.User_Name, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/user-fes/entity.go b/internal/domain/main-entities/user-fes/entity.go index 7356166c..5261ed62 100644 --- a/internal/domain/main-entities/user-fes/entity.go +++ b/internal/domain/main-entities/user-fes/entity.go @@ -9,9 +9,12 @@ import ( type UserFes struct { ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"size:100"` - AuthPartner_Code string `json:"authPartner_code" gorm:"size:30"` + Name string `json:"name" gorm:"size:100;uniqueIndex:idx-userFes-name-authPartner_code"` + AuthPartner_Code string `json:"authPartner_code" gorm:"size:50;uniqueIndex:idx-userFes-name-authPartner_code"` AuthPartner *eap.AuthPartner `json:"authPartner,omitempty" gorm:"foreignKey:AuthPartner_Code;references:Code"` - User_Name string `json:"user_name" gorm:"size:50"` - User *eau.User `json:"user,omitempty" gorm:"foreignKey:User_Name;references:Name"` + // Even tried this one, still failed to preload + // AuthPartner_Id uint16 `json:"authPartner_id"` + // AuthPartner *eap.AuthPartner `json:"authPartner,omitempty" gorm:"foreignKey:AuthPartner_Id;references:Id"` + User_Name string `json:"user_name" gorm:"size:50"` + User *eau.User `json:"user,omitempty" gorm:"foreignKey:User_Name;references:Name"` } diff --git a/internal/interface/main-handler/auth-partner/handler.go b/internal/interface/main-handler/auth-partner/handler.go new file mode 100644 index 00000000..f31e538d --- /dev/null +++ b/internal/interface/main-handler/auth-partner/handler.go @@ -0,0 +1,71 @@ +package authpartner + +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/auth-partner" + u "simrs-vx/internal/use-case/main-use-case/auth-partner" +) + +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 := uint16(rw.ValidateInt(w, "id", r.PathValue("id"))) + if id <= 0 { + return + } + dto := e.ReadDetailDto{} + dto.Id = &id + res, err := u.ReadDetail(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { + id := uint16(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 = id + res, err := u.Update(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { + id := uint16(rw.ValidateInt(w, "id", r.PathValue("id"))) + if id <= 0 { + return + } + + dto := e.DeleteDto{} + dto.Id = id + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/authentication/handler.go b/internal/interface/main-handler/authentication/handler.go index 709f33a3..243ba9cd 100644 --- a/internal/interface/main-handler/authentication/handler.go +++ b/internal/interface/main-handler/authentication/handler.go @@ -6,11 +6,13 @@ import ( d "github.com/karincake/dodol" rw "github.com/karincake/risoles" + sp "github.com/karincake/semprit" + sr "github.com/karincake/serabi" m "simrs-vx/internal/domain/main-entities/user" - s "simrs-vx/internal/use-case/main-use-case/authentication" - + mf "simrs-vx/internal/domain/main-entities/user-fes" pa "simrs-vx/internal/lib/auth" + s "simrs-vx/internal/use-case/main-use-case/authentication" ) func Login(w http.ResponseWriter, r *http.Request) { @@ -28,6 +30,30 @@ func Login(w http.ResponseWriter, r *http.Request) { } } +func LoginFes(w http.ResponseWriter, r *http.Request) { + var input mf.LoginDto + err := sp.IOReaderJson(&input, r.Body) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.II{"errors": err}, nil) + return + } + + input.AuthPartner_Code = r.Header.Get("X-AuthPartner-Code") + input.AuthPartner_SecretKey = r.Header.Get("X-AuthPartner-SecretKey") + if err = sr.Validate(input); err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.II{"errors": err}, nil) + return + } + + // input.Position = Position + res, err := s.GenTokenFes(input) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.II{"errors": err}, nil) + } else { + rw.DataResponse(w, res, err) + } +} + func Logout(w http.ResponseWriter, r *http.Request) { ctxVal := r.Context().Value(pa.AuthKey{}) if ctxVal == nil { diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 15c236b8..b3a2b65b 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -36,6 +36,7 @@ import ( /******************** actor ********************/ + authpartner "simrs-vx/internal/interface/main-handler/auth-partner" doctor "simrs-vx/internal/interface/main-handler/doctor" employee "simrs-vx/internal/interface/main-handler/employee" nurse "simrs-vx/internal/interface/main-handler/nurse" @@ -47,6 +48,7 @@ import ( personinsurance "simrs-vx/internal/interface/main-handler/person-insurance" pharmacist "simrs-vx/internal/interface/main-handler/pharmacist" user "simrs-vx/internal/interface/main-handler/user" + userfes "simrs-vx/internal/interface/main-handler/user-fes" /******************** external ********************/ a "github.com/karincake/apem" @@ -132,7 +134,9 @@ func SetRoutes() http.Handler { r.HandleFunc("/", home.Home) r.HandleFunc("POST /v1/authentication/login", auth.Login) + r.HandleFunc("POST /v1/authentication/login-fes", auth.LoginFes) hk.Route("POST /v1/authentication/logout", r, auth.GuardMW, auth.Logout) + hc.RegCrud(r, "/v1/auth-partner", authpartner.O) hc.RegCrud(r, "/v1/practice-schedule", practiceschedule.O) hc.RegCrud(r, "/v1/counter", counter.O) hc.RegCrud(r, "/v1/medicine-mix", medicicinemix.O) @@ -284,6 +288,8 @@ func SetRoutes() http.Handler { "PATCH /{id}/block": user.O.Block, "PATCH /{id}/active": user.O.Active, }) + hc.RegCrud(r, "/v1/user-fes", userfes.O) + hk.GroupRoutes("/v1/patient", r, hk.MapHandlerFunc{ "GET /": patient.O.GetList, "GET /{id}": patient.O.GetDetail, @@ -316,17 +322,17 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/medicine-group", medicinegroup.O) hc.RegCrud(r, "/v1/medicine-method", medicinemethod.O) hc.RegCrud(r, "/v1/mcu-src-category", mcusrccategory.O) - hc.RegCrud(r, "/v1/mcu-src", mcusrc.O) + hc.RegCrudByCode(r, "/v1/mcu-src", mcusrc.O) hc.RegCrud(r, "/v1/ethnic", ethnic.O) hc.RegCrud(r, "/v1/insurance-company", insurancecompany.O) hc.RegCrudByCode(r, "/v1/medicine", medicine.O) hc.RegCrudByCode(r, "/v1/device", device.O) hc.RegCrudByCode(r, "/v1/material", material.O) hc.RegCrud(r, "/v1/doctor-fee", doctorfee.O) - hc.RegCrud(r, "/v1/medical-action-src", medicalactionsrc.O) + hc.RegCrudByCode(r, "/v1/medical-action-src", medicalactionsrc.O) hc.RegCrud(r, "/v1/medical-action-src-item", medicalactionsrcitem.O) hc.RegCrud(r, "/v1/language", language.O) - hc.RegCrud(r, "/v1/mcu-sub-src", mcusubsrc.O) + hc.RegCrudByCode(r, "/v1/mcu-sub-src", mcusubsrc.O) hc.RegCrud(r, "/v1/vehicle", vehicle.O) hc.RegCrud(r, "/v1/vehicle-hist", vehiclehist.O) hc.RegCrud(r, "/v1/edu-assessment", eduassesment.O) diff --git a/internal/interface/main-handler/mcu-src/handler.go b/internal/interface/main-handler/mcu-src/handler.go index c607017d..7523ea7e 100644 --- a/internal/interface/main-handler/mcu-src/handler.go +++ b/internal/interface/main-handler/mcu-src/handler.go @@ -33,19 +33,19 @@ func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { } func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { - id := rw.ValidateInt(w, "id", r.PathValue("id")) - if id <= 0 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } dto := e.ReadDetailDto{} - dto.Id = uint16(id) + dto.Code = &code 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 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } @@ -53,19 +53,19 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - dto.Id = uint16(id) + dto.Code = &code 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 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } dto := e.DeleteDto{} - dto.Id = uint16(id) + dto.Code = &code res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/mcu-sub-src/handler.go b/internal/interface/main-handler/mcu-sub-src/handler.go index 949be715..ad7868d9 100644 --- a/internal/interface/main-handler/mcu-sub-src/handler.go +++ b/internal/interface/main-handler/mcu-sub-src/handler.go @@ -33,19 +33,19 @@ func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { } func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { - id := rw.ValidateInt(w, "id", r.PathValue("id")) - if id <= 0 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } dto := e.ReadDetailDto{} - dto.Id = uint16(id) + dto.Code = &code 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 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } @@ -53,19 +53,19 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - dto.Id = uint16(id) + dto.Code = &code 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 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } dto := e.DeleteDto{} - dto.Id = uint16(id) + dto.Code = &code res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/medical-action-src/handler.go b/internal/interface/main-handler/medical-action-src/handler.go index c8b24706..42d41c92 100644 --- a/internal/interface/main-handler/medical-action-src/handler.go +++ b/internal/interface/main-handler/medical-action-src/handler.go @@ -33,19 +33,19 @@ func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { } func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { - id := rw.ValidateInt(w, "id", r.PathValue("id")) - if id <= 0 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } dto := e.ReadDetailDto{} - dto.Id = uint16(id) + dto.Code = &code 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 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } @@ -53,19 +53,19 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - dto.Id = uint(id) + dto.Code = &code 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 { + code := rw.ValidateString(w, "code", r.PathValue("code")) + if code == "" { return } dto := e.DeleteDto{} - dto.Id = uint(id) + dto.Code = &code res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/user-fes/handler.go b/internal/interface/main-handler/user-fes/handler.go new file mode 100644 index 00000000..0c37ff08 --- /dev/null +++ b/internal/interface/main-handler/user-fes/handler.go @@ -0,0 +1,71 @@ +package userfes + +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/user-fes" + u "simrs-vx/internal/use-case/main-use-case/user-fes" +) + +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 = uint(id) + res, err := u.ReadDetail(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { + id := uint16(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 = uint(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 = uint(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/auth-partner/case.go b/internal/use-case/main-use-case/auth-partner/case.go new file mode 100644 index 00000000..f5f7b423 --- /dev/null +++ b/internal/use-case/main-use-case/auth-partner/case.go @@ -0,0 +1,276 @@ +package authpartner + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/auth-partner" + "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" +) + +const source = "device" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.AuthPartner{} + + 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.AuthPartner + var dataList []e.AuthPartner + 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.AuthPartner + 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.AuthPartner + 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.AuthPartner + 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 + +} diff --git a/internal/use-case/main-use-case/auth-partner/helper.go b/internal/use-case/main-use-case/auth-partner/helper.go new file mode 100644 index 00000000..36e1ce7b --- /dev/null +++ b/internal/use-case/main-use-case/auth-partner/helper.go @@ -0,0 +1,19 @@ +package authpartner + +import ( + e "simrs-vx/internal/domain/main-entities/auth-partner" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.AuthPartner) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Code = inputSrc.Code + data.Name = inputSrc.Name + data.SecretKey = inputSrc.SecretKey +} diff --git a/internal/use-case/main-use-case/auth-partner/lib.go b/internal/use-case/main-use-case/auth-partner/lib.go new file mode 100644 index 00000000..41253e2c --- /dev/null +++ b/internal/use-case/main-use-case/auth-partner/lib.go @@ -0,0 +1,150 @@ +package authpartner + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/auth-partner" + + 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" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.AuthPartner, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.AuthPartner{} + 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.AuthPartner, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.AuthPartner{} + 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.AuthPartner{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) + + 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.AuthPartner, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.AuthPartner{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if input.Code != nil { + tx = tx.Where("\"Code\" = ?", *input.Code) + } + if input.Id != nil { + tx = tx.Where("\"Id\" = ?", input.Id) + } + + if err := tx. + Scopes(gh.Preload(input.Includes)). + First(&data).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.AuthPartner, 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.AuthPartner, 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 +} diff --git a/internal/use-case/main-use-case/auth-partner/middleware-runner.go b/internal/use-case/main-use-case/auth-partner/middleware-runner.go new file mode 100644 index 00000000..d1cabe38 --- /dev/null +++ b/internal/use-case/main-use-case/auth-partner/middleware-runner.go @@ -0,0 +1,103 @@ +package authpartner + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/auth-partner" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" +) + +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.AuthPartner) 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.AuthPartner) 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.AuthPartner) 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.AuthPartner) 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.AuthPartner) 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 +} diff --git a/internal/use-case/main-use-case/auth-partner/middleware.go b/internal/use-case/main-use-case/auth-partner/middleware.go new file mode 100644 index 00000000..4ec1231f --- /dev/null +++ b/internal/use-case/main-use-case/auth-partner/middleware.go @@ -0,0 +1,9 @@ +package authpartner + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/auth-partner/tycovar.go b/internal/use-case/main-use-case/auth-partner/tycovar.go new file mode 100644 index 00000000..43f69d98 --- /dev/null +++ b/internal/use-case/main-use-case/auth-partner/tycovar.go @@ -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 authpartner + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/auth-partner" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.AuthPartner, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.AuthPartner, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.AuthPartner, 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 diff --git a/internal/use-case/main-use-case/authentication/case.go b/internal/use-case/main-use-case/authentication/case.go index c162c56c..15f18ef8 100644 --- a/internal/use-case/main-use-case/authentication/case.go +++ b/internal/use-case/main-use-case/authentication/case.go @@ -8,7 +8,6 @@ import ( "time" "github.com/golang-jwt/jwt" - "github.com/google/uuid" a "github.com/karincake/apem" dg "github.com/karincake/apem/db-gorm-pg" ms "github.com/karincake/apem/ms-redis" @@ -19,14 +18,10 @@ import ( pl "simrs-vx/pkg/logger" p "simrs-vx/pkg/password" - ed "simrs-vx/internal/domain/main-entities/doctor" - ee "simrs-vx/internal/domain/main-entities/employee" - "simrs-vx/internal/domain/main-entities/intern" - em "simrs-vx/internal/domain/main-entities/midwife" - en "simrs-vx/internal/domain/main-entities/nurse" + eap "simrs-vx/internal/domain/main-entities/auth-partner" eu "simrs-vx/internal/domain/main-entities/user" + euf "simrs-vx/internal/domain/main-entities/user-fes" erc "simrs-vx/internal/domain/references/common" - erg "simrs-vx/internal/domain/references/organization" ) const source = "authentication" @@ -47,13 +42,11 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { // Get User user := &eu.User{Name: input.Name} - // if input.Position_Code != "" { - // user.Position_Code = input.Position_Code - // } - if errCode := getAndCheck(user, user); errCode != "" { + if errCode := getAndCheck(user, user, nil); errCode != "" { return nil, d.FieldErrors{"authentication": d.FieldError{Code: errCode, Message: pl.GenMessage(errCode)}} } + // Check login attempt if user.LoginAttemptCount > 5 { if user.LastSuccessLogin != nil { now := time.Now() @@ -74,6 +67,7 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { } } + // Check password if !p.Check(input.Password, user.Password) { user.LoginAttemptCount++ dg.I.Save(&user) @@ -84,159 +78,14 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-login-unverified", Message: pl.GenMessage("auth-login-unverified")}} } - // Access token prep - id, err := uuid.NewRandom() - if err != nil { - panic(fmt.Sprintf(l.I.Msg("uuid-gen-fail"), err)) - } - if input.Duration == 0 { - input.Duration = 24 * 60 - } - duration := time.Minute * time.Duration(input.Duration) - aUuid := id.String() - atExpires := time.Now().Add(duration).Unix() - atSecretKey := authCfg.AtSecretKey - - // Create Claim + // Data and output population atClaims := jwt.MapClaims{} - atClaims["user_id"] = user.Id - atClaims["user_name"] = user.Name - atClaims["user_contractPosition_code"] = user.ContractPosition_Code - atClaims["uuid"] = aUuid - atClaims["exp"] = atExpires - - // Create output - outputData := d.II{ - "user_id": strconv.Itoa(int(user.Id)), - "user_name": user.Name, - "user_contractPosition_code": user.ContractPosition_Code, - } - - // extra - role := []string{} - switch user.ContractPosition_Code { - case erg.CSCEmp: - // employee - employee := ee.Employee{} - dg.I.Where("\"User_Id\" = ?", user.Id).First(&employee) - if employee.Id == 0 { - return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-noEmployee", Message: pl.GenMessage("auth-noEmployee")}} - } - atClaims["employee_id"] = employee.Id - outputData["employee_id"] = employee.Id - role = append(role, "emp-"+string(*employee.Position_Code)) - - //if employee.Division_Code != nil { - // atClaims["employee_division_code"] = employee.Division_Code - // outputData["employee_division_code"] = employee.Division_Code - //} - - // employee position - if employee.Id > 0 && employee.Position_Code != nil { - atClaims["employee_position_code"] = *employee.Position_Code - switch *employee.Position_Code { - case erg.EPCDoc: - doctor := ed.Doctor{} - dg.I.Where("\"Employee_Id\" = ?", employee.Id).First(&doctor) - if doctor.Id == 0 { - return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-noDoctor", Message: pl.GenMessage("auth-noDoctor")}} - } - atClaims["doctor_code"] = doctor.Code - outputData["doctor_code"] = doctor.Code - - // specialist - if doctor.Specialist_Code != nil { - atClaims["specialist_code"] = doctor.Specialist_Code - outputData["specialist_code"] = doctor.Specialist_Code - } - if doctor.Subspecialist_Code != nil { - atClaims["subspecialist_code"] = doctor.Subspecialist_Code - outputData["subspecialist_code"] = doctor.Subspecialist_Code - } - case erg.EPCNur: - empData := en.Nurse{} - dg.I.Where("\"Employee_Id\" = ?", employee.Id).First(&empData) - if empData.Id == 0 { - return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-noNurse", Message: pl.GenMessage("auth-noNurse")}} - } - atClaims["nurse_code"] = empData.Code - outputData["nurse_code"] = empData.Code - case erg.EPCMwi: - empData := em.Midwife{} - dg.I.Where("\"Employee_Id\" = ?", employee.Id).First(&empData) - if empData.Id == 0 { - return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-noMidwife", Message: pl.GenMessage("auth-noMidwife")}} - } - atClaims["midwife_code"] = empData.Code - outputData["midwife_code"] = empData.Code - } - - errorGetPosition := d.FieldErrors{"authentication": d.FieldError{Code: "auth-getData-failed", Message: pl.GenMessage("auth-getData-failed")}} - - // division position - divisionPositions, err := getDivisionPosition(employee.Id, &event) - if err != nil { - return nil, errorGetPosition - } - - // installation position - installationPositions, err := getInstallationPosition(employee.Id, &event) - if err != nil { - return nil, errorGetPosition - } - - // unit position - unitPositions, err := getUnitPosition(employee.Id, &event) - if err != nil { - return nil, errorGetPosition - } - - // specialist position - specialistPositions, err := getSpecialistPosition(employee.Id, &event) - if err != nil { - return nil, errorGetPosition - } - - // subspecialist position - subspecialistPositions, err := getSubspecialistPosition(employee.Id, &event) - if err != nil { - return nil, errorGetPosition - } - - role = append(role, divisionPositions...) - role = append(role, installationPositions...) - role = append(role, unitPositions...) - role = append(role, specialistPositions...) - role = append(role, subspecialistPositions...) - // atClaims["division_positions"] = divsionPositions - // outputData["division_positions"] = divsionPositions - } - case erg.CSCInt: - intern := intern.Intern{} - dg.I.Where("\"User_Id\" = ?", user.Id).First(&intern) - role = append(role, "int-"+string(*intern.Position_Code)) - case erg.CSCSys: - role = append(role, "system") - } - atClaims["roles"] = role - outputData["roles"] = role - - // Generate jwt - at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims) - ats, err := at.SignedString([]byte(atSecretKey)) - if err != nil { - return nil, d.FieldErrors{"user": d.FieldError{Code: "token-sign-err", Message: pl.GenMessage("token-sign-err")}} - } - outputData["accessToken"] = ats - - // Save to redis - now := time.Now() - atx := time.Unix(atExpires, 0) //converting Unix to UTC(to Time object) - err = ms.I.Set(aUuid, strconv.Itoa(int(user.Id)), atx.Sub(now)).Err() - if err != nil { - panic(fmt.Sprintf(l.I.Msg("redis-store-fail"), err.Error())) + outputData := d.II{} + if err := populateRoles(user, input, atClaims, outputData, event); err != nil { + return nil, err } + // Only manual login tn := time.Now() user.LoginAttemptCount = 0 user.LastSuccessLogin = &tn @@ -254,6 +103,51 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { }, nil } +func GenTokenFes(input euf.LoginDto) (*d.Data, error) { + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Get User Fes + userFes := &euf.UserFes{Name: input.Name, AuthPartner_Code: input.AuthPartner_Code} + if errCode := getAndCheck(userFes, userFes, "AuthPartner"); errCode != "" { + return nil, d.FieldErrors{"authentication": d.FieldError{Code: errCode, Message: pl.GenMessage(errCode)}} + } + // Preload above fails and I am so done, do it manually + authPartner := eap.AuthPartner{} + if err := dg.I.Where("\"Code\" = ?", userFes.AuthPartner_Code).First(&authPartner).Error; err != nil { + return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-secretKey-invalid", Message: pl.GenMessage("auth-secretKey-invalid")}} + } + if authPartner.SecretKey != input.AuthPartner_SecretKey { + return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-secretKey-invalid", Message: pl.GenMessage("auth-secretKey-invalid")}} + } + + // Get User + user := &eu.User{Name: userFes.User_Name} + if errCode := getAndCheck(user, user, nil); errCode != "" { + return nil, d.FieldErrors{"authentication": d.FieldError{Code: errCode, Message: pl.GenMessage(errCode)}} + } + + // Data and output population + atClaims := jwt.MapClaims{} + outputData := d.II{} + primInput := eu.LoginDto{Duration: input.Duration} + if err := populateRoles(user, primInput, atClaims, outputData, event); err != nil { + return nil, err + } + + // Current data + return &d.Data{ + Meta: d.IS{ + "source": "authentication", + "structure": "single-data", + "status": "verified", + }, + Data: outputData, + }, nil +} + func RevokeToken(uuid string) { ms.I.Del(uuid) } diff --git a/internal/use-case/main-use-case/authentication/helper.go b/internal/use-case/main-use-case/authentication/helper.go index a919cfe9..b7ccc660 100644 --- a/internal/use-case/main-use-case/authentication/helper.go +++ b/internal/use-case/main-use-case/authentication/helper.go @@ -1,15 +1,31 @@ package authentication import ( + "fmt" + "strconv" + "time" + + "github.com/golang-jwt/jwt" + "github.com/google/uuid" dg "github.com/karincake/apem/db-gorm-pg" + ms "github.com/karincake/apem/ms-redis" + d "github.com/karincake/dodol" + l "github.com/karincake/lepet" pl "simrs-vx/pkg/logger" edp "simrs-vx/internal/domain/main-entities/division-position" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/employee" eip "simrs-vx/internal/domain/main-entities/installation-position" + "simrs-vx/internal/domain/main-entities/intern" + em "simrs-vx/internal/domain/main-entities/midwife" + en "simrs-vx/internal/domain/main-entities/nurse" esp "simrs-vx/internal/domain/main-entities/specialist-position" essp "simrs-vx/internal/domain/main-entities/subspecialist-position" eup "simrs-vx/internal/domain/main-entities/unit-position" + eu "simrs-vx/internal/domain/main-entities/user" + erg "simrs-vx/internal/domain/references/organization" udp "simrs-vx/internal/use-case/main-use-case/division-position" uip "simrs-vx/internal/use-case/main-use-case/installation-position" @@ -19,8 +35,21 @@ import ( ) // just return the error code -func getAndCheck(input, condition any) (eCode string) { - result := dg.I.Where(condition).Find(&input) +func getAndCheck(input, condition any, includes any) (eCode string) { + qry := dg.I.Where(condition) + + // WARNING THIS PRELOAD FAILS + if includes != nil { + if val := includes.(string); val != "" { + qry = qry.Preload(val) + } else if vals := includes.([]string); len(vals) > 0 { + for _, val := range vals { + qry = qry.Preload(val) + } + } + } + + result := qry.First(&input) if result.Error != nil { return "fetch-fail" } else if result.RowsAffected == 0 { @@ -34,18 +63,14 @@ func getDivisionPosition(employee_id uint, event *pl.Event) ([]string, error) { var result []string // get data division_position based on employee_id - data, _, err := udp.ReadListData(edp.ReadListDto{ - FilterDto: edp.FilterDto{Employee_Id: &employee_id}, - Includes: "Division"}, event) + data, _, err := udp.ReadListData(edp.ReadListDto{FilterDto: edp.FilterDto{Employee_Id: &employee_id}}, event) if err != nil { return nil, err } if len(data) > 0 { for _, dp := range data { - if dp.Division != nil { - result = append(result, "div-"+dp.Division.Code+"-"+dp.Code) - } + result = append(result, "div-"+*dp.Division_Code) } } @@ -65,9 +90,7 @@ func getInstallationPosition(employeeId uint, event *pl.Event) ([]string, error) if len(data) > 0 { for _, dp := range data { - if dp.Installation != nil { - result = append(result, "inst-"+dp.Installation.Code+"-"+dp.Code) - } + result = append(result, "inst-"+*dp.Installation_Code+"-"+dp.Code) } } @@ -78,18 +101,14 @@ func getUnitPosition(employeeId uint, event *pl.Event) ([]string, error) { var result []string // get data unit_position based on employee_id - data, _, err := uup.ReadListData(eup.ReadListDto{ - FilterDto: eup.FilterDto{Employee_Id: &employeeId}, - Includes: "unit"}, event) + data, _, err := uup.ReadListData(eup.ReadListDto{FilterDto: eup.FilterDto{Employee_Id: &employeeId}}, event) if err != nil { return nil, err } if len(data) > 0 { for _, dp := range data { - if dp.Unit != nil { - result = append(result, "unit-"+dp.Unit.Code+"-"+dp.Code) - } + result = append(result, "unit-"+*dp.Unit_Code+"-"+dp.Code) } } @@ -100,18 +119,14 @@ func getSpecialistPosition(employeeId uint, event *pl.Event) ([]string, error) { var result []string // get data unit_position based on employee_id - data, _, err := usp.ReadListData(esp.ReadListDto{ - FilterDto: esp.FilterDto{Employee_Id: &employeeId}, - Includes: "specialist"}, event) + data, _, err := usp.ReadListData(esp.ReadListDto{FilterDto: esp.FilterDto{Employee_Id: &employeeId}}, event) if err != nil { return nil, err } if len(data) > 0 { for _, dp := range data { - if dp.Specialist != nil { - result = append(result, "spec-"+dp.Specialist.Code+"-"+dp.Code) - } + result = append(result, "spec-"+*dp.Specialist_Code+"-"+dp.Code) } } @@ -131,9 +146,7 @@ func getSubspecialistPosition(employeeId uint, event *pl.Event) ([]string, error if len(data) > 0 { for _, dp := range data { - if dp.Subspecialist != nil { - result = append(result, "subspec-"+dp.Subspecialist.Code+"-"+dp.Code) - } + result = append(result, "subspec-"+dp.Subspecialist.Code+"-"+dp.Code) } } @@ -162,3 +175,149 @@ func checkUntPtrClaims(claim map[string]interface{}, key string) *uint { } return nil } + +func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, outputData d.II, event pl.Event) error { + id, err := uuid.NewRandom() + if err != nil { + panic(fmt.Sprintf(l.I.Msg("uuid-gen-fail"), err)) + } + if input.Duration == 0 { + input.Duration = 24 * 60 + } + duration := time.Minute * time.Duration(input.Duration) + aUuid := id.String() + atExpires := time.Now().Add(duration).Unix() + + atClaims["uuid"] = aUuid + atClaims["exp"] = atExpires + atClaims["user_id"] = user.Id + atClaims["user_name"] = user.Name + atClaims["user_contractPosition_code"] = user.ContractPosition_Code + + outputData["user_id"] = user.Id + outputData["user_name"] = user.Name + outputData["user_contractPosition_code"] = user.ContractPosition_Code + + roles := []string{} + switch user.ContractPosition_Code { + case erg.CSCEmp: + // employee + employee := ee.Employee{} + dg.I.Where("\"User_Id\" = ?", user.Id).First(&employee) + if employee.Id == 0 { + return d.FieldErrors{"authentication": d.FieldError{Code: "auth-noEmployee", Message: pl.GenMessage("auth-noEmployee")}} + } + atClaims["employee_id"] = employee.Id + outputData["employee_id"] = employee.Id + roles = append(roles, "emp-"+string(*employee.Position_Code)) + + // employee position + if employee.Id > 0 && employee.Position_Code != nil { + atClaims["employee_position_code"] = *employee.Position_Code + switch *employee.Position_Code { + case erg.EPCDoc: + doctor := ed.Doctor{} + dg.I.Where("\"Employee_Id\" = ?", employee.Id).First(&doctor) + if doctor.Id == 0 { + return d.FieldErrors{"authentication": d.FieldError{Code: "auth-noDoctor", Message: pl.GenMessage("auth-noDoctor")}} + } + atClaims["doctor_code"] = doctor.Code + outputData["doctor_code"] = doctor.Code + + // specialist + if doctor.Specialist_Code != nil { + atClaims["specialist_code"] = doctor.Specialist_Code + outputData["specialist_code"] = doctor.Specialist_Code + } + if doctor.Subspecialist_Code != nil { + atClaims["subspecialist_code"] = doctor.Subspecialist_Code + outputData["subspecialist_code"] = doctor.Subspecialist_Code + } + case erg.EPCNur: + empData := en.Nurse{} + dg.I.Where("\"Employee_Id\" = ?", employee.Id).First(&empData) + if empData.Id == 0 { + return d.FieldErrors{"authentication": d.FieldError{Code: "auth-noNurse", Message: pl.GenMessage("auth-noNurse")}} + } + atClaims["nurse_code"] = empData.Code + outputData["nurse_code"] = empData.Code + case erg.EPCMwi: + empData := em.Midwife{} + dg.I.Where("\"Employee_Id\" = ?", employee.Id).First(&empData) + if empData.Id == 0 { + return d.FieldErrors{"authentication": d.FieldError{Code: "auth-noMidwife", Message: pl.GenMessage("auth-noMidwife")}} + } + atClaims["midwife_code"] = empData.Code + outputData["midwife_code"] = empData.Code + } + + errorGetPosition := d.FieldErrors{"authentication": d.FieldError{Code: "auth-getData-failed", Message: pl.GenMessage("auth-getData-failed")}} + + // division position + divisionPositions, err := getDivisionPosition(employee.Id, &event) + if err != nil { + return errorGetPosition + } + + // installation position + installationPositions, err := getInstallationPosition(employee.Id, &event) + if err != nil { + return errorGetPosition + } + + // unit position + unitPositions, err := getUnitPosition(employee.Id, &event) + if err != nil { + return errorGetPosition + } + + // specialist position + specialistPositions, err := getSpecialistPosition(employee.Id, &event) + if err != nil { + return errorGetPosition + } + + // subspecialist position + subspecialistPositions, err := getSubspecialistPosition(employee.Id, &event) + if err != nil { + return errorGetPosition + } + + roles = append(roles, divisionPositions...) + roles = append(roles, installationPositions...) + roles = append(roles, unitPositions...) + roles = append(roles, specialistPositions...) + roles = append(roles, subspecialistPositions...) + // atClaims["division_positions"] = divsionPositions + // outputData["division_positions"] = divsionPositions + } + case erg.CSCInt: + intern := intern.Intern{} + dg.I.Where("\"User_Id\" = ?", user.Id).First(&intern) + roles = append(roles, "int-"+string(*intern.Position_Code)) + case erg.CSCSys: + roles = append(roles, "system") + } + atClaims["roles"] = roles + outputData["roles"] = roles + + // Generate jwt + atSecretKey := authCfg.AtSecretKey + at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims) + ats, err := at.SignedString([]byte(atSecretKey)) + if err != nil { + return d.FieldErrors{"user": d.FieldError{Code: "token-sign-err", Message: pl.GenMessage("token-sign-err")}} + } + outputData["accessToken"] = ats + + // Save to redis + exp, _ := atClaims["exp"].(int64) + now := time.Now() + atx := time.Unix(exp, 0) //converting Unix to UTC(to Time object) + err = ms.I.Set(atClaims["uuid"].(string), strconv.Itoa(int(user.Id)), atx.Sub(now)).Err() + if err != nil { + panic(fmt.Sprintf(l.I.Msg("redis-store-fail"), err.Error())) + } + + return nil +} diff --git a/internal/use-case/main-use-case/device-order-item/helper.go b/internal/use-case/main-use-case/device-order-item/helper.go index 5c6a0e68..8c0be91f 100644 --- a/internal/use-case/main-use-case/device-order-item/helper.go +++ b/internal/use-case/main-use-case/device-order-item/helper.go @@ -18,6 +18,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DeviceOrderItem) { } data.DeviceOrder_Id = inputSrc.DeviceOrder_Id - data.Device_Id = inputSrc.Device_Id + data.Device_Code = inputSrc.Device_Code data.Count = inputSrc.Count } diff --git a/internal/use-case/main-use-case/device-order/case.go b/internal/use-case/main-use-case/device-order/case.go index 89466ead..b48e7670 100644 --- a/internal/use-case/main-use-case/device-order/case.go +++ b/internal/use-case/main-use-case/device-order/case.go @@ -6,7 +6,6 @@ import ( e "simrs-vx/internal/domain/main-entities/device-order" - ud "simrs-vx/internal/use-case/main-use-case/doctor" ue "simrs-vx/internal/use-case/main-use-case/encounter" erc "simrs-vx/internal/domain/references/common" @@ -60,11 +59,7 @@ func Create(input e.CreateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) - if err != nil { - return err - } - input.Doctor_Id = doctor_id + input.Doctor_Code = input.AuthInfo.Doctor_Code if resData, err := CreateData(input, &event, tx); err != nil { return err @@ -236,11 +231,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) - if err != nil { - return err - } - if !data.IsSameDoctor(doctor_id) { + if !data.IsSameDoctor(input.AuthInfo.Doctor_Code) { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "auth-forbidden", @@ -250,7 +241,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - input.Doctor_Id = doctor_id + input.Doctor_Code = input.AuthInfo.Doctor_Code if err := UpdateData(input, data, &event, tx); err != nil { return err diff --git a/internal/use-case/main-use-case/device-order/helper.go b/internal/use-case/main-use-case/device-order/helper.go index 3be32a7a..1fa0b4a8 100644 --- a/internal/use-case/main-use-case/device-order/helper.go +++ b/internal/use-case/main-use-case/device-order/helper.go @@ -21,5 +21,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DeviceOrder) { } data.Encounter_Id = inputSrc.Encounter_Id - data.Doctor_Id = inputSrc.Doctor_Id + data.Doctor_Code = inputSrc.Doctor_Code } diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 99b080ab..27c468a3 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -796,7 +796,7 @@ func insertdataClassCode(input e.CreateDto, soapiData []es.CreateDto, event *pl. inpCreate := ei.CreateDto{ Encounter_Id: &input.Id, Class_Code: subCode, - Infra_Id: input.Infra_Id, + Infra_Code: input.Infra_Code, } // create data inpatient diff --git a/internal/use-case/main-use-case/inpatient/helper.go b/internal/use-case/main-use-case/inpatient/helper.go index 45014af1..d59ea4d8 100644 --- a/internal/use-case/main-use-case/inpatient/helper.go +++ b/internal/use-case/main-use-case/inpatient/helper.go @@ -22,6 +22,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Inpatient) { data.Encounter_Id = inputSrc.Encounter_Id data.Class_Code = inputSrc.Class_Code + data.Infra_Code = inputSrc.Infra_Code } func CheckClassCode(input *string) (ere.InpatientClassCode, error) { diff --git a/internal/use-case/main-use-case/material-order-item/helper.go b/internal/use-case/main-use-case/material-order-item/helper.go index 25e89a21..f66daa0b 100644 --- a/internal/use-case/main-use-case/material-order-item/helper.go +++ b/internal/use-case/main-use-case/material-order-item/helper.go @@ -18,6 +18,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MaterialOrderItem) } data.MaterialOrder_Id = inputSrc.MaterialOrder_Id - data.Material_Id = inputSrc.Material_Id + data.Material_Code = inputSrc.Material_Code data.Count = inputSrc.Count } diff --git a/internal/use-case/main-use-case/material-order/case.go b/internal/use-case/main-use-case/material-order/case.go index 713f64c0..a6d3943c 100644 --- a/internal/use-case/main-use-case/material-order/case.go +++ b/internal/use-case/main-use-case/material-order/case.go @@ -6,7 +6,6 @@ import ( e "simrs-vx/internal/domain/main-entities/material-order" - ud "simrs-vx/internal/use-case/main-use-case/doctor" ue "simrs-vx/internal/use-case/main-use-case/encounter" erc "simrs-vx/internal/domain/references/common" @@ -56,11 +55,7 @@ func Create(input e.CreateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) - if err != nil { - return err - } - input.Doctor_Id = doctor_id + input.Doctor_Code = input.AuthInfo.Doctor_Code if resData, err := CreateData(input, &event, tx); err != nil { return err @@ -233,12 +228,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) - if err != nil { - return err - } - - if !data.IsSameDoctor(doctor_id) { + if !data.IsSameDoctor(input.AuthInfo.Doctor_Code) { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "auth-forbidden", @@ -248,7 +238,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - input.Doctor_Id = doctor_id + input.Doctor_Code = input.AuthInfo.Doctor_Code if err := UpdateData(input, data, &event, tx); err != nil { return err diff --git a/internal/use-case/main-use-case/material-order/helper.go b/internal/use-case/main-use-case/material-order/helper.go index fe0862e9..8f037f91 100644 --- a/internal/use-case/main-use-case/material-order/helper.go +++ b/internal/use-case/main-use-case/material-order/helper.go @@ -21,5 +21,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MaterialOrder) { } data.Encounter_Id = inputSrc.Encounter_Id - data.Doctor_Id = inputSrc.Doctor_Id + data.Doctor_Code = inputSrc.Doctor_Code } diff --git a/internal/use-case/main-use-case/mcu-order/case.go b/internal/use-case/main-use-case/mcu-order/case.go index 19b34cbe..38f13088 100644 --- a/internal/use-case/main-use-case/mcu-order/case.go +++ b/internal/use-case/main-use-case/mcu-order/case.go @@ -6,7 +6,6 @@ import ( e "simrs-vx/internal/domain/main-entities/mcu-order" - ud "simrs-vx/internal/use-case/main-use-case/doctor" ue "simrs-vx/internal/use-case/main-use-case/encounter" erc "simrs-vx/internal/domain/references/common" @@ -56,11 +55,7 @@ func Create(input e.CreateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) - if err != nil { - return err - } - input.Doctor_Id = doctor_id + input.Doctor_Code = input.AuthInfo.Doctor_Code if resData, err := CreateData(input, &event, tx); err != nil { return err @@ -233,12 +228,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) - if err != nil { - return err - } - - if !data.IsSameDoctor(doctor_id) { + if !data.IsSameDoctor(input.AuthInfo.Doctor_Code) { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "auth-forbidden", @@ -248,7 +238,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - input.Doctor_Id = doctor_id + input.Doctor_Code = input.AuthInfo.Doctor_Code if err := UpdateData(input, data, &event, tx); err != nil { return err diff --git a/internal/use-case/main-use-case/mcu-order/helper.go b/internal/use-case/main-use-case/mcu-order/helper.go index 7c21f1f6..1c803f68 100644 --- a/internal/use-case/main-use-case/mcu-order/helper.go +++ b/internal/use-case/main-use-case/mcu-order/helper.go @@ -21,12 +21,11 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuOrder) { } data.Encounter_Id = inputSrc.Encounter_Id - data.Doctor_Id = inputSrc.Doctor_Id + data.Doctor_Code = inputSrc.Doctor_Code data.SpecimenPickTime = inputSrc.SpecimenPickTime data.ExaminationDate = inputSrc.ExaminationDate data.Number = inputSrc.Number data.Temperature = inputSrc.Temperature data.UrgencyLevel_Code = inputSrc.UrgencyLevel_Code - data.Doctor_Id = inputSrc.Doctor_Id data.Scope_Code = inputSrc.Scope_Code } diff --git a/internal/use-case/main-use-case/mcu-src/case.go b/internal/use-case/main-use-case/mcu-src/case.go index 564a582b..31af8e84 100644 --- a/internal/use-case/main-use-case/mcu-src/case.go +++ b/internal/use-case/main-use-case/mcu-src/case.go @@ -170,7 +170,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} + rdDto := e.ReadDetailDto{Code: input.Code} var data *e.McuSrc var err error @@ -226,7 +226,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} + rdDto := e.ReadDetailDto{Code: input.Code} var data *e.McuSrc var err error diff --git a/internal/use-case/main-use-case/mcu-src/helper.go b/internal/use-case/main-use-case/mcu-src/helper.go index 9d808ca8..545def25 100644 --- a/internal/use-case/main-use-case/mcu-src/helper.go +++ b/internal/use-case/main-use-case/mcu-src/helper.go @@ -27,14 +27,14 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuSrc) { inputSrc = &inputTemp.CreateDto } - data.Code = inputSrc.Code + data.Code = *inputSrc.Code data.Name = inputSrc.Name data.McuSrcCategory_Code = inputSrc.McuSrcCategory_Code } func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { itemCreate := ei.CreateDto{ - Code: pu.AddPrefix("mcu-", input.Code), + Code: pu.AddPrefix("mcu-", *input.Code), Name: input.Name, ItemGroup_Code: ero.ITGCMCU, // Uom_Code: &input.Uom_Code, @@ -45,6 +45,6 @@ func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { return err } - input.Item_Id = &item.Id + input.Item_Code = &item.Code return nil } diff --git a/internal/use-case/main-use-case/mcu-src/lib.go b/internal/use-case/main-use-case/mcu-src/lib.go index e74d5ce8..d62c9282 100644 --- a/internal/use-case/main-use-case/mcu-src/lib.go +++ b/internal/use-case/main-use-case/mcu-src/lib.go @@ -81,7 +81,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.Code != nil { + tx = tx.Where("\"Code\" = ?", *input.Code) + } + if input.Id != nil { + 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/mcu-sub-src/case.go b/internal/use-case/main-use-case/mcu-sub-src/case.go index ba533bc4..fbb9f468 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/case.go +++ b/internal/use-case/main-use-case/mcu-sub-src/case.go @@ -170,7 +170,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} + rdDto := e.ReadDetailDto{Code: input.Code} var data *e.McuSubSrc var err error @@ -226,7 +226,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} + rdDto := e.ReadDetailDto{Code: input.Code} var data *e.McuSubSrc var err error diff --git a/internal/use-case/main-use-case/mcu-sub-src/helper.go b/internal/use-case/main-use-case/mcu-sub-src/helper.go index 95444d5a..962abe46 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/helper.go +++ b/internal/use-case/main-use-case/mcu-sub-src/helper.go @@ -27,15 +27,15 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuSubSrc) { inputSrc = &inputTemp.CreateDto } - data.Code = inputSrc.Code + data.Code = *inputSrc.Code data.Name = inputSrc.Name - data.McuSrc_Id = inputSrc.McuSrc_Id - data.Item_Id = inputSrc.Item_Id + data.McuSrc_Code = inputSrc.McuSrc_Code + data.Item_Code = inputSrc.Item_Code } func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { itemCreate := ei.CreateDto{ - Code: pu.AddPrefix("mcuSub-", input.Code), + Code: pu.AddPrefix("mcuSub-", *input.Code), Name: input.Name, ItemGroup_Code: ero.ITGCMCUSub, // Uom_Code: &input.Uom_Code, @@ -46,6 +46,6 @@ func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { return err } - input.Item_Id = &item.Id + input.Item_Code = &item.Code return nil } diff --git a/internal/use-case/main-use-case/mcu-sub-src/lib.go b/internal/use-case/main-use-case/mcu-sub-src/lib.go index 96684fef..438eb7ac 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/lib.go +++ b/internal/use-case/main-use-case/mcu-sub-src/lib.go @@ -81,7 +81,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.Code != nil { + tx = tx.Where("\"Code\" = ?", *input.Code) + } + if input.Id != nil { + 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/medical-action-src-item/helper.go b/internal/use-case/main-use-case/medical-action-src-item/helper.go index 385b0f53..09d028a9 100644 --- a/internal/use-case/main-use-case/medical-action-src-item/helper.go +++ b/internal/use-case/main-use-case/medical-action-src-item/helper.go @@ -16,7 +16,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicalActionSrcIte inputTemp := any(input).(*e.UpdateDto) inputSrc = &inputTemp.CreateDto } - data.MedicalActionSrc_Id = inputSrc.MedicalActionSrc_Id - data.ProcedureSrc_Id = inputSrc.ProcedureSrc_Id - data.Item_Id = inputSrc.Item_Id + data.MedicalActionSrc_Code = inputSrc.MedicalActionSrc_Code + data.ProcedureSrc_Code = inputSrc.ProcedureSrc_Code + data.Item_Code = inputSrc.Item_Code } diff --git a/internal/use-case/main-use-case/medical-action-src/case.go b/internal/use-case/main-use-case/medical-action-src/case.go index cd42766c..7ca58dde 100644 --- a/internal/use-case/main-use-case/medical-action-src/case.go +++ b/internal/use-case/main-use-case/medical-action-src/case.go @@ -169,7 +169,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + rdDto := e.ReadDetailDto{Code: input.Code} var data *e.MedicalActionSrc var err error @@ -225,7 +225,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + rdDto := e.ReadDetailDto{Code: input.Code} var data *e.MedicalActionSrc var err error diff --git a/internal/use-case/main-use-case/medical-action-src/helper.go b/internal/use-case/main-use-case/medical-action-src/helper.go index c955274d..910b6f8a 100644 --- a/internal/use-case/main-use-case/medical-action-src/helper.go +++ b/internal/use-case/main-use-case/medical-action-src/helper.go @@ -27,15 +27,15 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicalActionSrc) { inputSrc = &inputTemp.CreateDto } - data.Code = inputSrc.Code + data.Code = *inputSrc.Code data.Name = inputSrc.Name data.Type_Code = inputSrc.Type_Code - data.Item_Id = inputSrc.Item_Id + data.Item_Code = inputSrc.Item_Code } func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { itemCreate := ei.CreateDto{ - Code: pu.AddPrefix("medAct-", input.Code), + Code: pu.AddPrefix("medAct-", *input.Code), Name: input.Name, ItemGroup_Code: ero.ITGCMedAct, } @@ -44,6 +44,6 @@ func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { return err } - input.Item_Id = &item.Id + input.Item_Code = &item.Code return nil } diff --git a/internal/use-case/main-use-case/medical-action-src/lib.go b/internal/use-case/main-use-case/medical-action-src/lib.go index 31492861..dd29a6b3 100644 --- a/internal/use-case/main-use-case/medical-action-src/lib.go +++ b/internal/use-case/main-use-case/medical-action-src/lib.go @@ -81,7 +81,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.Code != nil { + tx = tx.Where("\"Code\" = ?", *input.Code) + } + if input.Id != nil { + 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-fes/case.go b/internal/use-case/main-use-case/user-fes/case.go new file mode 100644 index 00000000..51225927 --- /dev/null +++ b/internal/use-case/main-use-case/user-fes/case.go @@ -0,0 +1,276 @@ +package userfes + +import ( + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + "gorm.io/gorm" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + e "simrs-vx/internal/domain/main-entities/user-fes" +) + +const source = "ext-user" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.UserFes{} + + 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.UserFes + var dataList []e.UserFes + 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.UserFes + 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.UserFes + 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.UserFes + 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 + +} diff --git a/internal/use-case/main-use-case/user-fes/helper.go b/internal/use-case/main-use-case/user-fes/helper.go new file mode 100644 index 00000000..b83d303f --- /dev/null +++ b/internal/use-case/main-use-case/user-fes/helper.go @@ -0,0 +1,18 @@ +package userfes + +import ( + e "simrs-vx/internal/domain/main-entities/user-fes" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.UserFes) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + data.Name = inputSrc.Name + data.AuthPartner_Code = inputSrc.AuthPartner_Code + data.User_Name = inputSrc.User_Name +} diff --git a/internal/use-case/main-use-case/user-fes/lib.go b/internal/use-case/main-use-case/user-fes/lib.go new file mode 100644 index 00000000..ce7c8280 --- /dev/null +++ b/internal/use-case/main-use-case/user-fes/lib.go @@ -0,0 +1,143 @@ +package userfes + +import ( + "gorm.io/gorm" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + eu "simrs-vx/internal/domain/main-entities/user-fes" +) + +func CreateData(input eu.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*eu.UserFes, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := eu.UserFes{} + 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 eu.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]eu.UserFes, *eu.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []eu.UserFes{} + pagination := gh.Pagination{} + count := int64(0) + meta := eu.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&eu.UserFes{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) + + 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 eu.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*eu.UserFes, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := eu.UserFes{} + + 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 eu.UpdateDto, data *eu.UserFes, 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 *eu.UserFes, 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 +} diff --git a/internal/use-case/main-use-case/user-fes/middleware-runner.go b/internal/use-case/main-use-case/user-fes/middleware-runner.go new file mode 100644 index 00000000..f669d4cd --- /dev/null +++ b/internal/use-case/main-use-case/user-fes/middleware-runner.go @@ -0,0 +1,103 @@ +package userfes + +import ( + e "simrs-vx/internal/domain/main-entities/user-fes" + 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.UserFes) 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.UserFes) 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.UserFes) 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.UserFes) 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.UserFes) 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 +} diff --git a/internal/use-case/main-use-case/user-fes/middleware.go b/internal/use-case/main-use-case/user-fes/middleware.go new file mode 100644 index 00000000..71dac997 --- /dev/null +++ b/internal/use-case/main-use-case/user-fes/middleware.go @@ -0,0 +1,5 @@ +package userfes + +func init() { + +} diff --git a/internal/use-case/main-use-case/user-fes/tycovar.go b/internal/use-case/main-use-case/user-fes/tycovar.go new file mode 100644 index 00000000..008f5cfa --- /dev/null +++ b/internal/use-case/main-use-case/user-fes/tycovar.go @@ -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 userfes + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/user-fes" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.UserFes, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.UserFes, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.UserFes, 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