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  }