package v1 import ( "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/gochat/gochat/internal/service" ) // ContactInboxHandler handles contact_inbox-specific API endpoints // that are not nested under a single contact (e.g., filter by account). // Reference: Chatwoot app/controllers/api/v1/contact_inboxes_controller.rb type ContactInboxHandler struct { svc *service.ContactInboxService } // NewContactInboxHandler creates a new ContactInboxHandler. func NewContactInboxHandler(svc *service.ContactInboxService) *ContactInboxHandler { return &ContactInboxHandler{svc: svc} } // Filter retrieves contact_inboxes by account with optional filters. // GET /api/v1/accounts/:id/contact_inboxes/filter?inbox_id=...&contact_id=...&source_id=...&page=1&page_size=25 // Reference: Chatwoot contact_inboxes_controller#filter func (h *ContactInboxHandler) Filter(c *gin.Context) { accountID, err := parseUintParam(c, "id") if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid account id"}) return } page := getPage(c) perPage := getPageSize(c) offset := (page - 1) * perPage // Optional filter params var inboxID, contactID *uint if v := c.Query("inbox_id"); v != "" { id, e := strconv.ParseUint(v, 10, 64) if e == nil { uid := uint(id) inboxID = &uid } } if v := c.Query("contact_id"); v != "" { id, e := strconv.ParseUint(v, 10, 64) if e == nil { uid := uint(id) contactID = &uid } } sourceID := c.Query("source_id") contactInboxes, total, svcErr := h.svc.FilterContactInboxes( c.Request.Context(), accountID, inboxID, contactID, sourceID, offset, perPage, ) if svcErr != nil { c.JSON(http.StatusUnprocessableEntity, gin.H{"error": "failed to filter contact inboxes"}) return } c.JSON(http.StatusOK, gin.H{ "contact_inboxes": contactInboxes, "meta": gin.H{"count": total, "page": page, "page_size": perPage}, }) }