Files
simrsx-be/internal/interface/migration/migration.go

120 lines
3.5 KiB
Go

package migration
import (
"fmt"
"io"
"os"
"os/exec"
counter "simrs-vx/internal/domain/main-entities/counter"
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"
employee "simrs-vx/internal/domain/main-entities/employee"
infragroup "simrs-vx/internal/domain/main-entities/infra-group"
installation "simrs-vx/internal/domain/main-entities/installation"
itemgroup "simrs-vx/internal/domain/main-entities/item-group"
nurse "simrs-vx/internal/domain/main-entities/nurse"
nutritionist "simrs-vx/internal/domain/main-entities/nutritionist"
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"
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"
unit "simrs-vx/internal/domain/main-entities/unit"
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{},
&regency.Regency{},
&province.Province{},
&person.Person{},
&personaddress.PersonAddress{},
&personcontact.PersonContact{},
&pharmacycompany.PharmacyCompany{},
&diagnosesrc.DiagnoseSrc{},
&proceduresrc.ProcedureSrc{},
&infragroup.InfraGroup{},
&employee.Employee{},
&itemgroup.ItemGroup{},
&doctor.Doctor{},
&nurse.Nurse{},
&nutritionist.Nutritionist{},
&pharmacist.Pharmacist{},
&counter.Counter{},
&practiceschedule.PracticeSchedule{},
}
}
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")
}