203 lines
5.4 KiB
Go
203 lines
5.4 KiB
Go
|
|
package handlers
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
"knowledge-graph-backend/models"
|
||
|
|
"knowledge-graph-backend/services"
|
||
|
|
)
|
||
|
|
|
||
|
|
// NodeCRUDHandler 节点的增删改处理器
|
||
|
|
type NodeCRUDHandler struct {
|
||
|
|
service services.GraphService
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewNodeCRUDHandler 创建节点CRUD处理器
|
||
|
|
func NewNodeCRUDHandler(service services.GraphService) *NodeCRUDHandler {
|
||
|
|
return &NodeCRUDHandler{
|
||
|
|
service: service,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// EdgeCRUDHandler 边的增删改处理器
|
||
|
|
type EdgeCRUDHandler struct {
|
||
|
|
service services.GraphService
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewEdgeCRUDHandler 创建边CRUD处理器
|
||
|
|
func NewEdgeCRUDHandler(service services.GraphService) *EdgeCRUDHandler {
|
||
|
|
return &EdgeCRUDHandler{
|
||
|
|
service: service,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// CreateNode 创建新节点
|
||
|
|
// @Summary 创建节点
|
||
|
|
// @Description 在知识图谱中创建一个新节点
|
||
|
|
// @Accept json
|
||
|
|
// @Produce json
|
||
|
|
// @Param request body models.CreateNodeRequest true "节点创建请求"
|
||
|
|
// @Success 200 {object} models.Node "创建成功"
|
||
|
|
// @Failure 400 {object} models.ErrorResponse "请求错误"
|
||
|
|
// @Failure 409 {object} models.ErrorResponse "节点已存在"
|
||
|
|
// @Failure 500 {object} models.ErrorResponse "内部错误"
|
||
|
|
// @Router /api/nodes [post]
|
||
|
|
func (h *NodeCRUDHandler) CreateNode(c *gin.Context) {
|
||
|
|
var req models.CreateNodeRequest
|
||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
|
c.JSON(http.StatusBadRequest, models.ErrorResponse{
|
||
|
|
Error: "invalid_request",
|
||
|
|
Message: err.Error(),
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
node, err := h.service.CreateNode(req)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusConflict, models.ErrorResponse{
|
||
|
|
Error: "create_failed",
|
||
|
|
Message: err.Error(),
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
c.JSON(http.StatusOK, node)
|
||
|
|
}
|
||
|
|
|
||
|
|
// UpdateNode 更新节点
|
||
|
|
// @Summary 更新节点
|
||
|
|
// @Description 更新知识图谱中指定节点的信息
|
||
|
|
// @Accept json
|
||
|
|
// @Produce json
|
||
|
|
// @Param id path string true "节点ID"
|
||
|
|
// @Param request body models.UpdateNodeRequest true "节点更新请求"
|
||
|
|
// @Success 200 {object} models.Node "更新成功"
|
||
|
|
// @Failure 400 {object} models.ErrorResponse "请求错误"
|
||
|
|
// @Failure 404 {object} models.ErrorResponse "节点未找到"
|
||
|
|
// @Failure 500 {object} models.ErrorResponse "内部错误"
|
||
|
|
// @Router /api/nodes/{id} [put]
|
||
|
|
func (h *NodeCRUDHandler) UpdateNode(c *gin.Context) {
|
||
|
|
id := c.Param("id")
|
||
|
|
|
||
|
|
var req models.UpdateNodeRequest
|
||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
|
c.JSON(http.StatusBadRequest, models.ErrorResponse{
|
||
|
|
Error: "invalid_request",
|
||
|
|
Message: err.Error(),
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
node, err := h.service.UpdateNode(id, req)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusNotFound, models.ErrorResponse{
|
||
|
|
Error: "update_failed",
|
||
|
|
Message: err.Error(),
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
c.JSON(http.StatusOK, node)
|
||
|
|
}
|
||
|
|
|
||
|
|
// DeleteNode 删除节点
|
||
|
|
// @Summary 删除节点
|
||
|
|
// @Description 从知识图谱中删除指定节点及其相关的所有边
|
||
|
|
// @Produce json
|
||
|
|
// @Param id path string true "节点ID"
|
||
|
|
// @Success 200 {object} models.DeleteResponse "删除成功"
|
||
|
|
// @Failure 404 {object} models.ErrorResponse "节点未找到"
|
||
|
|
// @Failure 500 {object} models.ErrorResponse "内部错误"
|
||
|
|
// @Router /api/nodes/{id} [delete]
|
||
|
|
func (h *NodeCRUDHandler) DeleteNode(c *gin.Context) {
|
||
|
|
id := c.Param("id")
|
||
|
|
|
||
|
|
err := h.service.DeleteNode(id)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusNotFound, models.ErrorResponse{
|
||
|
|
Error: "delete_failed",
|
||
|
|
Message: err.Error(),
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
c.JSON(http.StatusOK, models.DeleteResponse{
|
||
|
|
Success: true,
|
||
|
|
Message: "节点已成功删除",
|
||
|
|
ID: id,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
// CreateEdge 创建新边
|
||
|
|
// @Summary 创建边
|
||
|
|
// @Description 在知识图谱中创建一个新边(关系)
|
||
|
|
// @Accept json
|
||
|
|
// @Produce json
|
||
|
|
// @Param request body models.CreateEdgeRequest true "边创建请求"
|
||
|
|
// @Success 200 {object} models.EdgeResponse "创建成功"
|
||
|
|
// @Failure 400 {object} models.ErrorResponse "请求错误"
|
||
|
|
// @Failure 404 {object} models.ErrorResponse "源节点或目标节点未找到"
|
||
|
|
// @Failure 409 {object} models.ErrorResponse "边已存在"
|
||
|
|
// @Failure 500 {object} models.ErrorResponse "内部错误"
|
||
|
|
// @Router /api/edges [post]
|
||
|
|
func (h *EdgeCRUDHandler) CreateEdge(c *gin.Context) {
|
||
|
|
var req models.CreateEdgeRequest
|
||
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
|
c.JSON(http.StatusBadRequest, models.ErrorResponse{
|
||
|
|
Error: "invalid_request",
|
||
|
|
Message: err.Error(),
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
edge, err := h.service.CreateEdge(req)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusConflict, models.ErrorResponse{
|
||
|
|
Error: "create_failed",
|
||
|
|
Message: err.Error(),
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// 转换为响应格式
|
||
|
|
response := models.EdgeResponse{
|
||
|
|
ID: edge.ID,
|
||
|
|
Source: edge.Source,
|
||
|
|
Target: edge.Target,
|
||
|
|
Label: edge.Label,
|
||
|
|
Type: edge.Type,
|
||
|
|
Properties: edge.Properties,
|
||
|
|
}
|
||
|
|
|
||
|
|
c.JSON(http.StatusOK, response)
|
||
|
|
}
|
||
|
|
|
||
|
|
// DeleteEdge 删除边
|
||
|
|
// @Summary 删除边
|
||
|
|
// @Description 从知识图谱中删除指定的边
|
||
|
|
// @Produce json
|
||
|
|
// @Param id path string true "边ID"
|
||
|
|
// @Success 200 {object} models.DeleteResponse "删除成功"
|
||
|
|
// @Failure 404 {object} models.ErrorResponse "边未找到"
|
||
|
|
// @Failure 500 {object} models.ErrorResponse "内部错误"
|
||
|
|
// @Router /api/edges/{id} [delete]
|
||
|
|
func (h *EdgeCRUDHandler) DeleteEdge(c *gin.Context) {
|
||
|
|
edgeID := c.Param("id")
|
||
|
|
|
||
|
|
err := h.service.DeleteEdge(edgeID)
|
||
|
|
if err != nil {
|
||
|
|
c.JSON(http.StatusNotFound, models.ErrorResponse{
|
||
|
|
Error: "delete_failed",
|
||
|
|
Message: err.Error(),
|
||
|
|
})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
c.JSON(http.StatusOK, models.DeleteResponse{
|
||
|
|
Success: true,
|
||
|
|
Message: "边已成功删除",
|
||
|
|
ID: edgeID,
|
||
|
|
})
|
||
|
|
}
|