github.com/wawandco/oxplugins@v0.7.11/tools/pop/migration/creator/fizz_creator.go (about) 1 package creator 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 "path/filepath" 8 "strings" 9 "time" 10 11 "github.com/gobuffalo/fizz" 12 "github.com/gobuffalo/flect" 13 "github.com/pkg/errors" 14 ) 15 16 // FizzCreator model struct for fizz generation files 17 type FizzCreator struct{} 18 19 // Name is the name of the migration type 20 func (f FizzCreator) Name() string { 21 return "fizz" 22 } 23 24 // Create will create 2 .fizz files for the migration 25 func (f *FizzCreator) Create(dir string, args []string) error { 26 name := flect.Underscore(flect.Pluralize(strings.ToLower(args[0]))) 27 table := fizz.NewTable(name, map[string]interface{}{ 28 "timestamps": false, 29 }) 30 31 for _, arg := range args[1:] { 32 slice := strings.Split(arg, ":") 33 if len(slice) == 1 { 34 slice = append(slice, "string") 35 } 36 37 o := fizz.Options{} 38 name := flect.Underscore(slice[0]) 39 colType := f.colType(slice[1]) 40 41 if name == "id" { 42 o["primary"] = true 43 } 44 45 if strings.HasPrefix(strings.ToLower(slice[1]), "nulls.") { 46 o["null"] = true 47 } 48 49 if err := table.Column(name, colType, o); err != nil { 50 return err 51 } 52 } 53 54 timestamp := time.Now().UTC().Format("20060102150405") 55 fileName := fmt.Sprintf("%s_%s", timestamp, name) 56 57 if err := f.createUPFile(dir, fileName, table); err != nil { 58 return err 59 } 60 61 if err := f.createDownFile(dir, fileName, table); err != nil { 62 return err 63 } 64 65 return nil 66 } 67 68 func (f *FizzCreator) createDownFile(dir, name string, table fizz.Table) error { 69 filename := fmt.Sprintf("%s.down.fizz", name) 70 path := filepath.Join(dir, filename) 71 72 file, err := os.Create(path) 73 if err != nil { 74 return errors.Wrap(err, "error creating file") 75 } 76 77 defer file.Close() 78 79 writer := bufio.NewWriter(file) 80 _, err = writer.WriteString(table.UnFizz()) 81 if err != nil { 82 return errors.Wrap(err, "error writing file") 83 } 84 85 writer.Flush() 86 87 return nil 88 } 89 90 func (f *FizzCreator) createUPFile(dir, name string, table fizz.Table) error { 91 filename := fmt.Sprintf("%s.up.fizz", name) 92 path := filepath.Join(dir, filename) 93 94 file, err := os.Create(path) 95 if err != nil { 96 return errors.Wrap(err, "error creating file") 97 } 98 99 defer file.Close() 100 101 writer := bufio.NewWriter(file) 102 _, err = writer.WriteString(table.Fizz()) 103 if err != nil { 104 return errors.Wrap(err, "error writing file") 105 } 106 107 writer.Flush() 108 109 return nil 110 } 111 112 func (f *FizzCreator) colType(s string) string { 113 switch strings.ToLower(s) { 114 case "int": 115 return "integer" 116 case "time.time", "time", "datetime": 117 return "timestamp" 118 case "uuid.uuid", "uuid": 119 return "uuid" 120 case "nulls.float32", "nulls.float64": 121 return "float" 122 case "slices.string", "slices.uuid", "[]string": 123 return "varchar[]" 124 case "slices.float", "[]float", "[]float32", "[]float64": 125 return "numeric[]" 126 case "slices.int": 127 return "int[]" 128 case "slices.map": 129 return "jsonb" 130 case "float32", "float64", "float": 131 return "decimal" 132 case "blob", "[]byte": 133 return "blob" 134 default: 135 if strings.HasPrefix(s, "nulls.") { 136 return f.colType(strings.Replace(s, "nulls.", "", -1)) 137 } 138 return strings.ToLower(s) 139 } 140 }