package handlers import ( "net/http" "strings" "gauth-central/internal/services" "github.com/gin-gonic/gin" ) type PostCategoryViewHandler struct { viewService *services.PostCategoryViewService } func NewPostCategoryViewHandler(viewService *services.PostCategoryViewService) *PostCategoryViewHandler { return &PostCategoryViewHandler{viewService: viewService} } // TrackPostCategoryView godoc // @Summary Track post category view // @Description Record a post category view (daily per IP) // @Tags post-category-views // @Produce json // @Param id path string true "Category ID" // @Success 200 {object} models.PostCategoryView // @Failure 400 {object} map[string]string // @Failure 500 {object} map[string]string // @Router /post-categories/{id}/views [post] // TrackPostCategoryView records a category view. func (h *PostCategoryViewHandler) TrackPostCategoryView(c *gin.Context) { categoryID := c.Param("id") ipAddress := strings.TrimSpace(c.ClientIP()) userAgent := strings.TrimSpace(c.GetHeader("User-Agent")) view, err := h.viewService.TrackView(categoryID, ipAddress, userAgent) if err != nil { status := http.StatusInternalServerError if err.Error() == "invalid category_id" { status = http.StatusBadRequest } c.JSON(status, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, view) } // AdminGetPostCategoryViews godoc // @Summary Get post category views (Admin) // @Description Retrieve views for a category // @Tags admin // @Security ApiKeyAuth // @Produce json // @Param category_id query string true "Category ID" // @Success 200 {array} models.PostCategoryView // @Failure 400 {object} map[string]string // @Failure 500 {object} map[string]string // @Router /admin/post-category-views [get] // AdminGetPostCategoryViews returns views for a category. func (h *PostCategoryViewHandler) AdminGetPostCategoryViews(c *gin.Context) { categoryID := strings.TrimSpace(c.Query("category_id")) if categoryID == "" { c.JSON(http.StatusBadRequest, gin.H{"error": "category_id is required"}) return } views, err := h.viewService.GetViewsByCategory(categoryID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, views) }