153 lines
4.0 KiB
Go
153 lines
4.0 KiB
Go
package handler
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/common"
|
|
"github.com/Nanqipro/YunQue-Tech-Projects/ai_english_learning/serve/internal/services"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// WordBookHandler 生词本处理器
|
|
type WordBookHandler struct {
|
|
wordBookService *services.WordBookService
|
|
}
|
|
|
|
func NewWordBookHandler(wordBookService *services.WordBookService) *WordBookHandler {
|
|
return &WordBookHandler{wordBookService: wordBookService}
|
|
}
|
|
|
|
// ToggleFavorite 切换单词收藏状态
|
|
// POST /api/v1/word-book/toggle/:id
|
|
func (h *WordBookHandler) ToggleFavorite(c *gin.Context) {
|
|
userID := c.GetInt64("user_id")
|
|
wordIDStr := c.Param("id")
|
|
|
|
wordID, err := strconv.ParseInt(wordIDStr, 10, 64)
|
|
if err != nil {
|
|
common.ErrorResponse(c, 400, "无效的单词ID")
|
|
return
|
|
}
|
|
|
|
isFavorite, err := h.wordBookService.ToggleFavorite(userID, wordID)
|
|
if err != nil {
|
|
common.ErrorResponse(c, 500, "操作失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
common.SuccessResponse(c, gin.H{
|
|
"is_favorite": isFavorite,
|
|
"message": func() string {
|
|
if isFavorite {
|
|
return "已添加到生词本"
|
|
}
|
|
return "已从生词本移除"
|
|
}(),
|
|
})
|
|
}
|
|
|
|
// GetFavoriteWords 获取生词本列表
|
|
// GET /api/v1/word-book
|
|
func (h *WordBookHandler) GetFavoriteWords(c *gin.Context) {
|
|
userID := c.GetInt64("user_id")
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|
sortBy := c.DefaultQuery("sort_by", "created_at") // created_at, proficiency, word
|
|
order := c.DefaultQuery("order", "desc") // asc, desc
|
|
|
|
words, total, err := h.wordBookService.GetFavoriteWords(userID, page, pageSize, sortBy, order)
|
|
if err != nil {
|
|
common.ErrorResponse(c, 500, "获取生词本失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
common.SuccessResponse(c, gin.H{
|
|
"words": words,
|
|
"total": total,
|
|
"page": page,
|
|
"page_size": pageSize,
|
|
"total_pages": (total + int64(pageSize) - 1) / int64(pageSize),
|
|
})
|
|
}
|
|
|
|
// GetFavoriteWordsByBook 获取指定词汇书的生词本
|
|
// GET /api/v1/word-book/books/:id
|
|
func (h *WordBookHandler) GetFavoriteWordsByBook(c *gin.Context) {
|
|
userID := c.GetInt64("user_id")
|
|
bookID := c.Param("id")
|
|
|
|
words, err := h.wordBookService.GetFavoriteWordsByBook(userID, bookID)
|
|
if err != nil {
|
|
common.ErrorResponse(c, 500, "获取生词本失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
common.SuccessResponse(c, gin.H{
|
|
"words": words,
|
|
"total": len(words),
|
|
})
|
|
}
|
|
|
|
// GetFavoriteStats 获取生词本统计信息
|
|
// GET /api/v1/word-book/stats
|
|
func (h *WordBookHandler) GetFavoriteStats(c *gin.Context) {
|
|
userID := c.GetInt64("user_id")
|
|
|
|
stats, err := h.wordBookService.GetFavoriteStats(userID)
|
|
if err != nil {
|
|
common.ErrorResponse(c, 500, "获取统计信息失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
common.SuccessResponse(c, stats)
|
|
}
|
|
|
|
// BatchAddToFavorite 批量添加到生词本
|
|
// POST /api/v1/word-book/batch
|
|
func (h *WordBookHandler) BatchAddToFavorite(c *gin.Context) {
|
|
userID := c.GetInt64("user_id")
|
|
|
|
var req struct {
|
|
WordIDs []int64 `json:"word_ids" binding:"required,min=1"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
common.ErrorResponse(c, 400, "参数错误: "+err.Error())
|
|
return
|
|
}
|
|
|
|
count, err := h.wordBookService.BatchAddToFavorite(userID, req.WordIDs)
|
|
if err != nil {
|
|
common.ErrorResponse(c, 500, "批量添加失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
common.SuccessResponse(c, gin.H{
|
|
"added_count": count,
|
|
"message": "批量添加成功",
|
|
})
|
|
}
|
|
|
|
// RemoveFromFavorite 从生词本移除单词
|
|
// DELETE /api/v1/word-book/:id
|
|
func (h *WordBookHandler) RemoveFromFavorite(c *gin.Context) {
|
|
userID := c.GetInt64("user_id")
|
|
wordIDStr := c.Param("id")
|
|
|
|
wordID, err := strconv.ParseInt(wordIDStr, 10, 64)
|
|
if err != nil {
|
|
common.ErrorResponse(c, 400, "无效的单词ID")
|
|
return
|
|
}
|
|
|
|
err = h.wordBookService.RemoveFromFavorite(userID, wordID)
|
|
if err != nil {
|
|
common.ErrorResponse(c, 500, "移除失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
common.SuccessResponse(c, gin.H{
|
|
"message": "已从生词本移除",
|
|
})
|
|
}
|