api.go 4.1 KB

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