Class: Testimonials::Configuration

Inherits:
Object
  • Object
show all
Defined in:
lib/testimonials/configuration.rb

Overview

Host-tunable settings. Everything has a safe default, so a fresh install works with zero configuration; the hooks below let an app decide who gets prompted, who can triage, and how submissions are attributed.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConfiguration

Returns a new instance of Configuration.



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/testimonials/configuration.rb', line 97

def initialize
  @app_name = nil
  @enabled = ->(_request) { true }
  @authorize_admin = ->(_request) { Rails.env.development? }
  @current_user = ->(_request) {}
  @tenant = ->(_request) {}
  @user_display = lambda { |user|
    { name: user.try(:name), email: user.try(:email) }
  }
  @questions = nil
  @video = true
  @max_video_seconds = 120
  @max_video_size = 50 * 1024 * 1024
  @avatars = true
  @max_avatar_size = 5 * 1024 * 1024
  @reprompt_after = 90 * 24 * 60 * 60
  @max_prompts = 3
  @consent_text = nil
  @public_collection = true
  @public_api = false
  @nps = true
  @nps_reprompt_after = 90 * 24 * 60 * 60
  @on_submit = ->(_record) {}
  @on_detractor = ->(_nps_response) {}
  @rate_limit = { to: 5, within: 60 }
  @mount_path = '/testimonials'
end

Instance Attribute Details

#app_nameObject

Shown in the widget ("Enjoying %app?") and interpolated into the default questions. nil resolves to the Rails application name.



10
11
12
# File 'lib/testimonials/configuration.rb', line 10

def app_name
  @app_name
end

#authorize_adminObject

Per-request gate for the built-in dashboard. Defaults to development only — override it before deploying, e.g. with an admin check.



18
19
20
# File 'lib/testimonials/configuration.rb', line 18

def authorize_admin
  @authorize_admin
end

#avatarsObject

Headshot upload for guests on the public collection page. Requires Active Storage.



52
53
54
# File 'lib/testimonials/configuration.rb', line 52

def avatars
  @avatars
end

Consent line stored verbatim with each submission. nil uses the localized default.



64
65
66
# File 'lib/testimonials/configuration.rb', line 64

def consent_text
  @consent_text
end

#current_userObject

Resolve the current user for attribution (optional). Return an object responding to #id, or nil. Receives the request.



22
23
24
# File 'lib/testimonials/configuration.rb', line 22

def current_user
  @current_user
end

#enabledObject

Per-request gate for the widget and the submission endpoints. Return false to hide the widget and reject submissions for this request.



14
15
16
# File 'lib/testimonials/configuration.rb', line 14

def enabled
  @enabled
end

#max_avatar_sizeObject

Returns the value of attribute max_avatar_size.



53
54
55
# File 'lib/testimonials/configuration.rb', line 53

def max_avatar_size
  @max_avatar_size
end

#max_promptsObject

Auto-prompt throttling. A user who dismissed the widget is not auto-prompted again within reprompt_after; a user auto-prompted max_prompts times without submitting is never auto-prompted again; a user who submitted a testimonial is done for good. Explicit opens (clicking your link) always work.



60
61
62
# File 'lib/testimonials/configuration.rb', line 60

def max_prompts
  @max_prompts
end

#max_video_secondsObject

Returns the value of attribute max_video_seconds.



48
49
50
# File 'lib/testimonials/configuration.rb', line 48

def max_video_seconds
  @max_video_seconds
end

#max_video_sizeObject

Returns the value of attribute max_video_size.



48
49
50
# File 'lib/testimonials/configuration.rb', line 48

def max_video_size
  @max_video_size
end

#mount_pathObject

Where the engine is mounted. The widget posts to paths under it, so keep this in sync with the mount line in your routes.



95
96
97
# File 'lib/testimonials/configuration.rb', line 95

def mount_path
  @mount_path
end

#npsObject

NPS surveys ("How likely are you to recommend…", 0–10). Promoters (9–10) are offered the testimonial form right after scoring.



76
77
78
# File 'lib/testimonials/configuration.rb', line 76

def nps
  @nps
end

#nps_reprompt_afterObject

Returns the value of attribute nps_reprompt_after.



77
78
79
# File 'lib/testimonials/configuration.rb', line 77

