middleware_post.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package got
  2. import (
  3. "strings"
  4. "text/template"
  5. . "git.eugeniocarvalho.dev/eugeniucarvalho/apicodegen/common"
  6. G "github.com/dave/jennifer/jen"
  7. )
  8. var (
  9. createStmtsTmpl *template.Template
  10. createStmtsErr error
  11. )
  12. func init() {
  13. createStmtsTmpl, createStmtsErr = ParseTemplate(`
  14. var (
  15. entity = models.New{{.entity}}()
  16. values = ctx.Values()
  17. )
  18. values.Set("entity", entity)
  19. {{if .entityAlias }} values.Set("{{.entityAlias}}", entity) {{end}}
  20. {{if .beforeRequestParse}}
  21. if _, err = executeAction(
  22. ctx,
  23. {{.beforeRequestParse}},
  24. ); err != nil {
  25. return
  26. }
  27. {{end}}
  28. if err = api.ReadJson(ctx, entity); err != nil {
  29. return
  30. }
  31. user, hasUserRef := values.Get("$user.ref").(*models.UserReference)
  32. if hasUserRef {
  33. entity.CreatedBy = user
  34. entity.UpdatedBy = user
  35. }
  36. entity.SetMode("create")
  37. if err = api.Validate(entity); err != nil {
  38. return
  39. }
  40. {{if .preconditions}}
  41. if _, err = executeAction(
  42. ctx,
  43. {{.preconditions}},
  44. ); err != nil {
  45. return
  46. }
  47. {{end}}
  48. filter := values.Get("$filter").(*api.Filter)
  49. filter.DB = "{{.dbName}}"
  50. filter.Collection = "{{.collectionName}}"
  51. filter.Entity = entity
  52. if _, err = models.Api.InsertOne(filter); err != nil {
  53. return
  54. }
  55. {{if .beforeResponse}}
  56. if resp, err = executeAction(
  57. ctx,
  58. {{.beforeResponse}},
  59. ); err != nil || resp != nil {
  60. return
  61. }
  62. {{end}}
  63. resp = entity
  64. return`)
  65. if createStmtsErr != nil {
  66. panic(createStmtsErr)
  67. }
  68. }
  69. var (
  70. GenCreateStmts = &Middleware{
  71. Id: "post",
  72. Type: "method",
  73. Fn: func(ctx *MiddlewareContext) error {
  74. var (
  75. project = ctx.Project
  76. method = ctx.Method
  77. dbName = project.GetEntityDB(method.Entity)
  78. collectionName = project.GetCollection(method.Entity)
  79. dependenceMethod = BASE_HAS_DEPENDE + method.Entity
  80. beforeSend = method.Hook("beforeSend")
  81. beforePersist = method.Hook("beforePersist")
  82. context = map[string]interface{}{
  83. "dbName": dbName,
  84. "collectionName": collectionName,
  85. "entity": method.Entity,
  86. "dependenceMethod": dependenceMethod,
  87. "beforePersist": beforePersist,
  88. "beforeSend": beforeSend,
  89. "methodName": strings.Title(method.ID),
  90. "preconditions": parseMethodActions(method.Preconditions),
  91. "beforeResponse": parseMethodActions(method.BeforeResponse),
  92. "beforeParseRequest": parseMethodActions(method.BeforeParseRequest),
  93. "entityAlias": getCustom(method.Custom, "go.entity.alias"),
  94. }
  95. )
  96. // Nome do metodo que verifica se a entidade tem dependencias
  97. out, _ := TemplateToString(createStmtsTmpl, context)
  98. ctx.Statement.Block(G.Id(out)).Line()
  99. return nil
  100. },
  101. }
  102. )
  103. // var (
  104. // project = ctx.Project
  105. // method = ctx.Method
  106. // responseEntity = GenericPart.ReplaceAllString(method.Response, "")
  107. // )
  108. // if responseEntity == "" {
  109. // panic("Modelo de resposta não definido")
  110. // }
  111. // ctx.Statement.Block(
  112. // // Declaracao das variaveis
  113. // G.Var().Defs(
  114. // // G.Id("err").Op("*").Qual(API_ERROR, "Error"),
  115. // G.Id("entity").Op("=").Id("New"+method.Entity).Call(),
  116. // ).Line(),
  117. // // Fazendo o parse do body
  118. // G.If(
  119. // G.Id("err").Op("=").Qual(API_URL, "ReadJson").Call(G.Id("ctx"), G.Id("entity")),
  120. // G.Id("err").Op("!=").Id("nil"),
  121. // ).Block(
  122. // // G.Id("api").Dot("Falha").Call(
  123. // // G.Id("ctx"),
  124. // // G.Id("api").Dot("ErrGeneral"),
  125. // // G.Id("err").Dot("Error").Call(),
  126. // // G.Nil(),
  127. // // ),
  128. // // G.Return(G.Id("err")),
  129. // G.Return(),
  130. // ).Line(),
  131. // G.Id("values").Op(":=").Id("ctx").Dot("Values()").Line(),
  132. // G.Do(func(part *G.Statement) {
  133. // entity := ctx.Project.GetSchema(method.Entity)
  134. // user := false
  135. // for _, prop := range entity.Properties {
  136. // if def, ok := prop.Autogenerate["create_action"]; ok {
  137. // switch def.Type {
  138. // case "user":
  139. // if !user {
  140. // part.Add(G.Id(`user := values.Get("$user.ref").(*UserReference)`).Line())
  141. // user = true
  142. // }
  143. // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Id("user").Line())
  144. // case "now":
  145. // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Qual("time", "Now").Call().Id(".Unix()").Line())
  146. // case "fn":
  147. // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Id(def.Args[0]).Call().Line())
  148. // default:
  149. // // fmt.Println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")
  150. // // spew.Dump(def)
  151. // // parts := strings.Split(def, "#")
  152. // // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Qual("time", "Now").Call().Id(".Unix()").Line())
  153. // }
  154. // }
  155. // }
  156. // }).Line(),
  157. // G.Do(func(s *G.Statement) {
  158. // entity := ctx.Project.EntityDesc(method.Entity)
  159. // if entity != nil && entity.HasMode {
  160. // s.Add(G.Id(`entity.SetMode("create")`))
  161. // }
  162. // }),
  163. // G.If(
  164. // G.Id("err").Op("=").Qual(API_URL, "Validate").Call(G.Id("entity")),
  165. // G.Id("err").Op("!=").Id("nil"),
  166. // ).Block(
  167. // // G.Return(G.Id("err")),
  168. // G.Return(),
  169. // ).Line(),
  170. // // Carrega o filtro do contexto para adicionar a entidade
  171. // G.Id("filter").Op(":=").Id("values").Dot("Get").Call(
  172. // G.Lit("$filter"),
  173. // ).Assert(G.Op("*").Qual(API_URL, "Filter")).Line(),
  174. // // Adiciona a entidade
  175. // G.Id("filter").Dot("DB").Op("=").Lit(ctx.Project.GetEntityDB(method.Entity)),
  176. // G.Id("filter").Dot("Collection").Op("=").Lit(ctx.Project.GetCollection(method.Entity)),
  177. // G.Id("filter").Dot("Entity").Op("=").Id("entity"),
  178. // generateHookCall(project, method, "beforePersist"),
  179. // // Inseri a entidade na coleção e verifica se a operação ocorreu com exito
  180. // G.If(
  181. // G.List(G.Id("_"), G.Id("err")).Op("=").Id("Models").Dot("InsertOne").Call(
  182. // G.Id("filter"),
  183. // ),
  184. // G.Id("err").Op("!=").Id("nil"),
  185. // ).Block(
  186. // // G.Id("api").Dot("Falha").Call(
  187. // // G.Id("ctx"),
  188. // // G.Id("api").Dot("ErrGeneral"),
  189. // // G.Id("err").Dot("Error").Call(),
  190. // // G.Nil(),
  191. // // ),
  192. // // bson.IsObjectIdHex(m.Id.Hex())
  193. // // G.Return(G.Id("err")),
  194. // G.Return(),
  195. // ),
  196. // // Envia a resposta pro usuario em caso de sucesso
  197. // // G.Line().Id("ctx").Dot("JSON").Call(G.Qual(APIC, "Map").Values(G.Dict{
  198. // // G.Lit("entity"): G.Id("entity"),
  199. // // })),
  200. // // G.Line().Id("resp").Dot("Entity").Op("=").Id("entity"),
  201. // // G.Line().Id("resp").Op("=").Id(responseEntity).Values(G.Dict{
  202. // // G.Id("Entity"): G.Id("entity"),
  203. // // }),
  204. // G.Line().Id("resp").Op("=").Id("entity"),
  205. // generateHookCall(project, method, "beforeSend"),
  206. // // G.Return(G.Nil()),
  207. // G.Return(),
  208. // )