api.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package rest
  2. import (
  3. "fmt"
  4. "git.nspix.com/golang/micro/gateway/http"
  5. "git.nspix.com/golang/rest/v3/cache"
  6. "gorm.io/gorm"
  7. )
  8. type Api struct {
  9. crud *CRUD
  10. }
  11. func (api *Api) handleListSchema(httpCtx *http.Context) (err error) {
  12. var (
  13. schemas []*Schema
  14. )
  15. ns := httpCtx.FormValue(NamespaceVariable)
  16. if ns == "" {
  17. ns = DefaultNamespace
  18. }
  19. if schemas, err = api.crud.GetSchemas(httpCtx.Request().Context(), ns, httpCtx.ParamValue("module"), httpCtx.ParamValue("table")); err == nil {
  20. return httpCtx.Success(schemas)
  21. } else {
  22. return httpCtx.Error(HttpDatabaseQueryFailed, err.Error())
  23. }
  24. }
  25. func (api *Api) handleSaveSchema(httpCtx *http.Context) (err error) {
  26. var (
  27. rest *Restful
  28. )
  29. ns := httpCtx.FormValue(NamespaceVariable)
  30. if ns == "" {
  31. ns = DefaultNamespace
  32. }
  33. moduleName := httpCtx.ParamValue("module")
  34. tableName := httpCtx.ParamValue("table")
  35. for _, row := range api.crud.modules {
  36. if row.model.ModuleName() == moduleName && row.model.TableName() == tableName {
  37. rest = row
  38. break
  39. }
  40. }
  41. if rest == nil {
  42. return httpCtx.Error(HTTPUnknownFailed, fmt.Sprintf("module %s table %s schema not found", moduleName, tableName))
  43. }
  44. schemas := make([]*Schema, 0)
  45. if err = httpCtx.Bind(&schemas); err != nil {
  46. return httpCtx.Error(HttpInvalidPayload, err.Error())
  47. }
  48. if err = api.crud.db.Transaction(func(tx *gorm.DB) error {
  49. var (
  50. errTx error
  51. )
  52. for _, scm := range schemas {
  53. if errTx = tx.Save(scm).Error; errTx != nil {
  54. return errTx
  55. }
  56. }
  57. return nil
  58. }); err == nil {
  59. if api.crud.enableCache {
  60. cache.Delete(fmt.Sprintf("schema:%s:%s:%s", ns, moduleName, tableName))
  61. }
  62. return httpCtx.Success(map[string]interface{}{
  63. "count": len(schemas),
  64. "state": "success",
  65. })
  66. } else {
  67. return httpCtx.Error(HTTPUnknownFailed, err.Error())
  68. }
  69. }
  70. func (api *Api) handleListSchemas(httpCtx *http.Context) (err error) {
  71. var (
  72. moduleLabel string
  73. )
  74. ts := make([]*treeValue, 0)
  75. isHandled := false
  76. for _, e := range api.crud.modules {
  77. isHandled = false
  78. for _, tv := range ts {
  79. if tv.Value == e.model.ModuleName() {
  80. tv.Append(&treeValue{Value: e.model.TableName(), Label: e.model.TableName(), Type: TypeTable})
  81. isHandled = true
  82. break
  83. }
  84. }
  85. if isHandled {
  86. continue
  87. }
  88. moduleLabel = e.model.ModuleName()
  89. tv := &treeValue{Label: moduleLabel, Value: e.model.ModuleName(), Type: TypeModule}
  90. tv.Append(&treeValue{Value: e.model.TableName(), Label: e.model.TableName(), Type: TypeTable})
  91. ts = append(ts, tv)
  92. }
  93. return httpCtx.Success(ts)
  94. }
  95. func (api *Api) handleDeleteSchema(httpCtx *http.Context) (err error) {
  96. id := httpCtx.ParamValue("id")
  97. model := &Schema{}
  98. if err = api.crud.db.Where("id=?", id).First(model).Error; err == nil {
  99. if err = api.crud.db.Where("id=?", id).Delete(&Schema{}).Error; err == nil {
  100. if api.crud.enableCache {
  101. cache.Delete(fmt.Sprintf("schema:%s:%s:%s", model.Namespace, model.ModuleName, model.TableName))
  102. }
  103. return httpCtx.Success(map[string]string{
  104. "id": id,
  105. "state": "success",
  106. })
  107. } else {
  108. return httpCtx.Error(HttpDatabaseDeleteFailed, err.Error())
  109. }
  110. } else {
  111. return httpCtx.Error(HttpDatabaseFindFailed, err.Error())
  112. }
  113. }
  114. func (api *Api) Router(svr *http.Server, ms ...http.Middleware) {
  115. svr.Handle("GET", "/rest/schemas", api.handleListSchemas, ms...)
  116. svr.Handle("GET", "/rest/schema/:module/:table", api.handleListSchema, ms...)
  117. svr.Handle("PUT", "/rest/schema/:module/:table", api.handleSaveSchema, ms...)
  118. svr.Handle("DELETE", "/rest/schema/:id", api.handleDeleteSchema, ms...)
  119. for _, rest := range api.crud.modules {
  120. if rest.hasScenario(ScenarioList) {
  121. svr.Handle("GET", rest.getScenarioUrl(ScenarioList), rest.getScenarioHandle(ScenarioList), ms...)
  122. }
  123. if rest.hasScenario(ScenarioCreate) {
  124. svr.Handle("POST", rest.getScenarioUrl(ScenarioCreate), rest.getScenarioHandle(ScenarioCreate), ms...)
  125. }
  126. if rest.hasScenario(ScenarioUpdate) {
  127. svr.Handle("PUT", rest.getScenarioUrl(ScenarioUpdate), rest.getScenarioHandle(ScenarioUpdate), ms...)
  128. }
  129. if rest.hasScenario(ScenarioDelete) {
  130. svr.Handle("DELETE", rest.getScenarioUrl(ScenarioDelete), rest.getScenarioHandle(ScenarioDelete), ms...)
  131. }
  132. if rest.hasScenario(ScenarioExport) {
  133. svr.Handle("GET", rest.getScenarioUrl(ScenarioExport), rest.getScenarioHandle(ScenarioExport), ms...)
  134. }
  135. if rest.hasScenario(ScenarioView) {
  136. svr.Handle("GET", rest.getScenarioUrl(ScenarioView), rest.getScenarioHandle(ScenarioView), ms...)
  137. }
  138. }
  139. }