Class: ThinkFeelDoEngine::Reports::LessonViewing

Inherits:
Object
  • Object
show all
Includes:
LessonModule
Defined in:
app/models/think_feel_do_engine/reports/lesson_viewing.rb

Overview

Scenario: a Participant starts viewing a Lesson.

Constant Summary

Constants included from LessonModule

ThinkFeelDoEngine::Reports::LessonModule::URL_ROOT_RE

Class Method Summary collapse

Methods included from LessonModule

included

Class Method Details

.all(*ids) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 16

def self.all(*ids)
  lessons = lesson_entries_map

  Participant.select(:id, :study_id)
    .where(id: participant_ids(ids)).map do |participant|
    lesson_select_events =
      EventCapture::Event
      .where(participant_id: participant.id, kind: "render")
      .select(:participant_id, :emitted_at, :payload)
      .to_a.select do |e|
        lessons.keys.include?(e.current_url.gsub(URL_ROOT_RE, ""))
      end

    lesson_select_events.map do |e|
      lesson_id = lessons[e.current_url.gsub(URL_ROOT_RE, "")]
      last_page_opened = last_page_opened(e, lesson_id)

      {
        participant_id: participant.study_id,
        lesson_id: lesson_id,
        page_headers: e.headers,
        lesson_selected_at: e.emitted_at.iso8601,
        last_page_number_opened: last_page_opened[:number].to_i,
        last_page_opened_at: last_page_opened[:opened_at].iso8601
      }
    end
  end.flatten
end

.columnsObject



7
8
9
10
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 7

def self.columns
  %w( participant_id lesson_id page_headers lesson_selected_at
      last_page_number_opened last_page_opened_at )
end

.last_page_opened(first_session_event, lesson_id) ⇒ Object

last event (click) with matching module id



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 46

def self.last_page_opened(first_session_event, lesson_id)
  lesson_events =
    EventCapture::Event
    .where(participant_id: first_session_event.participant_id,
           kind: "render")
    .where("emitted_at > ?", first_session_event.emitted_at)
    .order(:emitted_at)
    .select(:kind, :emitted_at, :payload)
    .to_a.take_while { |e| e.current_url.include?(lesson_id.to_s) }
  last_event = (lesson_events.last || first_session_event)

  {
    number: last_event.current_url[/\d+$/],
    opened_at: last_event.emitted_at
  }
end

.participant_ids(ids) ⇒ Object



12
13
14
# File 'app/models/think_feel_do_engine/reports/lesson_viewing.rb', line 12

def self.participant_ids(ids)
  ids.empty? ? Participant.ids : ids
end