2026-04-25 16:03:29 +08:00
|
|
|
package video
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"feedsystem_video_go/internal/middleware/jwt"
|
2026-04-25 16:18:57 +08:00
|
|
|
"feedsystem_video_go/internal/apierror"
|
2026-04-25 16:03:29 +08:00
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type LikeHandler struct {
|
|
|
|
|
service *LikeService
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewLikeHandler(service *LikeService) *LikeHandler {
|
|
|
|
|
return &LikeHandler{service: service}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (lh *LikeHandler) Like(c *gin.Context) {
|
|
|
|
|
var req LikeRequest
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
2026-04-25 16:18:57 +08:00
|
|
|
c.JSON(apierror.ClassifyHTTPStatus(err), gin.H{"error": err.Error()})
|
2026-04-25 16:03:29 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if req.VideoID <= 0 {
|
|
|
|
|
c.JSON(400, gin.H{"error": "video_id is required"})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
accountID, err := jwt.GetAccountID(c)
|
|
|
|
|
if err != nil {
|
2026-04-25 16:18:57 +08:00
|
|
|
c.JSON(apierror.ClassifyHTTPStatus(err), gin.H{"error": err.Error()})
|
2026-04-25 16:03:29 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
like := &Like{
|
|
|
|
|
VideoID: req.VideoID,
|
|
|
|
|
AccountID: accountID,
|
|
|
|
|
}
|
|
|
|
|
if err := lh.service.Like(c.Request.Context(), like); err != nil {
|
|
|
|
|
c.JSON(500, gin.H{"error": err.Error()})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
c.JSON(200, gin.H{"message": "like success"})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (lh *LikeHandler) Unlike(c *gin.Context) {
|
|
|
|
|
var req LikeRequest
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
2026-04-25 16:18:57 +08:00
|
|
|
c.JSON(apierror.ClassifyHTTPStatus(err), gin.H{"error": err.Error()})
|
2026-04-25 16:03:29 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if req.VideoID <= 0 {
|
|
|
|
|
c.JSON(400, gin.H{"error": "video_id is required"})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
accountID, err := jwt.GetAccountID(c)
|
|
|
|
|
if err != nil {
|
2026-04-25 16:18:57 +08:00
|
|
|
c.JSON(apierror.ClassifyHTTPStatus(err), gin.H{"error": err.Error()})
|
2026-04-25 16:03:29 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
like := &Like{
|
|
|
|
|
VideoID: req.VideoID,
|
|
|
|
|
AccountID: accountID,
|
|
|
|
|
}
|
|
|
|
|
if err := lh.service.Unlike(c.Request.Context(), like); err != nil {
|
|
|
|
|
c.JSON(500, gin.H{"error": err.Error()})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
c.JSON(200, gin.H{"message": "unlike success"})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (lh *LikeHandler) IsLiked(c *gin.Context) {
|
|
|
|
|
var req LikeRequest
|
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
2026-04-25 16:18:57 +08:00
|
|
|
c.JSON(apierror.ClassifyHTTPStatus(err), gin.H{"error": err.Error()})
|
2026-04-25 16:03:29 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if req.VideoID <= 0 {
|
|
|
|
|
c.JSON(400, gin.H{"error": "video_id is required"})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
accountID, err := jwt.GetAccountID(c)
|
|
|
|
|
if err != nil {
|
2026-04-25 16:18:57 +08:00
|
|
|
c.JSON(apierror.ClassifyHTTPStatus(err), gin.H{"error": err.Error()})
|
2026-04-25 16:03:29 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
isLiked, err := lh.service.IsLiked(c.Request.Context(), req.VideoID, accountID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
c.JSON(500, gin.H{"error": err.Error()})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
c.JSON(200, gin.H{"is_liked": isLiked})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (lh *LikeHandler) ListMyLikedVideos(c *gin.Context) {
|
|
|
|
|
accountID, err := jwt.GetAccountID(c)
|
|
|
|
|
if err != nil {
|
2026-04-25 16:18:57 +08:00
|
|
|
c.JSON(apierror.ClassifyHTTPStatus(err), gin.H{"error": err.Error()})
|
2026-04-25 16:03:29 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
videos, err := lh.service.ListLikedVideos(c.Request.Context(), accountID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
c.JSON(500, gin.H{"error": err.Error()})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if videos == nil {
|
|
|
|
|
videos = []Video{}
|
|
|
|
|
}
|
|
|
|
|
c.JSON(200, videos)
|
|
|
|
|
}
|