handler.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package handler
  2. import (
  3. "net/http"
  4. "dbview/service/internal/common/databases/meta"
  5. "dbview/service/internal/common/response"
  6. api "dbview/service/internal/modules/database_meta/api"
  7. svc "dbview/service/internal/modules/database_meta/service"
  8. "github.com/gin-gonic/gin"
  9. )
  10. type Handler struct {
  11. svc *svc.MetadataService
  12. }
  13. func NewHandler(s *svc.MetadataService) *Handler {
  14. return &Handler{svc: s}
  15. }
  16. // GetRootObjectsHandler POST /metadata/root
  17. // body: api.GetRootRequest
  18. func (h *Handler) GetRootObjectsHandler(c *gin.Context) {
  19. var req api.GetRootRequest
  20. if err := c.ShouldBindJSON(&req); err != nil {
  21. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  22. return
  23. }
  24. page := req.Page
  25. if page <= 0 {
  26. page = 1
  27. }
  28. pageSize := req.PageSize
  29. if pageSize <= 0 {
  30. pageSize = 50
  31. }
  32. // 使用 req.ConnID 作为连接池查找 key,ConnInfo 仅用于信息打印
  33. objs, total, err := h.svc.GetRootObjects(c.Request.Context(), req.ConnID, req.ConnInfo, page, pageSize, req.Fetch)
  34. if err != nil {
  35. c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "查询根对象失败", Error: err.Error()})
  36. return
  37. }
  38. c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: map[string]interface{}{"total": total, "data": objs}})
  39. }
  40. // GetChildObjectsHandler POST /metadata/children
  41. // body: api.GetChildrenRequest
  42. func (h *Handler) GetChildObjectsHandler(c *gin.Context) {
  43. var req api.GetChildrenRequest
  44. if err := c.ShouldBindJSON(&req); err != nil {
  45. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  46. return
  47. }
  48. page := req.Page
  49. if page <= 0 {
  50. page = 1
  51. }
  52. pageSize := req.PageSize
  53. if pageSize <= 0 {
  54. pageSize = 50
  55. }
  56. typ := req.Type
  57. if typ == "" {
  58. typ = "table"
  59. }
  60. // 将请求中的 Path 转为 meta.ObjectPath
  61. path := meta.ObjectPath{}
  62. for _, e := range req.Path {
  63. path = append(path, meta.ObjectPathEntry{Type: e.Type, Name: e.Name})
  64. }
  65. // 使用 ConnID 作为连接标识
  66. objs, total, err := h.svc.GetChildObjects(c.Request.Context(), req.ConnID, path, typ, page, pageSize, req.Fetch)
  67. if err != nil {
  68. c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "查询子对象失败", Error: err.Error()})
  69. return
  70. }
  71. c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: map[string]interface{}{"total": total, "data": objs}})
  72. }
  73. // GetObjectDetailHandler POST /metadata/object
  74. // body: api.GetObjectRequest
  75. func (h *Handler) GetObjectDetailHandler(c *gin.Context) {
  76. var body api.GetObjectRequest
  77. if err := c.ShouldBindJSON(&body); err != nil {
  78. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  79. return
  80. }
  81. // 将请求中的 Path 转为 meta.ObjectPath 并调用服务
  82. path := meta.ObjectPath{}
  83. for _, e := range body.Path {
  84. path = append(path, meta.ObjectPathEntry{Type: e.Type, Name: e.Name})
  85. }
  86. // 使用 ConnID 作为连接查找标识,ConnInfo 可用于打印/展示
  87. obj, err := h.svc.GetObjectDetails(c.Request.Context(), body.ConnID, path, body.Fetch)
  88. if err != nil {
  89. c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "查询对象详情失败", Error: err.Error()})
  90. return
  91. }
  92. c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: obj})
  93. }
  94. // DescribeCreateTemplateHandler POST /metadata/create/template
  95. // body: api.CreateTemplateRequest
  96. func (h *Handler) DescribeCreateTemplateHandler(c *gin.Context) {
  97. var req api.CreateTemplateRequest
  98. if err := c.ShouldBindJSON(&req); err != nil {
  99. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  100. return
  101. }
  102. tpl, err := h.svc.DescribeCreateTemplate(c.Request.Context(), req.ConnID, req.ObjectType, req.ParentName)
  103. if err != nil {
  104. c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "获取创建模板失败", Error: err.Error()})
  105. return
  106. }
  107. c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: tpl})
  108. }
  109. // CreateObjectHandler POST /metadata/object/create
  110. // body: api.CreateObjectRequest
  111. func (h *Handler) CreateObjectHandler(c *gin.Context) {
  112. var req api.CreateObjectRequest
  113. if err := c.ShouldBindJSON(&req); err != nil {
  114. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  115. return
  116. }
  117. // map to meta.CreateObjectRequest
  118. coreReq := meta.CreateObjectRequest{
  119. ObjectType: req.ObjectType,
  120. ParentName: req.ParentName,
  121. Properties: req.Properties,
  122. Execute: req.Execute,
  123. Options: req.Options,
  124. }
  125. resp, err := h.svc.CreateObject(c.Request.Context(), req.ConnID, coreReq)
  126. if err != nil {
  127. // Drivers/services now return plain errors for validation or other issues.
  128. // Map any returned error to a 400 ParamError response so client can inspect the message.
  129. c.JSON(http.StatusBadRequest, response.ParamErrorWithDetail("创建对象失败", err))
  130. return
  131. }
  132. c.JSON(http.StatusOK, response.Success(resp))
  133. }
  134. // DeleteObjectsHandler POST /metadata/object/delete
  135. // body: meta.ObjectOperationRequest
  136. func (h *Handler) DeleteObjectsHandler(c *gin.Context) {
  137. var req meta.ObjectOperationRequest
  138. if err := c.ShouldBindJSON(&req); err != nil {
  139. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  140. return
  141. }
  142. resp, err := h.svc.DeleteObjects(c.Request.Context(), req)
  143. if err != nil {
  144. c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "删除对象匹配失败", Error: err.Error()})
  145. return
  146. }
  147. c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: resp})
  148. }
  149. // DescribeUpdateTemplateHandler POST /database/metadata/update/template
  150. // body: api.UpdateTemplateRequest
  151. func (h *Handler) DescribeUpdateTemplateHandler(c *gin.Context) {
  152. var req api.UpdateTemplateRequest
  153. if err := c.ShouldBindJSON(&req); err != nil {
  154. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  155. return
  156. }
  157. tpl, err := h.svc.DescribeUpdateTemplate(c.Request.Context(), req.ConnID, req.Path)
  158. if err != nil {
  159. c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "获取修改模板失败", Error: err.Error()})
  160. return
  161. }
  162. c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: tpl})
  163. }
  164. // UpdateObjectHandler POST /database/metadata/object/update
  165. // body: api.UpdateObjectRequest
  166. func (h *Handler) UpdateObjectHandler(c *gin.Context) {
  167. var req api.UpdateObjectRequest
  168. if err := c.ShouldBindJSON(&req); err != nil {
  169. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  170. return
  171. }
  172. resp, err := h.svc.UpdateObject(c.Request.Context(), req.ConnID, req.UpdateRequest)
  173. if err != nil {
  174. c.JSON(http.StatusBadRequest, response.ParamErrorWithDetail("修改对象失败", err))
  175. return
  176. }
  177. c.JSON(http.StatusOK, response.Success(resp))
  178. }
  179. // DescribeDeleteTemplateHandler POST /database/metadata/delete/template
  180. // body: api.DeleteTemplateRequest
  181. func (h *Handler) DescribeDeleteTemplateHandler(c *gin.Context) {
  182. var req api.DeleteTemplateRequest
  183. if err := c.ShouldBindJSON(&req); err != nil {
  184. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  185. return
  186. }
  187. tpl, err := h.svc.DescribeDeleteTemplate(c.Request.Context(), req.ConnID, req.Path)
  188. if err != nil {
  189. c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "获取删除模板失败", Error: err.Error()})
  190. return
  191. }
  192. c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: tpl})
  193. }
  194. // GetMetadataInfoHandler POST /database/metadata/info
  195. // body: api.GetMetadataInfoRequest
  196. func (h *Handler) GetMetadataInfoHandler(c *gin.Context) {
  197. var req api.GetMetadataInfoRequest
  198. if err := c.ShouldBindJSON(&req); err != nil {
  199. c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
  200. return
  201. }
  202. caps, err := h.svc.GetMetadataInfo(c.Request.Context(), req.ConnID)
  203. if err != nil {
  204. c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "获取元信息失败", Error: err.Error()})
  205. return
  206. }
  207. c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: caps})
  208. }