120 lines
3.5 KiB
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{},
|
|
®ency.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")
|
|
}
|