75 lines
2.2 KiB
Go
75 lines
2.2 KiB
Go
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)
|
|
}
|