Class: Assistant::TechnicalSupport::CaseEventStream

Inherits:
Object
  • Object
show all
Defined in:
app/services/assistant/technical_support/case_event_stream.rb

Overview

Builds the complete, typed, de-identified chronology used to derive a
Technical Support replay episode. Source records remain the system of
record; this service only returns immutable in-memory evidence and an
explicit coverage audit.

Defined Under Namespace

Classes: Collector, Event, EventBuilder, EvidenceGraph, Redactor, Result, SourceCoverage

Constant Summary collapse

MAX_EVENT_CHARS =
4_000
MAX_ANALYZER_CHARS =
400_000
SENTENCE_BOUNDARY_PATTERN =
/(?<=[.!?])\s+/
EVENT_SLICE_PATTERN =
/.{1,#{MAX_EVENT_CHARS}}/mo
SOURCE_TYPES =
%w[
  SupportCase Activity Communication CallRecord Upload Order Quote Rma
  RoomConfiguration
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(support_case, collector_class: Collector) ⇒ CaseEventStream

Returns a new instance of CaseEventStream.



79
80
81
82
# File 'app/services/assistant/technical_support/case_event_stream.rb', line 79

def initialize(support_case, collector_class: Collector)
  @support_case = support_case
  @collector_class = collector_class
end

Class Method Details

.call(support_case) ⇒ Result

Returns complete event stream and source-coverage audit.

Parameters:

Returns:

  • (Result)

    complete event stream and source-coverage audit



74
75
76
# File 'app/services/assistant/technical_support/case_event_stream.rb', line 74

def call(support_case)
  new(support_case).call
end

Instance Method Details

#callResult

Returns:



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/services/assistant/technical_support/case_event_stream.rb', line 85

def call
  collection = collector_class.new(support_case).call
  events = collection.raw_events
                     .sort_by { |event| [event.occurred_at || Time.zone.at(0), event.sequence] }
                     .flat_map { |event| split_event(event) }
  total_chars = events.sum { |event| event.text.length }
  blockers = collection.blockers.dup
  blockers << analyzer_limit_message(total_chars) if total_chars > MAX_ANALYZER_CHARS

  Result.new(
    events: events.freeze,
    coverage: collection.coverage,
    blockers: blockers.uniq.freeze,
    total_chars:
  )
end