diff --git a/cmd/main-api/config.yml-example b/cmd/main-api/config.yml-example index aaf986f0..f131a725 100644 --- a/cmd/main-api/config.yml-example +++ b/cmd/main-api/config.yml-example @@ -15,11 +15,19 @@ dbCfg: maxIdleConns: 5 maxIdleTime: 100 -ssDbCfg: - dsn: - maxOpenConns: 5 - maxIdleConns: 5 - maxIdleTime: 100 +multiDbCfg: + - dbs : + name: + dsn: + maxOpenConns: + maxIdleConns: + maxIdleTime: + - bpjs + name: bpjs + dsn: + maxOpenConns: + maxIdleConns: + maxIdleTime: loggerCfg: hideTime: diff --git a/cmd/main-migration/Makefile b/cmd/main-migration/Makefile new file mode 100644 index 00000000..92a4be84 --- /dev/null +++ b/cmd/main-migration/Makefile @@ -0,0 +1,18 @@ +# Makefile for Atlas migrations + +# Default environment +ENV ?= gorm + +.PHONY: diff apply hash + +## Generate a new migration diff +diff: + atlas migrate diff --env $(ENV) + +## Apply migrations to the database +apply: + atlas migrate apply --env $(ENV) + +## Calculate the schema hash +hash: + atlas schema hash --env $(ENV) diff --git a/cmd/main-migration/README-ATLAS.MD b/cmd/main-migration/README-ATLAS.MD new file mode 100644 index 00000000..da249823 --- /dev/null +++ b/cmd/main-migration/README-ATLAS.MD @@ -0,0 +1,59 @@ +# Database Migration with Atlas + +This project uses [Atlas](https://atlasgo.io/) for database schema management and migrations. + +## 📋 Prerequisites + +1. **Download and Install Atlas CLI** + Run the following command in PowerShell or Git Bash: + + ```sh + curl -sSf https://atlasgo.sh | sh + ``` + Verify installation: + + ```sh + atlas version + ``` + +2. Install GORM Provider + Run inside your Go project: + + ```sh + go get -u ariga.io/atlas-provider-gorm + ``` + +3. Create atlas.hcl configuration file + Just create an atlas.hcl file in your project root as example given at atlas.hcl.example +4. Create migrations folder + ```sh + mkdir migrations + ``` +5. Usage +You can use the provided Makefile for common commands: + + Generate a migration diff + ```sh + make diff + ``` + + Apply migrations + ```sh + make apply + ``` + + Compute schema hash + ```sh + make hash + ``` + + If you don’t have make installed, you can run the Atlas commands directly: + ```sh + atlas migrate diff --env gorm + ``` + ```sh + atlas migrate apply --env gorm + ``` + ```sh + atlas migrate hash + ``` \ No newline at end of file diff --git a/cmd/main-migration/atlas.hcl b/cmd/main-migration/atlas.hcl new file mode 100644 index 00000000..3372fb2d --- /dev/null +++ b/cmd/main-migration/atlas.hcl @@ -0,0 +1,22 @@ +data "external_schema" "gorm" { + program = [ + "go", + "run", + "-mod=mod", + ".", + ] +} + +env "gorm" { + src = data.external_schema.gorm.url + dev = "postgres://moko:password@localhost:5432/simrs_vx3?sslmode=disable" + migration { + dir = "file://migrations" + } + url = "postgres://moko:password@localhost:5432/simrs_vx1?sslmode=disable" + format { + migrate { + diff = "{{ sql . \" \" }}" + } + } +} \ No newline at end of file diff --git a/cmd/migration/atlas.hcl.example b/cmd/main-migration/atlas.hcl.example similarity index 100% rename from cmd/migration/atlas.hcl.example rename to cmd/main-migration/atlas.hcl.example diff --git a/cmd/migration/migration.go b/cmd/main-migration/migration.go similarity index 81% rename from cmd/migration/migration.go rename to cmd/main-migration/migration.go index c225edf1..dd28a55f 100644 --- a/cmd/migration/migration.go +++ b/cmd/main-migration/migration.go @@ -5,5 +5,5 @@ import ( ) func main() { - m.Migrate() + m.Migrate(m.Main) } diff --git a/cmd/migration/migrations/20250904105930.sql b/cmd/main-migration/migrations/20250904105930.sql similarity index 100% rename from cmd/migration/migrations/20250904105930.sql rename to cmd/main-migration/migrations/20250904105930.sql diff --git a/cmd/migration/migrations/20250904141448.sql b/cmd/main-migration/migrations/20250904141448.sql similarity index 100% rename from cmd/migration/migrations/20250904141448.sql rename to cmd/main-migration/migrations/20250904141448.sql diff --git a/cmd/migration/migrations/20250908062237.sql b/cmd/main-migration/migrations/20250908062237.sql similarity index 100% rename from cmd/migration/migrations/20250908062237.sql rename to cmd/main-migration/migrations/20250908062237.sql diff --git a/cmd/migration/migrations/20250908062323.sql b/cmd/main-migration/migrations/20250908062323.sql similarity index 100% rename from cmd/migration/migrations/20250908062323.sql rename to cmd/main-migration/migrations/20250908062323.sql diff --git a/cmd/migration/migrations/20250908073811.sql b/cmd/main-migration/migrations/20250908073811.sql similarity index 100% rename from cmd/migration/migrations/20250908073811.sql rename to cmd/main-migration/migrations/20250908073811.sql diff --git a/cmd/migration/migrations/20250908073839.sql b/cmd/main-migration/migrations/20250908073839.sql similarity index 100% rename from cmd/migration/migrations/20250908073839.sql rename to cmd/main-migration/migrations/20250908073839.sql diff --git a/cmd/migration/migrations/20250910055902.sql b/cmd/main-migration/migrations/20250910055902.sql similarity index 100% rename from cmd/migration/migrations/20250910055902.sql rename to cmd/main-migration/migrations/20250910055902.sql diff --git a/cmd/migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum similarity index 77% rename from cmd/migration/migrations/atlas.sum rename to cmd/main-migration/migrations/atlas.sum index 28fa58f4..3482f994 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,8 +1,8 @@ -h1:dw8c/C5xz/Do+p93EVuqfaZWYja1GO1VsbM7vuCJYGo= +h1:BLtMDgAdnqZbCj3HUbiTlyYtA87C4LcP/uquCbM6GSE= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= 20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= 20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= 20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:fnLqf63sb0R02rzoj1Gnncp32NW/bUcBAMLyV4qF968= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= diff --git a/cmd/migration/config.yml-example b/cmd/migration/config.yml-example deleted file mode 100644 index 19893fd7..00000000 --- a/cmd/migration/config.yml-example +++ /dev/null @@ -1,47 +0,0 @@ -appCfg: - fullName: BPJS Bridge - codeName: simrs-vx - version: 0.1.0 - env: development - lang: en - -httpCfg: - host: - port: - -dbCfg: - dsn: - maxOpenConns: 5 - maxIdleConns: 5 - maxIdleTime: 100 - -loggerCfg: - hideTime: - hideLevel: - -msCfg: - dsn: - -langCfg: - active: - path: - fileName: - -minioCfg: - endpoint: - region: - accessKey: - secretKey: - useSsl: - bucketName: - - patient - -corsCfg: - allowedOrigin: - allowedMethod: - -satuSehatCfg: - host: localhsot:8200 - -bpjsCfg: - host: localhsot:8200 diff --git a/cmd/satusehat-migration/Makefile b/cmd/satusehat-migration/Makefile new file mode 100644 index 00000000..92a4be84 --- /dev/null +++ b/cmd/satusehat-migration/Makefile @@ -0,0 +1,18 @@ +# Makefile for Atlas migrations + +# Default environment +ENV ?= gorm + +.PHONY: diff apply hash + +## Generate a new migration diff +diff: + atlas migrate diff --env $(ENV) + +## Apply migrations to the database +apply: + atlas migrate apply --env $(ENV) + +## Calculate the schema hash +hash: + atlas schema hash --env $(ENV) diff --git a/cmd/satusehat-migration/README-ATLAS.MD b/cmd/satusehat-migration/README-ATLAS.MD new file mode 100644 index 00000000..da249823 --- /dev/null +++ b/cmd/satusehat-migration/README-ATLAS.MD @@ -0,0 +1,59 @@ +# Database Migration with Atlas + +This project uses [Atlas](https://atlasgo.io/) for database schema management and migrations. + +## 📋 Prerequisites + +1. **Download and Install Atlas CLI** + Run the following command in PowerShell or Git Bash: + + ```sh + curl -sSf https://atlasgo.sh | sh + ``` + Verify installation: + + ```sh + atlas version + ``` + +2. Install GORM Provider + Run inside your Go project: + + ```sh + go get -u ariga.io/atlas-provider-gorm + ``` + +3. Create atlas.hcl configuration file + Just create an atlas.hcl file in your project root as example given at atlas.hcl.example +4. Create migrations folder + ```sh + mkdir migrations + ``` +5. Usage +You can use the provided Makefile for common commands: + + Generate a migration diff + ```sh + make diff + ``` + + Apply migrations + ```sh + make apply + ``` + + Compute schema hash + ```sh + make hash + ``` + + If you don’t have make installed, you can run the Atlas commands directly: + ```sh + atlas migrate diff --env gorm + ``` + ```sh + atlas migrate apply --env gorm + ``` + ```sh + atlas migrate hash + ``` \ No newline at end of file diff --git a/cmd/satusehat-migration/atlas.hcl b/cmd/satusehat-migration/atlas.hcl new file mode 100644 index 00000000..5efd3e80 --- /dev/null +++ b/cmd/satusehat-migration/atlas.hcl @@ -0,0 +1,22 @@ +data "external_schema" "gorm" { + program = [ + "go", + "run", + "-mod=mod", + ".", + ] +} + +env "gorm" { + src = data.external_schema.gorm.url + dev = "postgres://moko:password@localhost:5432/satusehat_diff?sslmode=disable" + migration { + dir = "file://migrations" + } + url = "postgres://moko:password@localhost:5432/satusehat_main?sslmode=disable" + format { + migrate { + diff = "{{ sql . \" \" }}" + } + } +} \ No newline at end of file diff --git a/cmd/satusehat-migration/atlas.hcl.example b/cmd/satusehat-migration/atlas.hcl.example new file mode 100644 index 00000000..857d1352 --- /dev/null +++ b/cmd/satusehat-migration/atlas.hcl.example @@ -0,0 +1,22 @@ +data "external_schema" "gorm" { + program = [ + "go", + "run", + "-mod=mod", + ".", + ] +} + +env "gorm" { + src = data.external_schema.gorm.url + dev = "" // dsn db to check the diff + migration { + dir = "file://migrations" + } + url = "" // dsn db to apply + format { + migrate { + diff = "{{ sql . \" \" }}" + } + } +} \ No newline at end of file diff --git a/cmd/satusehat-migration/migration.go b/cmd/satusehat-migration/migration.go new file mode 100644 index 00000000..e426633e --- /dev/null +++ b/cmd/satusehat-migration/migration.go @@ -0,0 +1,9 @@ +package main + +import ( + m "simrs-vx/internal/interface/migration" +) + +func main() { + m.Migrate(m.SatuSehat) +} diff --git a/go.mod b/go.mod index c7e8a5fc..e717f960 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( ariga.io/atlas-provider-gorm v0.5.6 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.6.0 - github.com/karincake/apem v0.0.16-h + github.com/karincake/apem v0.0.17 github.com/karincake/dodol v0.0.1 github.com/karincake/getuk v0.1.0 github.com/karincake/hongkue v0.0.4 @@ -18,7 +18,6 @@ require ( github.com/karincake/serabi v0.0.14 github.com/rs/zerolog v1.33.0 golang.org/x/crypto v0.41.0 - gorm.io/driver/postgres v1.5.11 gorm.io/gorm v1.25.12 ) @@ -46,6 +45,7 @@ require ( golang.org/x/text v0.28.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.5.11 // indirect gorm.io/driver/sqlite v1.5.7 // indirect gorm.io/driver/sqlserver v1.5.4 // indirect ) diff --git a/go.sum b/go.sum index 8982eb2b..3045e095 100644 --- a/go.sum +++ b/go.sum @@ -69,8 +69,8 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/karincake/apem v0.0.16-h h1:rfO444oDG4cWFf0PjUshA+0U8KI/u067Va273WeJhpU= -github.com/karincake/apem v0.0.16-h/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM= +github.com/karincake/apem v0.0.17 h1:y3WXCr9GWLFFFH4Qyq/VWlWWpijHh5zpTc3Lm96twa4= +github.com/karincake/apem v0.0.17/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM= github.com/karincake/dodol v0.0.1 h1:jUXmJh1r0Ei4fmHPZ6IUkoplW/V9d27L63JEl6zudL0= github.com/karincake/dodol v0.0.1/go.mod h1:2f1NcvkvY0J3GMUkwILNDYVvRUpz0W3lpPp/Ha/Ld24= github.com/karincake/getuk v0.1.0 h1:jcIsASrr0UDE528GN7Ua6n9UFyRgUypsWh8Or8wzCO0= diff --git a/internal/domain/satusehat-entities/patient/entity.go b/internal/domain/satusehat-entities/patient/entity.go new file mode 100644 index 00000000..21c6075b --- /dev/null +++ b/internal/domain/satusehat-entities/patient/entity.go @@ -0,0 +1,92 @@ +package patient + +type Patient struct { + ResourceType string `json:"resourceType"` + // Meta Meta `json:"meta"` + // Identifier []Identifier `json:"identifier"` + Active bool `json:"active"` + // Name []HumanName `json:"name"` + // Telecom []ContactPoint `json:"telecom"` + Gender string `json:"gender" gorm:"size:10"` + BirthDate string `json:"birthDate"` + DeceasedBool bool `json:"deceasedBoolean"` + // Address []Address `json:"address"` + // MaritalStatus MaritalStatus `json:"maritalStatus"` + MultipleBirthInteger int `json:"multipleBirthInteger"` + // Contact []Contact `json:"contact"` + // Communication []Communication `json:"communication"` + // Extension []Extension `json:"extension"` +} + +type Meta struct { + Profile []string `json:"profile"` +} + +type Identifier struct { + Use string `json:"use"` + System string `json:"system"` + Value string `json:"value"` +} + +type HumanName struct { + Use string `json:"use"` + Text string `json:"text"` +} + +type ContactPoint struct { + System string `json:"system"` + Value string `json:"value"` + Use string `json:"use"` +} + +type Address struct { + Use string `json:"use"` + Line []string `json:"line"` + City string `json:"city"` + PostalCode string `json:"postalCode"` + Country string `json:"country"` + Extension []Extension `json:"extension"` +} + +type Extension struct { + URL string `json:"url"` + Extension []SubExtension `json:"extension,omitempty"` + ValueCode string `json:"valueCode,omitempty"` + ValueAddress *Address `json:"valueAddress,omitempty"` +} + +type SubExtension struct { + URL string `json:"url"` + ValueCode string `json:"valueCode"` +} + +type MaritalStatus struct { + Coding []Coding `json:"coding"` + Text string `json:"text"` +} + +type Coding struct { + System string `json:"system"` + Code string `json:"code"` + Display string `json:"display,omitempty"` +} + +type Contact struct { + Relationship []Relationship `json:"relationship"` + Name HumanName `json:"name"` + Telecom []ContactPoint `json:"telecom"` +} + +type Relationship struct { + Coding []Coding `json:"coding"` +} + +type Communication struct { + Language Language `json:"language"` + Preferred bool `json:"preferred"` +} + +type Language struct { + Coding []Coding `json:"coding"` + Text string `json:"text"` +} diff --git a/internal/infra/ss-db/ss-db.go b/internal/infra/ss-db/ss-db.go index 3c239540..f63c4b44 100644 --- a/internal/infra/ss-db/ss-db.go +++ b/internal/infra/ss-db/ss-db.go @@ -1,36 +1,9 @@ package ssdb import ( - "log" - - a "github.com/karincake/apem" - lo "github.com/karincake/apem/loggero" - "gorm.io/driver/postgres" - "gorm.io/gorm" - "gorm.io/gorm/schema" + dg "github.com/karincake/apem/db-gorm-pg" ) -func Init() { - SetConfig() - NewInstance() -} - -func SetConfig() { - a.ParseSingleCfg(&Cfg) -} - -func NewInstance() { - // create database connection - db, err := gorm.Open(postgres.Open(Cfg.Dsn), &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - NoLowerCase: true, - }, - }) - if err != nil { - log.Fatal(err) - } - - SSDb = db - lo.I.Println("Instantiation for satu-sehat database-connetion using db-gorm-pg, status: DONE!!") +func SetInstance() { + I = dg.IS["satusehat"] } diff --git a/internal/infra/ss-db/tycovar.go b/internal/infra/ss-db/tycovar.go index ff084508..55fc90fd 100644 --- a/internal/infra/ss-db/tycovar.go +++ b/internal/infra/ss-db/tycovar.go @@ -2,12 +2,4 @@ package ssdb import "gorm.io/gorm" -type SsDbCfg struct { - Dsn string - MaxOpenConns int `yaml:"maxOpenConns"` - MaxIdleConns int `yaml:"maxIdleConns"` - MaxIdleTime int `yaml:"maxIdleTime"` -} - -var Cfg SsDbCfg = SsDbCfg{} -var SSDb *gorm.DB +var I *gorm.DB diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 5c9559f4..363e9ad1 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -84,7 +84,7 @@ func SetRoutes() http.Handler { ///// a.RegisterExtCall(gs.Adjust) a.RegisterExtCall(zlc.Adjust) - a.RegisterExtCall(ssdb.Init) + a.RegisterExtCall(ssdb.SetInstance) a.RegisterExtCall(lh.Populate) a.RegisterExtCall(validation.RegisterValidation) diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go new file mode 100644 index 00000000..62e7ee76 --- /dev/null +++ b/internal/interface/migration/main-entities.go @@ -0,0 +1,121 @@ +package migration + +import ( + adime "simrs-vx/internal/domain/main-entities/adime" + ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" + appointment "simrs-vx/internal/domain/main-entities/appointment" + counter "simrs-vx/internal/domain/main-entities/counter" + device "simrs-vx/internal/domain/main-entities/device" + diagnosesrc "simrs-vx/internal/domain/main-entities/diagnose-src" + district "simrs-vx/internal/domain/main-entities/district" + division "simrs-vx/internal/domain/main-entities/division" + divisionposition "simrs-vx/internal/domain/main-entities/division-position" + doctor "simrs-vx/internal/domain/main-entities/doctor" + doctorfee "simrs-vx/internal/domain/main-entities/doctor-fee" + emergency "simrs-vx/internal/domain/main-entities/emergency" + employee "simrs-vx/internal/domain/main-entities/employee" + encounter "simrs-vx/internal/domain/main-entities/encounter" + ethnic "simrs-vx/internal/domain/main-entities/ethnic" + infra "simrs-vx/internal/domain/main-entities/infra" + inpatient "simrs-vx/internal/domain/main-entities/inpatient" + installation "simrs-vx/internal/domain/main-entities/installation" + insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" + item "simrs-vx/internal/domain/main-entities/item" + itemprice "simrs-vx/internal/domain/main-entities/item-price" + laborant "simrs-vx/internal/domain/main-entities/laborant" + language "simrs-vx/internal/domain/main-entities/language" + material "simrs-vx/internal/domain/main-entities/material" + mcusrc "simrs-vx/internal/domain/main-entities/mcu-src" + mcusrccategory "simrs-vx/internal/domain/main-entities/mcu-src-category" + medicalactionsrc "simrs-vx/internal/domain/main-entities/medical-action-src" + medicalactionsrcitem "simrs-vx/internal/domain/main-entities/medical-action-src-item" + medicine "simrs-vx/internal/domain/main-entities/medicine" + medicinegroup "simrs-vx/internal/domain/main-entities/medicine-group" + medicinemethod "simrs-vx/internal/domain/main-entities/medicine-method" + medicinemix "simrs-vx/internal/domain/main-entities/medicine-mix" + medicinemixitem "simrs-vx/internal/domain/main-entities/medicine-mix-item" + nurse "simrs-vx/internal/domain/main-entities/nurse" + nutritionist "simrs-vx/internal/domain/main-entities/nutritionist" + patient "simrs-vx/internal/domain/main-entities/patient" + person "simrs-vx/internal/domain/main-entities/person" + personaddress "simrs-vx/internal/domain/main-entities/person-address" + personcontact "simrs-vx/internal/domain/main-entities/person-contact" + 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" + practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" + proceduresrc "simrs-vx/internal/domain/main-entities/procedure-src" + province "simrs-vx/internal/domain/main-entities/province" + regency "simrs-vx/internal/domain/main-entities/regency" + room "simrs-vx/internal/domain/main-entities/room" + sbar "simrs-vx/internal/domain/main-entities/sbar" + soapi "simrs-vx/internal/domain/main-entities/soapi" + specialist "simrs-vx/internal/domain/main-entities/specialist" + specialistintern "simrs-vx/internal/domain/main-entities/specialist-intern" + subspecialist "simrs-vx/internal/domain/main-entities/subspecialist" + unit "simrs-vx/internal/domain/main-entities/unit" + uom "simrs-vx/internal/domain/main-entities/uom" + user "simrs-vx/internal/domain/main-entities/user" + village "simrs-vx/internal/domain/main-entities/village" +) + +func getMainEntities() []any { + return []any{ + &user.User{}, + &division.Division{}, + &divisionposition.DivisionPosition{}, + &installation.Installation{}, + &unit.Unit{}, + &village.Village{}, + &district.District{}, + ®ency.Regency{}, + &province.Province{}, + &person.Person{}, + &personaddress.PersonAddress{}, + &personcontact.PersonContact{}, + &pharmacycompany.PharmacyCompany{}, + &diagnosesrc.DiagnoseSrc{}, + &proceduresrc.ProcedureSrc{}, + &employee.Employee{}, + &doctor.Doctor{}, + &nurse.Nurse{}, + &nutritionist.Nutritionist{}, + &pharmacist.Pharmacist{}, + &counter.Counter{}, + &practiceschedule.PracticeSchedule{}, + &uom.Uom{}, + &item.Item{}, + &itemprice.ItemPrice{}, + &infra.Infra{}, + &medicinegroup.MedicineGroup{}, + &medicinemethod.MedicineMethod{}, + &mcusrccategory.McuSrcCategory{}, + &mcusrc.McuSrc{}, + ðnic.Ethnic{}, + &insurancecompany.InsuranceCompany{}, + &medicine.Medicine{}, + &medicinemix.MedicineMix{}, + &medicinemixitem.MedicineMixItem{}, + &medicalactionsrc.MedicalActionSrc{}, + &medicalactionsrcitem.MedicalActionSrcItem{}, + &material.Material{}, + &device.Device{}, + &doctorfee.DoctorFee{}, + &language.Language{}, + &personrelative.PersonRelative{}, + &patient.Patient{}, + &appointment.Appointment{}, + &encounter.Encounter{}, + &laborant.Laborant{}, + &specialist.Specialist{}, + &subspecialist.Subspecialist{}, + &specialistintern.SpecialistIntern{}, + &room.Room{}, + &soapi.Soapi{}, + &sbar.Sbar{}, + &adime.Adime{}, + &emergency.Emergency{}, + &inpatient.Inpatient{}, + &ambulatory.Ambulatory{}, + } +} diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go index 990ca134..6cec68dc 100644 --- a/internal/interface/migration/migration.go +++ b/internal/interface/migration/migration.go @@ -4,88 +4,20 @@ import ( "fmt" "io" "os" - "os/exec" - adime "simrs-vx/internal/domain/main-entities/adime" - ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" - appointment "simrs-vx/internal/domain/main-entities/appointment" - counter "simrs-vx/internal/domain/main-entities/counter" - device "simrs-vx/internal/domain/main-entities/device" - diagnosesrc "simrs-vx/internal/domain/main-entities/diagnose-src" - district "simrs-vx/internal/domain/main-entities/district" - division "simrs-vx/internal/domain/main-entities/division" - divisionposition "simrs-vx/internal/domain/main-entities/division-position" - doctor "simrs-vx/internal/domain/main-entities/doctor" - doctorfee "simrs-vx/internal/domain/main-entities/doctor-fee" - emergency "simrs-vx/internal/domain/main-entities/emergency" - employee "simrs-vx/internal/domain/main-entities/employee" - encounter "simrs-vx/internal/domain/main-entities/encounter" - ethnic "simrs-vx/internal/domain/main-entities/ethnic" - infra "simrs-vx/internal/domain/main-entities/infra" - inpatient "simrs-vx/internal/domain/main-entities/inpatient" - installation "simrs-vx/internal/domain/main-entities/installation" - insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" - item "simrs-vx/internal/domain/main-entities/item" - itemprice "simrs-vx/internal/domain/main-entities/item-price" - laborant "simrs-vx/internal/domain/main-entities/laborant" - language "simrs-vx/internal/domain/main-entities/language" - material "simrs-vx/internal/domain/main-entities/material" - mcusrc "simrs-vx/internal/domain/main-entities/mcu-src" - mcusrccategory "simrs-vx/internal/domain/main-entities/mcu-src-category" - medicalactionsrc "simrs-vx/internal/domain/main-entities/medical-action-src" - medicalactionsrcitem "simrs-vx/internal/domain/main-entities/medical-action-src-item" - medicine "simrs-vx/internal/domain/main-entities/medicine" - medicinegroup "simrs-vx/internal/domain/main-entities/medicine-group" - medicinemethod "simrs-vx/internal/domain/main-entities/medicine-method" - medicinemix "simrs-vx/internal/domain/main-entities/medicine-mix" - medicinemixitem "simrs-vx/internal/domain/main-entities/medicine-mix-item" - nurse "simrs-vx/internal/domain/main-entities/nurse" - nutritionist "simrs-vx/internal/domain/main-entities/nutritionist" - patient "simrs-vx/internal/domain/main-entities/patient" - person "simrs-vx/internal/domain/main-entities/person" - personaddress "simrs-vx/internal/domain/main-entities/person-address" - personcontact "simrs-vx/internal/domain/main-entities/person-contact" - 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" - practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" - proceduresrc "simrs-vx/internal/domain/main-entities/procedure-src" - province "simrs-vx/internal/domain/main-entities/province" - regency "simrs-vx/internal/domain/main-entities/regency" - room "simrs-vx/internal/domain/main-entities/room" - sbar "simrs-vx/internal/domain/main-entities/sbar" - soapi "simrs-vx/internal/domain/main-entities/soapi" - specialist "simrs-vx/internal/domain/main-entities/specialist" - specialistintern "simrs-vx/internal/domain/main-entities/specialist-intern" - subspecialist "simrs-vx/internal/domain/main-entities/subspecialist" - unit "simrs-vx/internal/domain/main-entities/unit" - uom "simrs-vx/internal/domain/main-entities/uom" - user "simrs-vx/internal/domain/main-entities/user" - village "simrs-vx/internal/domain/main-entities/village" "ariga.io/atlas-provider-gorm/gormschema" "gorm.io/gorm" "gorm.io/gorm/schema" ) -type Config struct { - DbCfg DbConf `yaml:"dbCfg"` -} - -type DbConf struct { - DSN string `yaml:"dsn"` - MaxOpenConns int `yaml:"maxOpenConns"` - MaxIdleConns int `yaml:"maxIdleConns"` - MaxIdleTime int `yaml:"maxIdleTime"` -} - -func Loader() { +func loader(input string) { gormCfg := &gorm.Config{ NamingStrategy: schema.NamingStrategy{ SingularTable: true, NoLowerCase: true, }, } - stmts, err := gormschema.New("postgres", gormschema.WithConfig(gormCfg)).Load(GetEntities()...) + stmts, err := gormschema.New("postgres", gormschema.WithConfig(gormCfg)).Load(getEntities(input)...) if err != nil { fmt.Fprintf(os.Stderr, "failed to load gorm schema: %v\n", err) os.Exit(1) @@ -93,91 +25,17 @@ func Loader() { _, _ = io.WriteString(os.Stdout, stmts) } -func GetEntities() []any { - return []any{ - &user.User{}, - &division.Division{}, - &divisionposition.DivisionPosition{}, - &installation.Installation{}, - &unit.Unit{}, - &village.Village{}, - &district.District{}, - ®ency.Regency{}, - &province.Province{}, - &person.Person{}, - &personaddress.PersonAddress{}, - &personcontact.PersonContact{}, - &pharmacycompany.PharmacyCompany{}, - &diagnosesrc.DiagnoseSrc{}, - &proceduresrc.ProcedureSrc{}, - &employee.Employee{}, - &doctor.Doctor{}, - &nurse.Nurse{}, - &nutritionist.Nutritionist{}, - &pharmacist.Pharmacist{}, - &counter.Counter{}, - &practiceschedule.PracticeSchedule{}, - &uom.Uom{}, - &item.Item{}, - &itemprice.ItemPrice{}, - &infra.Infra{}, - &medicinegroup.MedicineGroup{}, - &medicinemethod.MedicineMethod{}, - &mcusrccategory.McuSrcCategory{}, - &mcusrc.McuSrc{}, - ðnic.Ethnic{}, - &insurancecompany.InsuranceCompany{}, - &medicine.Medicine{}, - &medicinemix.MedicineMix{}, - &medicinemixitem.MedicineMixItem{}, - &medicalactionsrc.MedicalActionSrc{}, - &medicalactionsrcitem.MedicalActionSrcItem{}, - &material.Material{}, - &device.Device{}, - &doctorfee.DoctorFee{}, - &language.Language{}, - &personrelative.PersonRelative{}, - &patient.Patient{}, - &appointment.Appointment{}, - &encounter.Encounter{}, - &laborant.Laborant{}, - &specialist.Specialist{}, - &subspecialist.Subspecialist{}, - &specialistintern.SpecialistIntern{}, - &room.Room{}, - &soapi.Soapi{}, - &sbar.Sbar{}, - &adime.Adime{}, - &emergency.Emergency{}, - &inpatient.Inpatient{}, - &ambulatory.Ambulatory{}, +func getEntities(input string) []any { + switch input { + case "main": + return getMainEntities() + case "satusehat": + return getSatuSehatEntities() } + return nil } -func runAtlas(args ...string) error { - cmd := exec.Command("atlas", args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - return cmd.Run() -} - -func logMsg(msg string) { - fmt.Fprintln(os.Stderr, msg) -} - -func Migrate() { - Loader() - logMsg("Running atlas migrate diff...") - if err := runAtlas("migrate", "diff", "--env", "gorm"); err != nil { - logMsg(fmt.Sprintf("Failed to run diff: %v", err)) - return - } - - logMsg("Running atlas migrate apply...") - if err := runAtlas("migrate", "apply", "--env", "gorm"); err != nil { - logMsg(fmt.Sprintf("Failed to run apply: %v", err)) - return - } - - logMsg("Migration complete") +func Migrate(input string) { + loader(input) + } diff --git a/internal/interface/migration/satusehat-entities.go b/internal/interface/migration/satusehat-entities.go new file mode 100644 index 00000000..02d4aa94 --- /dev/null +++ b/internal/interface/migration/satusehat-entities.go @@ -0,0 +1,11 @@ +package migration + +import ( + patient "simrs-vx/internal/domain/satusehat-entities/patient" +) + +func getSatuSehatEntities() []any { + return []any{ + &patient.Patient{}, + } +} diff --git a/internal/interface/migration/tycovar.go b/internal/interface/migration/tycovar.go new file mode 100644 index 00000000..f86f855d --- /dev/null +++ b/internal/interface/migration/tycovar.go @@ -0,0 +1,7 @@ +/* Package migration is used to migrate the database */ +package migration + +const ( + Main = "main" + SatuSehat = "satusehat" +)