import_controller.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package controller
  2. import (
  3. "context"
  4. "log"
  5. "net/http"
  6. "strconv"
  7. "github.com/2930134478/AI-CS/backend/service"
  8. "github.com/gin-gonic/gin"
  9. )
  10. // ImportController 导入控制器
  11. type ImportController struct {
  12. importService *service.ImportService
  13. embeddingConfigService *service.EmbeddingConfigService
  14. }
  15. // NewImportController 创建导入控制器实例
  16. func NewImportController(importService *service.ImportService, embeddingConfigService *service.EmbeddingConfigService) *ImportController {
  17. return &ImportController{
  18. importService: importService,
  19. embeddingConfigService: embeddingConfigService,
  20. }
  21. }
  22. func (c *ImportController) checkKBAccess(ctx *gin.Context) bool {
  23. userID := getUserIDFromHeader(ctx)
  24. if userID == 0 {
  25. return true
  26. }
  27. if err := c.embeddingConfigService.CheckKnowledgeBaseAccess(userID); err != nil {
  28. ctx.JSON(http.StatusForbidden, gin.H{"error": err.Error()})
  29. return false
  30. }
  31. return true
  32. }
  33. // ImportDocuments 批量导入文档(文件上传)
  34. func (c *ImportController) ImportDocuments(ctx *gin.Context) {
  35. if !c.checkKBAccess(ctx) {
  36. return
  37. }
  38. // 获取知识库 ID
  39. kbIDStr := ctx.PostForm("knowledge_base_id")
  40. if kbIDStr == "" {
  41. ctx.JSON(http.StatusBadRequest, gin.H{"error": "知识库 ID 不能为空"})
  42. return
  43. }
  44. kbID, err := strconv.ParseUint(kbIDStr, 10, 64)
  45. if err != nil || kbID == 0 {
  46. ctx.JSON(http.StatusBadRequest, gin.H{"error": "知识库 ID 不合法"})
  47. return
  48. }
  49. // 获取上传的文件
  50. form, err := ctx.MultipartForm()
  51. if err != nil {
  52. ctx.JSON(http.StatusBadRequest, gin.H{"error": "获取文件失败"})
  53. return
  54. }
  55. files := form.File["files"]
  56. if len(files) == 0 {
  57. ctx.JSON(http.StatusBadRequest, gin.H{"error": "未上传文件"})
  58. return
  59. }
  60. // 保存文件到临时目录
  61. filePaths := make([]string, 0, len(files))
  62. for _, file := range files {
  63. // 保存文件
  64. filePath := "/tmp/" + file.Filename
  65. if err := ctx.SaveUploadedFile(file, filePath); err != nil {
  66. log.Printf("保存文件失败: %v", err)
  67. continue
  68. }
  69. filePaths = append(filePaths, filePath)
  70. }
  71. // 导入文件
  72. result, err := c.importService.ImportFiles(context.Background(), uint(kbID), filePaths)
  73. if err != nil {
  74. log.Printf("导入文件失败: %v", err)
  75. ctx.JSON(http.StatusInternalServerError, gin.H{"error": "批量导入失败: " + err.Error()})
  76. return
  77. }
  78. result.Message = "导入完成"
  79. ctx.JSON(http.StatusOK, result)
  80. }
  81. // ImportFromURLs 批量导入文档(URL 爬取)
  82. func (c *ImportController) ImportFromURLs(ctx *gin.Context) {
  83. if !c.checkKBAccess(ctx) {
  84. return
  85. }
  86. var req struct {
  87. KnowledgeBaseID uint `json:"knowledge_base_id" binding:"required"`
  88. URLs []string `json:"urls" binding:"required"`
  89. }
  90. if err := ctx.ShouldBindJSON(&req); err != nil {
  91. ctx.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误: " + err.Error()})
  92. return
  93. }
  94. result, err := c.importService.ImportFromUrls(context.Background(), req.KnowledgeBaseID, req.URLs)
  95. if err != nil {
  96. log.Printf("导入 URL 失败: %v", err)
  97. ctx.JSON(http.StatusInternalServerError, gin.H{"error": "批量导入失败: " + err.Error()})
  98. return
  99. }
  100. result.Message = "导入完成"
  101. ctx.JSON(http.StatusOK, result)
  102. }