package got import ( "text/template" . "git.eugeniocarvalho.dev/eugeniucarvalho/apicodegen/common" G "github.com/dave/jennifer/jen" ) var ( pipeStmtsTmpl *template.Template pipeStmtsErr error ) func init() { pipeStmtsTmpl, pipeStmtsErr = ParseTemplate(` {{if .preconditions}} if resp, err = executeAction( ctx, {{.preconditions}}, ); err != nil { return } {{end}} return`) if pipeStmtsErr != nil { panic(pipeStmtsErr) } } var ( GenPipeStmts = &Middleware{ Id: "post", Type: "method", Fn: func(ctx *MiddlewareContext) error { var ( method = ctx.Method context = map[string]interface{}{ "preconditions": parseMethodActions(method.Preconditions), } ) // Nome do metodo que verifica se a entidade tem dependencias out, _ := TemplateToString(pipeStmtsTmpl, context) ctx.Statement.Block(G.Id(out)).Line() return nil }, } ) // var ( // project = ctx.Project // method = ctx.Method // responseEntity = GenericPart.ReplaceAllString(method.Response, "") // ) // if responseEntity == "" { // panic("Modelo de resposta não definido") // } // ctx.Statement.Block( // // Declaracao das variaveis // G.Var().Defs( // // G.Id("err").Op("*").Qual(API_ERROR, "Error"), // G.Id("entity").Op("=").Id("New"+method.Entity).Call(), // ).Line(), // // Fazendo o parse do body // G.If( // G.Id("err").Op("=").Qual(API_URL, "ReadJson").Call(G.Id("ctx"), G.Id("entity")), // G.Id("err").Op("!=").Id("nil"), // ).Block( // // G.Id("api").Dot("Falha").Call( // // G.Id("ctx"), // // G.Id("api").Dot("ErrGeneral"), // // G.Id("err").Dot("Error").Call(), // // G.Nil(), // // ), // // G.Return(G.Id("err")), // G.Return(), // ).Line(), // G.Id("values").Op(":=").Id("ctx").Dot("Values()").Line(), // G.Do(func(part *G.Statement) { // entity := ctx.Project.GetSchema(method.Entity) // user := false // for _, prop := range entity.Properties { // if def, ok := prop.Autogenerate["create_action"]; ok { // switch def.Type { // case "user": // if !user { // part.Add(G.Id(`user := values.Get("$user.ref").(*UserReference)`).Line()) // user = true // } // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Id("user").Line()) // case "now": // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Qual("time", "Now").Call().Id(".Unix()").Line()) // case "fn": // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Id(def.Args[0]).Call().Line()) // default: // // fmt.Println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") // // spew.Dump(def) // // parts := strings.Split(def, "#") // // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Qual("time", "Now").Call().Id(".Unix()").Line()) // } // } // } // }).Line(), // G.Do(func(s *G.Statement) { // entity := ctx.Project.EntityDesc(method.Entity) // if entity != nil && entity.HasMode { // s.Add(G.Id(`entity.SetMode("create")`)) // } // }), // G.If( // G.Id("err").Op("=").Qual(API_URL, "Validate").Call(G.Id("entity")), // G.Id("err").Op("!=").Id("nil"), // ).Block( // // G.Return(G.Id("err")), // G.Return(), // ).Line(), // // Carrega o filtro do contexto para adicionar a entidade // G.Id("filter").Op(":=").Id("values").Dot("Get").Call( // G.Lit("$filter"), // ).Assert(G.Op("*").Qual(API_URL, "Filter")).Line(), // // Adiciona a entidade // G.Id("filter").Dot("DB").Op("=").Lit(ctx.Project.GetEntityDB(method.Entity)), // G.Id("filter").Dot("Collection").Op("=").Lit(ctx.Project.GetCollection(method.Entity)), // G.Id("filter").Dot("Entity").Op("=").Id("entity"), // generateHookCall(project, method, "beforePersist"), // // Inseri a entidade na coleção e verifica se a operação ocorreu com exito // G.If( // G.List(G.Id("_"), G.Id("err")).Op("=").Id("Models").Dot("InsertOne").Call( // G.Id("filter"), // ), // G.Id("err").Op("!=").Id("nil"), // ).Block( // // G.Id("api").Dot("Falha").Call( // // G.Id("ctx"), // // G.Id("api").Dot("ErrGeneral"), // // G.Id("err").Dot("Error").Call(), // // G.Nil(), // // ), // // bson.IsObjectIdHex(m.Id.Hex()) // // G.Return(G.Id("err")), // G.Return(), // ), // // Envia a resposta pro usuario em caso de sucesso // // G.Line().Id("ctx").Dot("JSON").Call(G.Qual(APIC, "Map").Values(G.Dict{ // // G.Lit("entity"): G.Id("entity"), // // })), // // G.Line().Id("resp").Dot("Entity").Op("=").Id("entity"), // // G.Line().Id("resp").Op("=").Id(responseEntity).Values(G.Dict{ // // G.Id("Entity"): G.Id("entity"), // // }), // G.Line().Id("resp").Op("=").Id("entity"), // generateHookCall(project, method, "beforeSend"), // // G.Return(G.Nil()), // G.Return(), // )