package migration 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() { gormCfg := &gorm.Config{ NamingStrategy: schema.NamingStrategy{ SingularTable: true, NoLowerCase: true, }, } stmts, err := gormschema.New("postgres", gormschema.WithConfig(gormCfg)).Load(GetEntities()...) if err != nil { fmt.Fprintf(os.Stderr, "failed to load gorm schema: %v\n", err) os.Exit(1) } _, _ = 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 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") }