def nps_reprompt_after
  @nps_reprompt_after
end

#on_detractorObject

Called with each NPS response scored 0–6. Route it into your feedback tool, e.g. create a FeedbackEngine::Feedback from nps.comment.



86
87
88
# File 'lib/testimonials/configuration.rb', line 86

def on_detractor
  @on_detractor
end

#on_submitObject

Called with each saved Testimonials::Testimonial or Testimonials::NpsResponse — notify Slack, send an email. Runs inline after save; keep it fast or hand off to a job.



82
83
84
# File 'lib/testimonials/configuration.rb', line 82

def on_submit
  @on_submit
end

#public_apiObject

Unauthenticated read access to the JSON API (approved + consented records only). OFF by default: the API then answers only for admins.



72
73
74
# File 'lib/testimonials/configuration.rb', line 72

def public_api
  @public_api
end

#public_collectionObject

The standalone collection page at "##mount_path/new" — for links you send to customers outside the app. ON by default; set false to 404 it.



68
69
70
# File 'lib/testimonials/configuration.rb', line 68

def public_collection
  @public_collection
end

#questionsObject

Guiding prompts shown above the message field and while recording — they fight blank-page paralysis, they are not form fields. nil uses the gem's built-in localized questions (testimonials.questions, with %app interpolated). Override with an array of literal strings, or a callable for host-side i18n: -> { I18n.t("myapp.review_questions") }. An empty array hides the section.



44
45
46
# File 'lib/testimonials/configuration.rb', line 44

def questions
  @questions
end

#rate_limitObject

Per-IP throttle for the public endpoints, as keyword arguments for Rails' rate limiter (Rails 7.2+; ignored on 7.1). Read once when the controller loads — set it in an initializer. nil disables throttling.



91
92
93
# File 'lib/testimonials/configuration.rb', line 91

def rate_limit
  @rate_limit
end

#reprompt_afterObject

Auto-prompt throttling. A user who dismissed the widget is not auto-prompted again within reprompt_after; a user auto-prompted max_prompts times without submitting is never auto-prompted again; a user who submitted a testimonial is done for good. Explicit opens (clicking your link) always work.



60
61
62
# File 'lib/testimonials/configuration.rb', line 60

def reprompt_after
  @reprompt_after
end

#tenantObject

Resolve the current tenant (optional, for multi-tenant apps). Return an opaque key — a GlobalID, an id, a subdomain, a slug — or nil. Receives the request; shaped exactly like current_user/authorize_admin. nil (the default) is a single, global collection: today's behavior, unchanged. Testimonials, NPS, the dashboard and the read API all scope to whatever this returns. The recommended key is a GlobalID (record.to_gid.to_s), which also matches the has_testimonials model concern.



31
32
33
# File 'lib/testimonials/configuration.rb', line 31

def tenant
  @tenant
end

#user_displayObject

Turn a resolved user into the attribution stored with a submission. Return a hash with :name, :email, and optionally :title_company. Receives whatever #current_user returned.



36
37
38
# File 'lib/testimonials/configuration.rb', line 36

def user_display
  @user_display
end

#videoObject

Video testimonials (recording and upload). Requires Active Storage.



47
48
49
# File 'lib/testimonials/configuration.rb', line 47

def video
  @video
end

Instance Method Details

#avatars_enabled?Boolean

Returns:

  • (Boolean)


135
136
137
# File 'lib/testimonials/configuration.rb', line 135

def avatars_enabled?
  avatars && defined?(::ActiveStorage) ? true : false
end

#events_endpointObject



127
# File 'lib/testimonials/configuration.rb', line 127

def events_endpoint = "#{mount_path.chomp('/')}/events"

#nps_endpointObject



126
# File 'lib/testimonials/configuration.rb', line 126

def nps_endpoint = "#{mount_path.chomp('/')}/nps"

#testimonials_endpointObject



125
# File 'lib/testimonials/configuration.rb', line 125

def testimonials_endpoint = mount_path.chomp('/')

#video_enabled?Boolean

Video and avatars need Active Storage — both the config switch and the host actually having it loaded.

Returns:

  • (Boolean)


131
132
133
# File 'lib/testimonials/configuration.rb', line 131

def video_enabled?
  video && defined?(::ActiveStorage) ? true : false
end