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}) }