diff --git a/cmd/main-migration/migrations/20251009042854.sql b/cmd/main-migration/migrations/20251009042854.sql new file mode 100644 index 00000000..c8b5ec23 --- /dev/null +++ b/cmd/main-migration/migrations/20251009042854.sql @@ -0,0 +1,9 @@ +-- Create "PostalCode" table +CREATE TABLE "public"."PostalCode" ( + "Id" bigserial NOT NULL, + "Code" character varying(5) NULL, + "Village_Code" character varying(10) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_PostalCode_Code" UNIQUE ("Code"), + CONSTRAINT "fk_Village_PostalCodes" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/20251009052657.sql b/cmd/main-migration/migrations/20251009052657.sql new file mode 100644 index 00000000..5655a577 --- /dev/null +++ b/cmd/main-migration/migrations/20251009052657.sql @@ -0,0 +1,8 @@ +-- Modify "Regency" table +ALTER TABLE "public"."Regency" DROP CONSTRAINT "fk_Province_Regencies", ALTER COLUMN "Id" TYPE bigint, ADD CONSTRAINT "fk_Regency_Province" FOREIGN KEY ("Province_Code") REFERENCES "public"."Province" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "District" table +ALTER TABLE "public"."District" DROP CONSTRAINT "fk_Regency_Districts", ADD CONSTRAINT "fk_District_Regency" FOREIGN KEY ("Regency_Code") REFERENCES "public"."Regency" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "Village" table +ALTER TABLE "public"."Village" DROP CONSTRAINT "fk_District_Villages", ADD CONSTRAINT "fk_Village_District" FOREIGN KEY ("District_Code") REFERENCES "public"."District" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "PostalCode" table +ALTER TABLE "public"."PostalCode" DROP CONSTRAINT "fk_Village_PostalCodes", ADD CONSTRAINT "fk_PostalCode_Village" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 5ef938c0..e06784b3 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:8cWwLjbT/RIIeLTxM5t9O3pCbmZZFVud4a6PrqIPqT8= +h1:TrdoKKXrICvDA283WGDf33WtWHglk1twvjDpYrNwc8o= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -32,3 +32,5 @@ h1:8cWwLjbT/RIIeLTxM5t9O3pCbmZZFVud4a6PrqIPqT8= 20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= 20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= 20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= +20251009042854.sql h1:vK7bDqUDTxjHMSh1wrQiKITeqbB/7aqkWaPut8nGA68= +20251009052657.sql h1:I0rBPBg1o6zuRaxqWqCh82rI+NN7Gr6C//8ItUaLmtY= diff --git a/internal/domain/main-entities/district/base/entity.go b/internal/domain/main-entities/district/base/entity.go new file mode 100644 index 00000000..c7429490 --- /dev/null +++ b/internal/domain/main-entities/district/base/entity.go @@ -0,0 +1,8 @@ +package base + +type Basic struct { + Id uint32 `json:"id" gorm:"primaryKey"` + Regency_Code string `json:"regency_code" gorm:"size:4"` + Code string `json:"code" gorm:"unique;size:6"` // NOTE: THE PROPER SIZE IS 6 + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/district/dto.go b/internal/domain/main-entities/district/dto.go index f126867d..1f3c4494 100644 --- a/internal/domain/main-entities/district/dto.go +++ b/internal/domain/main-entities/district/dto.go @@ -2,7 +2,9 @@ package district import ( ecore "simrs-vx/internal/domain/base-entities/core" - ev "simrs-vx/internal/domain/main-entities/village" + edb "simrs-vx/internal/domain/main-entities/district/base" + er "simrs-vx/internal/domain/main-entities/regency" + evb "simrs-vx/internal/domain/main-entities/village/base" ) type CreateDto struct { @@ -47,11 +49,9 @@ type MetaDto struct { } type ResponseDto struct { - Id uint32 `json:"id"` - Regency_Code string `json:"regency_code"` - Code string `json:"code"` - Name string `json:"name"` - Villages []*ev.Village `json:"villages,omitempty"` + edb.Basic + Regency *er.Regency `json:"regency,omitempty"` + Villages []*evb.Basic `json:"villages,omitempty"` } func (d District) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/district/entity.go b/internal/domain/main-entities/district/entity.go index a3ad27e7..b9cb89c3 100644 --- a/internal/domain/main-entities/district/entity.go +++ b/internal/domain/main-entities/district/entity.go @@ -1,11 +1,13 @@ package district -import ev "simrs-vx/internal/domain/main-entities/village" +import ( + edb "simrs-vx/internal/domain/main-entities/district/base" + er "simrs-vx/internal/domain/main-entities/regency" + evb "simrs-vx/internal/domain/main-entities/village/base" +) type District struct { - Id uint32 `json:"id" gorm:"primaryKey"` - Regency_Code string `json:"regency_code" gorm:"size:4"` - Code string `json:"code" gorm:"unique;size:6"` // NOTE: THE PROPER SIZE IS 6 - Name string `json:"name" gorm:"size:50"` - Villages []*ev.Village `json:"villages,omitempty" gorm:"foreignKey:District_Code;references:Code"` + edb.Basic + Regency *er.Regency `json:"regency,omitempty" gorm:"foreignKey:Regency_Code;references:Code"` + Villages []*evb.Basic `json:"villages,omitempty" gorm:"foreignKey:District_Code;references:Code"` } diff --git a/internal/domain/main-entities/postal-code/base/entity.go b/internal/domain/main-entities/postal-code/base/entity.go new file mode 100644 index 00000000..814e4e72 --- /dev/null +++ b/internal/domain/main-entities/postal-code/base/entity.go @@ -0,0 +1,7 @@ +package base + +type Basic struct { + Id uint32 `json:"id" gorm:"primaryKey"` + Village_Code string `json:"village_code" gorm:"size:10"` + Code string `json:"code" gorm:"unique;size:5"` +} diff --git a/internal/domain/main-entities/postal-code/dto.go b/internal/domain/main-entities/postal-code/dto.go new file mode 100644 index 00000000..cb1e3d39 --- /dev/null +++ b/internal/domain/main-entities/postal-code/dto.go @@ -0,0 +1,60 @@ +package postalcode + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Code string `json:"code" validate:"numeric;maxLength=10"` + Village_Code string `json:"district_code" validate:"numeric;maxLength=10"` +} + +type ReadListDto struct { + District_Code string `json:"district_code"` + Code string `json:"code"` + Name string `json:"name"` + Pagination ecore.Pagination +} + +type ReadDetailDto struct { + Id uint32 `json:"id"` + Code *string `json:"code"` +} + +type UpdateDto struct { + Id uint32 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint32 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + Id uint32 `json:"id"` + Village_Code string `json:"village_code"` + Code string `json:"code"` +} + +func (d PostalCode) ToResponse() ResponseDto { + resp := ResponseDto{ + Id: d.Id, + Village_Code: d.Village_Code, + Code: d.Code, + } + return resp +} + +func ToResponseList(data []PostalCode) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/postal-code/entity.go b/internal/domain/main-entities/postal-code/entity.go new file mode 100644 index 00000000..2825db9c --- /dev/null +++ b/internal/domain/main-entities/postal-code/entity.go @@ -0,0 +1,11 @@ +package postalcode + +import ( + ep "simrs-vx/internal/domain/main-entities/postal-code/base" + ev "simrs-vx/internal/domain/main-entities/village" +) + +type PostalCode struct { + ep.Basic + Village *ev.Village `json:"village,omitempty" gorm:"foreignKey:Village_Code;references:Code"` +} diff --git a/internal/domain/main-entities/province/dto.go b/internal/domain/main-entities/province/dto.go index cf49cd43..e8ea71ce 100644 --- a/internal/domain/main-entities/province/dto.go +++ b/internal/domain/main-entities/province/dto.go @@ -2,7 +2,7 @@ package province import ( ecore "simrs-vx/internal/domain/base-entities/core" - er "simrs-vx/internal/domain/main-entities/regency" + erb "simrs-vx/internal/domain/main-entities/regency/base" ) type CreateDto struct { @@ -45,14 +45,19 @@ type MetaDto struct { } type ResponseDto struct { - Id int16 `json:"id"` - Code string `json:"code"` - Name string `json:"name"` - Regencies []*er.Regency `json:"regencies,omitempty"` + Id int16 `json:"id"` + Code string `json:"code"` + Name string `json:"name"` + Regencies []erb.Basic `json:"regencies,omitempty"` } func (d Province) ToResponse() ResponseDto { - resp := ResponseDto(d) + resp := ResponseDto{ + Id: d.Id, + Code: d.Code, + Name: d.Name, + Regencies: d.Regencies, + } return resp } diff --git a/internal/domain/main-entities/province/entity.go b/internal/domain/main-entities/province/entity.go index ab024b22..198cf4a4 100644 --- a/internal/domain/main-entities/province/entity.go +++ b/internal/domain/main-entities/province/entity.go @@ -1,10 +1,10 @@ package province -import er "simrs-vx/internal/domain/main-entities/regency" +import erb "simrs-vx/internal/domain/main-entities/regency/base" type Province struct { - Id int16 `json:"id" gorm:"primaryKey"` - Code string `json:"code" gorm:"unique;size:2"` - Name string `json:"name" gorm:"size:50"` - Regencies []*er.Regency `json:"regencies,omitempty" gorm:"foreignKey:Province_Code;references:Code"` + Id int16 `json:"id" gorm:"primaryKey"` + Code string `json:"code" gorm:"unique;size:2"` + Name string `json:"name" gorm:"size:50"` + Regencies []erb.Basic `json:"regencies,omitempty" gorm:"foreignKey:Province_Code;references:Code"` } diff --git a/internal/domain/main-entities/regency/base/entitiy.go b/internal/domain/main-entities/regency/base/entitiy.go new file mode 100644 index 00000000..b6c982ec --- /dev/null +++ b/internal/domain/main-entities/regency/base/entitiy.go @@ -0,0 +1,8 @@ +package base + +type Basic struct { + Id uint32 `json:"id" gorm:"primaryKey"` + Province_Code string `json:"province_code" gorm:"size:2"` + Code string `json:"code" gorm:"unique;size:4"` + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/regency/dto.go b/internal/domain/main-entities/regency/dto.go index 0bc7ca51..f709f001 100644 --- a/internal/domain/main-entities/regency/dto.go +++ b/internal/domain/main-entities/regency/dto.go @@ -2,7 +2,9 @@ package regency import ( ecore "simrs-vx/internal/domain/base-entities/core" - ed "simrs-vx/internal/domain/main-entities/district" + edb "simrs-vx/internal/domain/main-entities/district/base" + ep "simrs-vx/internal/domain/main-entities/province" + erb "simrs-vx/internal/domain/main-entities/regency/base" ) type CreateDto struct { @@ -47,15 +49,17 @@ type MetaDto struct { } type ResponseDto struct { - Id uint16 `json:"id"` - Province_Code string `json:"province_code"` - Code string `json:"code"` - Name string `json:"name"` - Districts []*ed.District `json:"districts,omitempty"` + erb.Basic + Province *ep.Province `json:"province,omitempty"` + Districts []*edb.Basic `json:"districts,omitempty"` } func (d Regency) ToResponse() ResponseDto { - resp := ResponseDto(d) + resp := ResponseDto{ + Basic: d.Basic, + Province: d.Province, + Districts: d.Districts, + } return resp } diff --git a/internal/domain/main-entities/regency/entity.go b/internal/domain/main-entities/regency/entity.go index 3bdcf934..bf58e37b 100644 --- a/internal/domain/main-entities/regency/entity.go +++ b/internal/domain/main-entities/regency/entity.go @@ -1,11 +1,13 @@ package regency -import ed "simrs-vx/internal/domain/main-entities/district" +import ( + edb "simrs-vx/internal/domain/main-entities/district/base" + ep "simrs-vx/internal/domain/main-entities/province" + erb "simrs-vx/internal/domain/main-entities/regency/base" +) type Regency struct { - Id uint16 `json:"id" gorm:"primaryKey"` - Province_Code string `json:"province_code" gorm:"size:2"` - Code string `json:"code" gorm:"unique;size:4"` - Name string `json:"name" gorm:"size:50"` - Districts []*ed.District `json:"districts,omitempty" gorm:"foreignKey:Regency_Code;references:Code"` + erb.Basic + Province *ep.Province `json:"province,omitempty" gorm:"foreignKey:Province_Code;references:Code"` + Districts []*edb.Basic `json:"districts,omitempty" gorm:"foreignKey:Regency_Code;references:Code"` } diff --git a/internal/domain/main-entities/village/base/entity.go b/internal/domain/main-entities/village/base/entity.go new file mode 100644 index 00000000..45cba2ba --- /dev/null +++ b/internal/domain/main-entities/village/base/entity.go @@ -0,0 +1,8 @@ +package base + +type Basic struct { + Id uint32 `json:"id" gorm:"primaryKey"` + District_Code string `json:"district_code" gorm:"size:6"` + Code string `json:"code" gorm:"unique;size:10"` + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index 70b738df..42e806ec 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -2,6 +2,9 @@ package village import ( ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/district" + epb "simrs-vx/internal/domain/main-entities/postal-code/base" + evb "simrs-vx/internal/domain/main-entities/village/base" ) type CreateDto struct { @@ -46,14 +49,17 @@ type MetaDto struct { } type ResponseDto struct { - Id uint32 `json:"id"` - District_Code string `json:"district_code"` - Code string `json:"code"` - Name string `json:"name"` + evb.Basic + District *ed.District `json:"district,omitempty"` + PostalCodes []epb.Basic `json:"postalCodes,omitempty"` } func (d Village) ToResponse() ResponseDto { - resp := ResponseDto(d) + resp := ResponseDto{ + Basic: d.Basic, + District: d.District, + PostalCodes: d.PostalCodes, + } return resp } diff --git a/internal/domain/main-entities/village/entity.go b/internal/domain/main-entities/village/entity.go index aae0caf5..d7c549bc 100644 --- a/internal/domain/main-entities/village/entity.go +++ b/internal/domain/main-entities/village/entity.go @@ -1,8 +1,13 @@ package village +import ( + ed "simrs-vx/internal/domain/main-entities/district" + epb "simrs-vx/internal/domain/main-entities/postal-code/base" + evb "simrs-vx/internal/domain/main-entities/village/base" +) + type Village struct { - Id uint32 `json:"id" gorm:"primaryKey"` - District_Code string `json:"district_code" gorm:"size:6"` // NOT: THE PROPER SIZE IS 6 - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` + evb.Basic + District *ed.District `json:"district,omitempty" gorm:"foreignKey:District_Code;references:Code"` + PostalCodes []epb.Basic `json:"postalCodes,omitempty" gorm:"foreignKey:Village_Code;references:Code"` } diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 9711c6bd..fcb3db9e 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -57,6 +57,7 @@ import ( personrelative "simrs-vx/internal/domain/main-entities/person-relative" pharmacist "simrs-vx/internal/domain/main-entities/pharmacist" pharmacycompany "simrs-vx/internal/domain/main-entities/pharmacy-company" + postalcode "simrs-vx/internal/domain/main-entities/postal-code" practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" prescription "simrs-vx/internal/domain/main-entities/prescription" prescriptionitem "simrs-vx/internal/domain/main-entities/prescription-item" @@ -149,5 +150,6 @@ func getMainEntities() []any { &consultation.Consultation{}, &chemo.Chemo{}, &midwife.Midwife{}, + &postalcode.PostalCode{}, } }