middleware_undelete.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package got
  2. import (
  3. "text/template"
  4. . "git.eugeniocarvalho.dev/eugeniucarvalho/apicodegen/common"
  5. G "github.com/dave/jennifer/jen"
  6. )
  7. const ()
  8. var (
  9. undeleteStmtsTmpl, hasDepUndeleteStmtsTmpl *template.Template
  10. undeleteStmtsErr error
  11. )
  12. func init() {
  13. undeleteStmtsTmpl, undeleteStmtsErr = ParseTemplate(`
  14. var (
  15. patchs = &models.{{.entity}}Patchs{Set: &models.{{.entity}}Input{}}
  16. entity = patchs.Set
  17. )
  18. values := ctx.Values()
  19. values.Set("patchs", patchs)
  20. values.Set("entity", entity)
  21. user, hasUserRef := values.Get("$user.ref").(*models.UserReference)
  22. if hasUserRef {
  23. entity.UpdatedBy = user
  24. }
  25. entity.LastUpdate = api.NowUnix()
  26. entity.SetDeleted(false)
  27. {{if .preconditions}}
  28. if _, err = executeAction(
  29. ctx,
  30. {{.preconditions}},
  31. ); err != nil {
  32. return
  33. }
  34. {{end}}
  35. options := values.Get("$filter").(*api.Filter)
  36. options.DB = "{{.dbName}}"
  37. options.Collection = "{{.collectionName}}"
  38. options.Patchs, options.Options = patchs.Patch()
  39. if _, err = models.Api.PatchOne(options); err != nil {
  40. return
  41. }
  42. {{if .beforeResponse}}
  43. if resp, err = executeAction(
  44. ctx,
  45. {{.beforeResponse}},
  46. ); err != nil || resp != nil {
  47. return
  48. }
  49. {{end}}
  50. resp = ""
  51. return`)
  52. if undeleteStmtsErr != nil {
  53. panic(undeleteStmtsErr)
  54. }
  55. }
  56. var (
  57. GenUndeleteStmts = &Middleware{
  58. Id: "undelete",
  59. Type: "method",
  60. Fn: func(ctx *MiddlewareContext) error {
  61. var (
  62. project = ctx.Project
  63. method = ctx.Method
  64. dbName = project.GetEntityDB(method.Entity)
  65. collectionName = project.GetCollection(method.Entity)
  66. relations = SR.Get(method.Entity)
  67. relationCount = len(relations)
  68. dependenceMethod = BASE_HAS_DEPENDE + method.Entity
  69. // createDepFunc = SR.Has(method.Entity)
  70. beforeSend = method.Hook("beforeSend")
  71. beforePersist = method.Hook("beforePersist")
  72. context = map[string]interface{}{
  73. "dbName": dbName,
  74. "collectionName": collectionName,
  75. "entity": method.Entity,
  76. "relationCount": relationCount,
  77. "relations": relations,
  78. "dependenceMethod": dependenceMethod,
  79. "beforePersist": beforePersist,
  80. "beforeSend": beforeSend,
  81. "preconditions": parseMethodActions(method.Preconditions),
  82. "beforeResponse": parseMethodActions(method.BeforeResponse),
  83. }
  84. )
  85. // Nome do metodo que verifica se a entidade tem dependencias
  86. out, _ := TemplateToString(undeleteStmtsTmpl, context)
  87. ctx.Statement.Block(G.Id(out)).Line()
  88. return nil
  89. },
  90. }
  91. )
  92. // import (
  93. // "fmt"
  94. // "strings"
  95. // . "git.eugeniocarvalho.dev/eugeniucarvalho/apicodegen/common"
  96. // G "github.com/dave/jennifer/jen"
  97. // // "github.com/davecgh/go-spew/spew"
  98. // )
  99. // var (
  100. // GenUndeleteStmts = &Middleware{
  101. // Id: "undelete",
  102. // Type: "method",
  103. // Fn: func(ctx *MiddlewareContext) error {
  104. // var (
  105. // // UpdateRelationRotine *G.Statement
  106. // method = ctx.Method
  107. // // updRelation = UPDATE_RELATION + method.Entity
  108. // // createUpdateRelation = false
  109. // entity = method.Request
  110. // responseEntity = GenericPart.ReplaceAllString(method.Response, "")
  111. // )
  112. // if entity == "" {
  113. // panic("Modelo de request não definido em UpdateStmt!")
  114. // }
  115. // if responseEntity == "" {
  116. // panic("Modelo de response não definido!")
  117. // }
  118. // ctx.Statement.Block(
  119. // // Declaracao das variaveis
  120. // G.Var().Defs(
  121. // // G.Id("err").Op("*").Qual(API_ERROR, "Error"),
  122. // // G.Id("patchs").Op("=").Op("&").Id(entity).Values(),
  123. // G.Id("patchs").Op("=").Op("&").Id(fmt.Sprintf("%sPatchs", method.Entity)).Values(
  124. // G.Id("Set").Op(": &").Id(entity).Values(),
  125. // ),
  126. // // G.Id("patchs").Op("=").Id(entity).Values(),
  127. // G.Id("entity = patchs.Set"),
  128. // G.Do(func(s *G.Statement) {
  129. // if method.BeforePersistAction {
  130. // s.Id("fn").Func().Call().Op("*").Qual(API_ERROR, "Error")
  131. // }
  132. // }),
  133. // ).Line(),
  134. // // G.Id("fmt.Println(`era o undelete`)").Line(),
  135. // // Fazendo o parse do body
  136. // // G.If(
  137. // // G.Id("err").Op("=").Qual(API_URL, "ReadJson").Call(G.Id("ctx"), G.Id("patchs")),
  138. // // G.Id("err").Op("!=").Id("nil"),
  139. // // ).Block(
  140. // // // G.Id("api").Dot("Falha").Call(
  141. // // // G.Id("ctx"),
  142. // // // G.Id("api").Dot("ErrGeneral"),
  143. // // // G.Id("err").Dot("Error").Call(),
  144. // // // G.Nil(),
  145. // // // ),
  146. // // // G.Return(G.Id("err")),
  147. // // G.Return(),
  148. // // ),
  149. // // G.Do(func(s *G.Statement) {
  150. // // entity := ctx.Project.EntityDesc(method.Entity)
  151. // // if entity != nil && entity.HasMode {
  152. // // s.Add(G.Id(`entity.SetMode("create")`))
  153. // // }
  154. // // }),
  155. // // G.If(
  156. // // G.Id("err").Op("=").Qual(API_URL, "Validate").Call(G.Id("entity")),
  157. // // G.Id("err").Op("!=").Id("nil"),
  158. // // ).Block(
  159. // // // G.Return(G.Id("err")),
  160. // // G.Return(),
  161. // // ).Line(),
  162. // // Captura a base de values
  163. // G.Id("values").Op(":=").Id("ctx").Dot("Values").Call(),
  164. // G.Id("values").Dot("Set").Call(G.Lit("patchs"), G.Id("patchs")),
  165. // G.Id("entity.SetDeleted(false)"),
  166. // // Gera as atribuicoes de variaveis que seram atualizadas (usuario e ultimo update quando existir)
  167. // G.Do(func(part *G.Statement) {
  168. // entity := ctx.Project.GetSchema(method.Entity)
  169. // user := false
  170. // for _, prop := range entity.Properties {
  171. // if def, ok := prop.Autogenerate["update"]; ok {
  172. // switch def.Type {
  173. // case "user":
  174. // if !user {
  175. // part.Add(G.Id(`user := values.Get("$user.ref").(*UserReference)`).Line())
  176. // user = true
  177. // }
  178. // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Id("user").Line())
  179. // case "now":
  180. // part.Add(G.Id("entity").Dot(strings.Title(prop.ID)).Op("=").Qual("time", "Now").Call().Id(".Unix()").Line())
  181. // }
  182. // }
  183. // }
  184. // }).Line(),
  185. // // Carrega o filtro do contexto para adicionar a entidade
  186. // G.Id("filter").Op(":=").Id("values").Dot("Get").Call(
  187. // G.Lit("$filter"),
  188. // ).Assert(G.Op("*").Qual(API_URL, "Filter")).Line(),
  189. // // Adiciona a entidade
  190. // G.Id("filter").Dot("DB").Op("=").Lit(ctx.Project.GetEntityDB(method.Entity)),
  191. // G.Id("filter").Dot("Collection").Op("=").Lit(ctx.Project.GetCollection(method.Entity)),
  192. // G.Do(func(s *G.Statement) {
  193. // if method.BeforePersistAction {
  194. // fnName := fmt.Sprintf("Before%s%s", strings.Title(method.ID), method.Entity)
  195. // part := s.Comment("Chama uma função onde são descritas as ações executadas antes da entidade ser persistida.").Line()
  196. // part.If(
  197. // G.List(G.Id("fn"), G.Id("err")).Op("=").Id(fnName).Call(G.Id("ctx"), G.Id("patchs")),
  198. // G.Id("err").Op("!=").Id("nil"),
  199. // ).Block(G.Return())
  200. // }
  201. // }),
  202. // G.Id("filter").Dot("Patchs").Op("=").Id("patchs.Patch()").Line(),
  203. // // Inseri a entidade na coleção e verifica se a operação ocorreu com exito
  204. // G.If(
  205. // G.List(G.Id("_"), G.Id("err")).Op("=").Id("Models").Dot("PatchOne").Call(
  206. // // G.Lit(ctx.Project.GetCollection(method.Entity)),
  207. // G.Id("filter"),
  208. // ),
  209. // G.Id("err").Op("!=").Id("nil"),
  210. // ).Block(
  211. // // G.Id("api").Dot("Falha").Call(
  212. // // G.Id("ctx"),
  213. // // G.Id("api").Dot("ErrGeneral"),
  214. // // G.Id("err").Dot("Error").Call(),
  215. // // G.Nil(),
  216. // // ),
  217. // // bson.IsObjectIdHex(m.Id.Hex())
  218. // // G.Return(G.Id("err")),
  219. // G.Return(),
  220. // ),
  221. // G.Do(func(s *G.Statement) {
  222. // if method.BeforePersistAction {
  223. // part := s.Comment("Chama uma função onde são descritas as ações executadas após a entidade ser persistida.").Line()
  224. // part.If(
  225. // G.Id("err").Op("=").Id("fn").Call(),
  226. // G.Id("err").Op("!=").Id("nil"),
  227. // ).Block(G.Return())
  228. // }
  229. // }),
  230. // G.Id("resp").Op("=").Lit(""),
  231. // // Cria a rotina de atualização de relacionamentos
  232. // // G.Do(func(s *G.Statement) {
  233. // // if SR.Has(method.Entity) {
  234. // // createUpdateRelation = true
  235. // // s.Comment("Cria uma thread que executa a atualizaca das referências.").Line().Go().Func().Params().Block(
  236. // // G.Id(updRelation).Call(G.Id("filter")),
  237. // // ).Call()
  238. // // }
  239. // // }),
  240. // // Envia a resposta pro usuario em caso de sucesso
  241. // // G.Line().Id("resp").Op("=").Id(responseEntity).Values(G.Dict{
  242. // // G.Id("Entity"): G.Id("entity"),
  243. // // }),
  244. // // G.Line().Id("resp").Op("=").Id("entity"),
  245. // // G.Return(G.Nil()),
  246. // G.Return(),
  247. // ).Line()
  248. // return nil
  249. // },
  250. // }
  251. // )