| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- package handler
- import (
- "net/http"
- "dbview/service/internal/common/databases/meta"
- "dbview/service/internal/common/response"
- api "dbview/service/internal/modules/database_meta/api"
- svc "dbview/service/internal/modules/database_meta/service"
- "github.com/gin-gonic/gin"
- )
- type Handler struct {
- svc *svc.MetadataService
- }
- func NewHandler(s *svc.MetadataService) *Handler {
- return &Handler{svc: s}
- }
- // GetRootObjectsHandler POST /metadata/root
- // body: api.GetRootRequest
- func (h *Handler) GetRootObjectsHandler(c *gin.Context) {
- var req api.GetRootRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- page := req.Page
- if page <= 0 {
- page = 1
- }
- pageSize := req.PageSize
- if pageSize <= 0 {
- pageSize = 50
- }
- // 使用 req.ConnID 作为连接池查找 key,ConnInfo 仅用于信息打印
- objs, total, err := h.svc.GetRootObjects(c.Request.Context(), req.ConnID, req.ConnInfo, page, pageSize, req.Fetch)
- if err != nil {
- c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "查询根对象失败", Error: err.Error()})
- return
- }
- c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: map[string]interface{}{"total": total, "data": objs}})
- }
- // GetChildObjectsHandler POST /metadata/children
- // body: api.GetChildrenRequest
- func (h *Handler) GetChildObjectsHandler(c *gin.Context) {
- var req api.GetChildrenRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- page := req.Page
- if page <= 0 {
- page = 1
- }
- pageSize := req.PageSize
- if pageSize <= 0 {
- pageSize = 50
- }
- typ := req.Type
- if typ == "" {
- typ = "table"
- }
- // 将请求中的 Path 转为 meta.ObjectPath
- path := meta.ObjectPath{}
- for _, e := range req.Path {
- path = append(path, meta.ObjectPathEntry{Type: e.Type, Name: e.Name})
- }
- // 使用 ConnID 作为连接标识
- objs, total, err := h.svc.GetChildObjects(c.Request.Context(), req.ConnID, path, typ, page, pageSize, req.Fetch)
- if err != nil {
- c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "查询子对象失败", Error: err.Error()})
- return
- }
- c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: map[string]interface{}{"total": total, "data": objs}})
- }
- // GetObjectDetailHandler POST /metadata/object
- // body: api.GetObjectRequest
- func (h *Handler) GetObjectDetailHandler(c *gin.Context) {
- var body api.GetObjectRequest
- if err := c.ShouldBindJSON(&body); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- // 将请求中的 Path 转为 meta.ObjectPath 并调用服务
- path := meta.ObjectPath{}
- for _, e := range body.Path {
- path = append(path, meta.ObjectPathEntry{Type: e.Type, Name: e.Name})
- }
- // 使用 ConnID 作为连接查找标识,ConnInfo 可用于打印/展示
- obj, err := h.svc.GetObjectDetails(c.Request.Context(), body.ConnID, path, body.Fetch)
- if err != nil {
- c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "查询对象详情失败", Error: err.Error()})
- return
- }
- c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: obj})
- }
- // DescribeCreateTemplateHandler POST /metadata/create/template
- // body: api.CreateTemplateRequest
- func (h *Handler) DescribeCreateTemplateHandler(c *gin.Context) {
- var req api.CreateTemplateRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- tpl, err := h.svc.DescribeCreateTemplate(c.Request.Context(), req.ConnID, req.ObjectType, req.ParentName)
- if err != nil {
- c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "获取创建模板失败", Error: err.Error()})
- return
- }
- c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: tpl})
- }
- // CreateObjectHandler POST /metadata/object/create
- // body: api.CreateObjectRequest
- func (h *Handler) CreateObjectHandler(c *gin.Context) {
- var req api.CreateObjectRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- // map to meta.CreateObjectRequest
- coreReq := meta.CreateObjectRequest{
- ObjectType: req.ObjectType,
- ParentName: req.ParentName,
- Properties: req.Properties,
- Execute: req.Execute,
- Options: req.Options,
- }
- resp, err := h.svc.CreateObject(c.Request.Context(), req.ConnID, coreReq)
- if err != nil {
- // Drivers/services now return plain errors for validation or other issues.
- // Map any returned error to a 400 ParamError response so client can inspect the message.
- c.JSON(http.StatusBadRequest, response.ParamErrorWithDetail("创建对象失败", err))
- return
- }
- c.JSON(http.StatusOK, response.Success(resp))
- }
- // DeleteObjectsHandler POST /metadata/object/delete
- // body: meta.ObjectOperationRequest
- func (h *Handler) DeleteObjectsHandler(c *gin.Context) {
- var req meta.ObjectOperationRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- resp, err := h.svc.DeleteObjects(c.Request.Context(), req)
- if err != nil {
- c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "删除对象匹配失败", Error: err.Error()})
- return
- }
- c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: resp})
- }
- // DescribeUpdateTemplateHandler POST /database/metadata/update/template
- // body: api.UpdateTemplateRequest
- func (h *Handler) DescribeUpdateTemplateHandler(c *gin.Context) {
- var req api.UpdateTemplateRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- tpl, err := h.svc.DescribeUpdateTemplate(c.Request.Context(), req.ConnID, req.Path)
- if err != nil {
- c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "获取修改模板失败", Error: err.Error()})
- return
- }
- c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: tpl})
- }
- // UpdateObjectHandler POST /database/metadata/object/update
- // body: api.UpdateObjectRequest
- func (h *Handler) UpdateObjectHandler(c *gin.Context) {
- var req api.UpdateObjectRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- resp, err := h.svc.UpdateObject(c.Request.Context(), req.ConnID, req.UpdateRequest)
- if err != nil {
- c.JSON(http.StatusBadRequest, response.ParamErrorWithDetail("修改对象失败", err))
- return
- }
- c.JSON(http.StatusOK, response.Success(resp))
- }
- // DescribeDeleteTemplateHandler POST /database/metadata/delete/template
- // body: api.DeleteTemplateRequest
- func (h *Handler) DescribeDeleteTemplateHandler(c *gin.Context) {
- var req api.DeleteTemplateRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- tpl, err := h.svc.DescribeDeleteTemplate(c.Request.Context(), req.ConnID, req.Path)
- if err != nil {
- c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "获取删除模板失败", Error: err.Error()})
- return
- }
- c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: tpl})
- }
- // GetMetadataInfoHandler POST /database/metadata/info
- // body: api.GetMetadataInfoRequest
- func (h *Handler) GetMetadataInfoHandler(c *gin.Context) {
- var req api.GetMetadataInfoRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- c.JSON(http.StatusBadRequest, response.Response{Code: 1, Msg: "请求参数错误", Error: err.Error()})
- return
- }
- caps, err := h.svc.GetMetadataInfo(c.Request.Context(), req.ConnID)
- if err != nil {
- c.JSON(http.StatusInternalServerError, response.Response{Code: 2, Msg: "获取元信息失败", Error: err.Error()})
- return
- }
- c.JSON(http.StatusOK, response.Response{Code: 0, Msg: "ok", Data: caps})
- }
|