package feed import ( "feedsystem_video_go/internal/middleware" "time" "github.com/gin-gonic/gin" ) type FeedHandler struct { service *FeedService } func NewFeedHandler(service *FeedService) *FeedHandler { return &FeedHandler{service: service} } func (f *FeedHandler) ListLatest(c *gin.Context) { var req ListLatestRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return } if req.Limit <= 0 || req.Limit > 50 { req.Limit = 10 } var latestTime time.Time if req.LatestTime > 0 { latestTime = time.Unix(req.LatestTime, 0) } viewerAccountID, err := middleware.GetAccountID(c) if err != nil { viewerAccountID = 0 } feedItems, err := f.service.ListLatest(c.Request.Context(), req.Limit, latestTime, viewerAccountID) if err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } c.JSON(200, feedItems) } func (f *FeedHandler) ListLikesCount(c *gin.Context) { var req ListLikesCountRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return } if req.Limit <= 0 || req.Limit > 50 { req.Limit = 10 } var cursor *LikesCountCursor if req.LikesCountBefore != nil || req.IDBefore != nil { if req.LikesCountBefore == nil || req.IDBefore == nil { c.JSON(400, gin.H{"error": "likes_count_before and id_before must be provided together"}) return } likesCountBefore := *req.LikesCountBefore idBefore := *req.IDBefore if likesCountBefore < 0 { c.JSON(400, gin.H{"error": "invalid cursor: likes_count_before must be >= 0"}) return } if idBefore == 0 { if likesCountBefore != 0 { c.JSON(400, gin.H{"error": "invalid cursor: id_before must be > 0"}) return } } else { cursor = &LikesCountCursor{ LikesCount: likesCountBefore, ID: idBefore, } } } viewerAccountID, err := middleware.GetAccountID(c) if err != nil { viewerAccountID = 0 } feedItems, err := f.service.ListLikesCount(c.Request.Context(), req.Limit, cursor, viewerAccountID) if err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } c.JSON(200, feedItems) } func (f *FeedHandler) ListByFollowing(c *gin.Context) { var req ListByFollowingRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return } if req.Limit <= 0 || req.Limit > 50 { req.Limit = 10 } viewerAccountID, err := middleware.GetAccountID(c) if err != nil { viewerAccountID = 0 } var latestTime time.Time if req.LatestTime > 0 { latestTime = time.Unix(req.LatestTime, 0) } feedItems, err := f.service.ListByFollowing(c.Request.Context(), req.Limit, latestTime, viewerAccountID) if err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } c.JSON(200, feedItems) }