github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/macros/crud/crud.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "go/ast" 6 "go/parser" 7 "go/token" 8 "log" 9 "os" 10 "os/exec" 11 "text/template" 12 ) 13 14 var ( 15 tmpCreate = template.Must(template.New("").Parse(` 16 // Create{{ .Name }} ajoute et renvoie 17 func (ct Controller) Create{{ .Name }}(c echo.Context) error { 18 if err := authentifie(c); err != nil { 19 return err 20 } 21 in := new(rawdata.{{ .Name }}) 22 if err := c.Bind(in); err != nil { 23 return fmt.Errorf("{{ .Name }} invalide : %s", err) 24 } 25 created, err := in.Insert(ct.DB) 26 if err != nil { 27 return err 28 } 29 return c.JSON(200, created) 30 }`)) 31 32 tmpUpdate = template.Must(template.New("").Parse(` 33 // Update{{ .Name }} met à jour et renvoie 34 func (ct Controller) Update{{ .Name }}(c echo.Context) error { 35 if err := authentifie(c); err != nil { 36 return err 37 } 38 in := new(rawdata.{{ .Name }}) 39 if err := c.Bind(in); err != nil { 40 return fmt.Errorf("{{ .Name }} invalide : %s", err) 41 } 42 updated, err := in.Update(ct.DB) 43 if err != nil { 44 return err 45 } 46 return c.JSON(200, updated) 47 }`)) 48 49 tmpDelete = template.Must(template.New("").Parse(` 50 // Delete{{ .Name }} supprime 51 func (ct Controller) Delete{{ .Name }}(c echo.Context) error { 52 if err := authentifie(c); err != nil { 53 return err 54 } 55 id, err := shared.ParseId(c, "id") 56 if err != nil { 57 return fmt.Errorf("Id ({{ .Name }}) invalide : %s", err) 58 } 59 out, err := {{ if .IsSimpleDelete }}rawdata.Delete{{ .Name }}ById(ct.DB, id){{ else }}ct.delete{{ .Name }}(id){{ end }} 60 if err != nil { 61 return err 62 } 63 return c.JSON(200, out) 64 } 65 `)) 66 ) 67 68 // utilise la méthode Delete de l'item au lien d'une fonction extérieure 69 var itemsSimpleDelete = map[string]bool{ 70 "Don": true, 71 "Personne": true, 72 "Paiement": true, 73 "Participantsimple": true, 74 } 75 76 type templateArgs struct { 77 Name string 78 IsSimpleDelete bool 79 } 80 81 func main() { 82 names := parse("core/rawdata/models.go") 83 84 target := "acvegestion/crud.go" 85 f, err := os.Create(target) 86 if err != nil { 87 log.Fatal(err) 88 } 89 defer f.Close() 90 91 _, _ = fmt.Fprintln(f, "package acvegestion") 92 _, _ = fmt.Fprintln(f, "// --- DO NOT EDIT - autogenerated from rawdata") 93 94 for _, name := range names { 95 if name == "User" || name == "Groupe" || name == "Contrainte" || name == "Sondage" || name == "Camp" || name == "Inscription" { 96 continue 97 } 98 args := templateArgs{Name: name, IsSimpleDelete: itemsSimpleDelete[name]} 99 switch name { 100 case "Facture", "Document", "Equipier", "Participant", "Don": // ignore 101 default: 102 if err := tmpCreate.Execute(f, args); err != nil { 103 log.Fatal(err) 104 } 105 } 106 107 if name != "Participant" && name != "Don" { 108 if err := tmpUpdate.Execute(f, args); err != nil { 109 log.Fatal(err) 110 } 111 } 112 if name != "Message" { 113 if err := tmpDelete.Execute(f, args); err != nil { 114 log.Fatal(err) 115 } 116 } 117 } 118 119 _ = exec.Command("goimports", "-w", target).Run() 120 } 121 122 // renvoie les types principaux 123 func parse(filename string) []string { 124 t := token.NewFileSet() 125 f, err := parser.ParseFile(t, filename, nil, parser.ParseComments) 126 if err != nil { 127 log.Fatal(err) 128 } 129 130 var names []string 131 for _, decl := range f.Decls { 132 gen, ok := decl.(*ast.GenDecl) 133 if !ok || gen.Tok != token.TYPE || len(gen.Specs) != 1 { 134 continue 135 } 136 typeDecl, ok := gen.Specs[0].(*ast.TypeSpec) 137 if !ok { 138 continue 139 } 140 name := typeDecl.Name.String() 141 structType, ok := typeDecl.Type.(*ast.StructType) 142 if !ok { 143 continue 144 } 145 for _, field := range structType.Fields.List { 146 if len(field.Names) == 1 && field.Names[0].String() == "Id" { 147 names = append(names, name) 148 break 149 } 150 } 151 } 152 return names 153 }