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  }