Module: Crm::WebhookLogsHelper

Defined in:
app/helpers/crm/webhook_logs_helper.rb

Overview

View helper: webhook logs.

Instance Method Summary collapse

Instance Method Details

#extract_payload_identifier(log) ⇒ Object

Extract a quick identifier from payload



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'app/helpers/crm/webhook_logs_helper.rb', line 67

def extract_payload_identifier(log)
  data = log.data || {}

  identifier = case log.provider
               when 'sendgrid'
                 data['email']
               when 'shipengine'
                 tracking = data.dig('data', 'tracking_number')
                 tracking.present? ? "Track: #{tracking}" : nil
               when 'oxylabs'
                 data['url']&.truncate(40)
               when 'assemblyai'
                 transcript_id = data['transcript_id']
                 transcript_id.present? ? "Transcript: #{transcript_id.truncate(20)}" : nil
               end

  # Fallback: try common fields
  identifier ||= data['email'] || data['tracking_number'] || data['id']&.to_s&.truncate(30)

  return nil if identifier.blank?

  tag.small(class: 'text-muted') { identifier }
end

#webhook_log_actions(log, include_show_action: true, return_path: nil) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'app/helpers/crm/webhook_logs_helper.rb', line 91

def webhook_log_actions(log, include_show_action: true, return_path: nil)
  links = []
  with_options(controller: 'crm/webhook_logs', return_path: return_path) do |defaults|
    # State-dependent actions
    links << link_to('Process', defaults.url_for(action: :do_process, id: log.id), data: { turbo_method: :post }, class: 'dropdown-item') if log.ready? || log.retry?

    links << link_to('Reprocess', defaults.url_for(action: :do_reprocess, id: log.id), data: { turbo_method: :post }, class: 'dropdown-item') if log.processed? || log.exception? || log.retry?

    links << link_to('Archive', defaults.url_for(action: :do_archive, id: log.id), data: { turbo_method: :post }, class: 'dropdown-item') if log.exception? || log.processed?

    # Standard actions
    links << link_to('Show', defaults.url_for(action: :show, id: log.id), class: 'dropdown-item') if include_show_action
    links << link_to('Edit', defaults.url_for(action: :edit, id: log.id), class: 'dropdown-item') if can?(:update, log)
    if can?(:destroy, log)
      links << link_to('Delete', defaults.url_for(action: :destroy, id: log.id),
                       data: { turbo_method: :delete, turbo_confirm: 'Delete this webhook log?' },
                       class: 'dropdown-item text-danger')
    end
  end
  links
end

#webhook_log_format_data(log) ⇒ Object



113
114
115
116
117
# File 'app/helpers/crm/webhook_logs_helper.rb', line 113

def webhook_log_format_data(log)
  return tag.pre('No data', class: 'text-muted') if log.data.blank?

  tag.pre(pretty_json_tag(log.data), class: 'bg-light p-3 rounded')
end

#webhook_log_format_response(log) ⇒ Object



119
120
121
122
123
# File 'app/helpers/crm/webhook_logs_helper.rb', line 119

def webhook_log_format_response(log)
  return tag.pre('No response', class: 'text-muted') if log.response_data.blank?

  tag.pre(pretty_json_tag(log.response_data), class: 'bg-light p-3 rounded')
end

#webhook_log_provider_name(log) ⇒ Object



26
27
28
# File 'app/helpers/crm/webhook_logs_helper.rb', line 26

def webhook_log_provider_name(log)
  log.provider.to_s.titleize
end


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'app/helpers/crm/webhook_logs_helper.rb', line 30

def webhook_log_resource_link(log)
  parts = []

  # Always try to extract payload identifier first
  payload_id = extract_payload_identifier(log)
  parts << payload_id if payload_id.present?

  # If resource is mapped, add link
  if log.resource_type.present? && log.resource_id.present?
    resource = log.resource
    resource_link = if resource.nil?
                      tag.span(class: 'text-warning') { "#{log.resource_type} ##{log.resource_id} (deleted)" }
                    else
                      case log.resource_type
                      when 'CallRecord'
                        link_to "CallRecord ##{log.resource_id}", call_record_path(resource)
                      when 'Video'
                        link_to resource.title.truncate(30), video_path(resource)
                      when 'CatalogItem'
                        link_to "CatalogItem ##{log.resource_id}", catalog_item_path(resource)
                      when 'CommunicationRecipient'
                        link_to "Communication ##{resource.communication_id}", communication_path(resource.communication)
                      when 'Shipment'
                        link_to "Shipment ##{log.resource_id}", shipment_path(resource)
                      else
                        "#{log.resource_type} ##{log.resource_id}"
                      end
                    end
    parts << resource_link
  end

  return '-' if parts.empty?

  safe_join(parts, tag.br)
end

#webhook_log_state_badge(log) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'app/helpers/crm/webhook_logs_helper.rb', line 5

def webhook_log_state_badge(log)
  state = log.state.to_s
  badge_class = case state
                when 'pending' then 'bg-info'        # Awaiting callback
                when 'ready' then 'bg-primary'       # Callback received, ready to process
                when 'processing' then 'bg-warning'  # Currently processing
                when 'processed' then 'bg-success'   # Completed
                when 'retry' then 'bg-warning'       # Scheduled for retry
                when 'exception' then 'bg-danger'    # Failed
                when 'archived' then 'bg-secondary'  # Archived
                else 'bg-dark'
                end

  label = case state
          when 'pending' then 'Awaiting Callback'
          else state.titleize
          end

  tag.span(label, class: "badge #{badge_class}")
end

#webhook_log_statsObject



125
126
127
128
129
130
131
132
133
134
# File 'app/helpers/crm/webhook_logs_helper.rb', line 125

def webhook_log_stats
  {
    total: WebhookLog.count,
    awaiting_callback: WebhookLog.where(state: 'pending').count,
    ready_to_process: WebhookLog.where(state: %w[ready retry]).count,
    processed: WebhookLog.where(state: 'processed').count,
    failed: WebhookLog.where(state: 'exception').count,
    today: WebhookLog.where(created_at: Time.current.beginning_of_day..).count
  }
end