Class: Assistant::TechnicalSupport::CaseEventStream
- Inherits:
-
Object
- Object
- Assistant::TechnicalSupport::CaseEventStream
- 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
-
.call(support_case) ⇒ Result
Complete event stream and source-coverage audit.
Instance Method Summary collapse
- #call ⇒ Result
-
#initialize(support_case, collector_class: Collector) ⇒ CaseEventStream
constructor
A new instance of CaseEventStream.
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.
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
#call ⇒ Result
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 << (total_chars) if total_chars > MAX_ANALYZER_CHARS Result.new( events: events.freeze, coverage: collection.coverage, blockers: blockers.uniq.freeze, total_chars: ) end |