faq_controller.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package controller
  2. import (
  3. "log"
  4. "net/http"
  5. "strconv"
  6. "github.com/2930134478/AI-CS/backend/service"
  7. "github.com/gin-gonic/gin"
  8. )
  9. // FAQController 负责处理 FAQ(常见问题)相关的 HTTP 请求。
  10. type FAQController struct {
  11. faqService *service.FAQService
  12. users *service.UserService
  13. }
  14. // NewFAQController 创建 FAQController 实例。
  15. func NewFAQController(faqService *service.FAQService, users *service.UserService) *FAQController {
  16. return &FAQController{faqService: faqService, users: users}
  17. }
  18. // ListFAQs 获取 FAQ 列表,支持关键词搜索。
  19. // GET /faqs?query=openai%api%调用
  20. func (f *FAQController) ListFAQs(c *gin.Context) {
  21. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  22. return
  23. }
  24. // 获取查询参数
  25. query := c.Query("query")
  26. // 查询 FAQ 列表
  27. faqs, err := f.faqService.ListFAQs(query)
  28. if err != nil {
  29. log.Printf("查询 FAQ 列表失败: %v", err)
  30. c.JSON(http.StatusInternalServerError, gin.H{"error": "查询 FAQ 列表失败"})
  31. return
  32. }
  33. c.JSON(http.StatusOK, gin.H{
  34. "faqs": faqs,
  35. })
  36. }
  37. // GetFAQ 获取 FAQ 详情。
  38. // GET /faqs/:id
  39. func (f *FAQController) GetFAQ(c *gin.Context) {
  40. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  41. return
  42. }
  43. // 获取 ID
  44. idStr := c.Param("id")
  45. id, err := strconv.ParseUint(idStr, 10, 64)
  46. if err != nil || id == 0 {
  47. c.JSON(http.StatusBadRequest, gin.H{"error": "FAQ ID 不合法"})
  48. return
  49. }
  50. // 查询 FAQ
  51. faq, err := f.faqService.GetFAQ(uint(id))
  52. if err != nil {
  53. log.Printf("查询 FAQ 失败: %v", err)
  54. c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
  55. return
  56. }
  57. c.JSON(http.StatusOK, faq)
  58. }
  59. // CreateFAQ 创建新的 FAQ 记录。
  60. // POST /faqs
  61. func (f *FAQController) CreateFAQ(c *gin.Context) {
  62. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  63. return
  64. }
  65. var req struct {
  66. Question string `json:"question" binding:"required"`
  67. Answer string `json:"answer" binding:"required"`
  68. Keywords string `json:"keywords"`
  69. }
  70. if err := c.ShouldBindJSON(&req); err != nil {
  71. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  72. return
  73. }
  74. // 创建 FAQ
  75. faq, err := f.faqService.CreateFAQ(service.CreateFAQInput{
  76. Question: req.Question,
  77. Answer: req.Answer,
  78. Keywords: req.Keywords,
  79. })
  80. if err != nil {
  81. log.Printf("创建 FAQ 失败: %v", err)
  82. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  83. return
  84. }
  85. c.JSON(http.StatusOK, faq)
  86. }
  87. // UpdateFAQ 更新 FAQ 记录。
  88. // PUT /faqs/:id
  89. func (f *FAQController) UpdateFAQ(c *gin.Context) {
  90. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  91. return
  92. }
  93. // 获取 ID
  94. idStr := c.Param("id")
  95. id, err := strconv.ParseUint(idStr, 10, 64)
  96. if err != nil || id == 0 {
  97. c.JSON(http.StatusBadRequest, gin.H{"error": "FAQ ID 不合法"})
  98. return
  99. }
  100. var req struct {
  101. Question *string `json:"question"`
  102. Answer *string `json:"answer"`
  103. Keywords *string `json:"keywords"`
  104. }
  105. if err := c.ShouldBindJSON(&req); err != nil {
  106. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  107. return
  108. }
  109. // 更新 FAQ
  110. faq, err := f.faqService.UpdateFAQ(uint(id), service.UpdateFAQInput{
  111. Question: req.Question,
  112. Answer: req.Answer,
  113. Keywords: req.Keywords,
  114. })
  115. if err != nil {
  116. log.Printf("更新 FAQ 失败: %v", err)
  117. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  118. return
  119. }
  120. c.JSON(http.StatusOK, faq)
  121. }
  122. // DeleteFAQ 删除 FAQ 记录。
  123. // DELETE /faqs/:id
  124. func (f *FAQController) DeleteFAQ(c *gin.Context) {
  125. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  126. return
  127. }
  128. // 获取 ID
  129. idStr := c.Param("id")
  130. id, err := strconv.ParseUint(idStr, 10, 64)
  131. if err != nil || id == 0 {
  132. c.JSON(http.StatusBadRequest, gin.H{"error": "FAQ ID 不合法"})
  133. return
  134. }
  135. // 删除 FAQ
  136. if err := f.faqService.DeleteFAQ(uint(id)); err != nil {
  137. log.Printf("删除 FAQ 失败: %v", err)
  138. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  139. return
  140. }
  141. c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
  142. }