second commit
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
package v1
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
|
||||
"github.com/gochat/gochat/internal/service"
|
||||
applogger "github.com/gochat/gochat/pkg/logger"
|
||||
"github.com/gochat/gochat/pkg/response"
|
||||
)
|
||||
|
||||
// LiveReportHandler handles live/real-time reporting endpoints.
|
||||
// Reference: Chatwoot app/controllers/api/v2/accounts/live_reports_controller.rb
|
||||
type LiveReportHandler struct {
|
||||
svc *service.AnalyticsService
|
||||
}
|
||||
|
||||
func NewLiveReportHandler(svc *service.AnalyticsService) *LiveReportHandler {
|
||||
return &LiveReportHandler{svc: svc}
|
||||
}
|
||||
|
||||
// ConversationMetrics returns real-time conversation counts (open, unattended, unassigned, pending).
|
||||
// GET /api/v1/accounts/:account_id/live_reports/conversation_metrics
|
||||
// Reference: Chatwoot live_reports#conversation_metrics — { open, unattended, unassigned, pending }
|
||||
func (h *LiveReportHandler) ConversationMetrics(c *gin.Context) {
|
||||
accountID := getAccountID(c)
|
||||
if accountID == 0 {
|
||||
response.AbortWithStatusError(c, http.StatusBadRequest, response.ErrBadRequest, "invalid account_id")
|
||||
return
|
||||
}
|
||||
|
||||
// Chatwoot supports team_id filter
|
||||
teamIDStr := c.Query("team_id")
|
||||
|
||||
result, err := h.svc.GetConversationMetrics(c.Request.Context(), accountID)
|
||||
if err != nil {
|
||||
applogger.L().Errorf("Live conversation metrics: %v", err)
|
||||
response.AbortWithStatusError(c, http.StatusInternalServerError, response.ErrInternal, "failed to get conversation metrics")
|
||||
return
|
||||
}
|
||||
|
||||
// Chatwoot also filters by team_id if provided — TODO: implement team filter
|
||||
_ = teamIDStr
|
||||
|
||||
response.OK(c, result)
|
||||
}
|
||||
|
||||
// GroupedConversationMetrics returns conversation metrics grouped by team_id or assignee_id.
|
||||
// GET /api/v1/accounts/:account_id/live_reports/grouped_conversation_metrics
|
||||
// Reference: Chatwoot live_reports#grouped_conversation_metrics — group_by=team_id|assignee_id
|
||||
// Returns array of { group_by_field, open, unattended, unassigned }
|
||||
func (h *LiveReportHandler) GroupedConversationMetrics(c *gin.Context) {
|
||||
accountID := getAccountID(c)
|
||||
if accountID == 0 {
|
||||
response.AbortWithStatusError(c, http.StatusBadRequest, response.ErrBadRequest, "invalid account_id")
|
||||
return
|
||||
}
|
||||
|
||||
groupBy := c.Query("group_by")
|
||||
if groupBy != "team_id" && groupBy != "assignee_id" {
|
||||
// Reference: Chatwoot returns 422 for invalid group_by
|
||||
response.AbortWithStatusError(c, http.StatusUnprocessableEntity, response.ErrBadRequest, "invalid group_by, must be team_id or assignee_id")
|
||||
return
|
||||
}
|
||||
|
||||
result, err := h.svc.GetGroupedConversationMetrics(c.Request.Context(), accountID, groupBy)
|
||||
if err != nil {
|
||||
applogger.L().Errorf("Grouped conversation metrics: %v", err)
|
||||
response.AbortWithStatusError(c, http.StatusInternalServerError, response.ErrInternal, "failed to get grouped conversation metrics")
|
||||
return
|
||||
}
|
||||
|
||||
response.OK(c, result)
|
||||
}
|
||||
Reference in New Issue
Block a user