This API gives you how many conversations exist per channel, broken down
by status in a given time period. The max time period is capped to 6
months for now.
**Input Params:**
- **since:** Unix timestamp (seconds) - start of date range
- **until:** Unix timestamp (seconds) - end of date range
**Response Payload:**
```json
{
"Channel::Sms": {
"resolved": 85,
"snoozed": 10,
"open": 5,
"pending": 5,
"total": 100
},
"Channel::Email": {
"resolved": 72,
"snoozed": 15,
"open": 13,
"pending": 13,
"total": 100
},
"Channel::WebWidget": {
"resolved": 90,
"snoozed": 7,
"open": 3,
"pending": 3,
"total": 100
}
}
```
**Definitons:**
resolved = Number of conversations created within the selected time
period that are currently marked as resolved.
snoozed = Number of conversations created within the selected time
period that are currently marked as snoozed.
pending = Number of conversations created within the selected time
period that are currently marked as pending.
open = Number of conversations created within the selected time period
that are currently open.
total = Total number of conversations created within the selected time
period, across all statuses.
39 lines
1.1 KiB
Ruby
39 lines
1.1 KiB
Ruby
class V2::Reports::ChannelSummaryBuilder
|
|
include DateRangeHelper
|
|
|
|
pattr_initialize [:account!, :params!]
|
|
|
|
def build
|
|
conversations_by_channel_and_status.transform_values { |status_counts| build_channel_stats(status_counts) }
|
|
end
|
|
|
|
private
|
|
|
|
def conversations_by_channel_and_status
|
|
account.conversations
|
|
.joins(:inbox)
|
|
.where(created_at: range)
|
|
.group('inboxes.channel_type', 'conversations.status')
|
|
.count
|
|
.each_with_object({}) do |((channel_type, status), count), grouped|
|
|
grouped[channel_type] ||= {}
|
|
grouped[channel_type][status] = count
|
|
end
|
|
end
|
|
|
|
def build_channel_stats(status_counts)
|
|
open_count = status_counts['open'] || 0
|
|
resolved_count = status_counts['resolved'] || 0
|
|
pending_count = status_counts['pending'] || 0
|
|
snoozed_count = status_counts['snoozed'] || 0
|
|
|
|
{
|
|
open: open_count,
|
|
resolved: resolved_count,
|
|
pending: pending_count,
|
|
snoozed: snoozed_count,
|
|
total: open_count + resolved_count + pending_count + snoozed_count
|
|
}
|
|
end
|
|
end
|