lucid_intercom 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +12 -22
 - data/lib/lucid_intercom/attributes.rb +10 -42
 - data/lib/lucid_intercom/changed_plan_event.rb +31 -0
 - data/lib/lucid_intercom/company_attributes.rb +21 -0
 - data/lib/lucid_intercom/company_custom_attributes.rb +48 -0
 - data/lib/lucid_intercom/config.rb +44 -0
 - data/lib/lucid_intercom/convert.rb +32 -0
 - data/lib/lucid_intercom/{errors/error.rb → error.rb} +0 -0
 - data/lib/lucid_intercom/event.rb +77 -0
 - data/lib/lucid_intercom/installed_event.rb +31 -0
 - data/lib/lucid_intercom/post_request.rb +26 -0
 - data/lib/lucid_intercom/render_snippet.rb +28 -24
 - data/lib/lucid_intercom/response.rb +51 -0
 - data/lib/lucid_intercom/send_event.rb +22 -60
 - data/lib/lucid_intercom/snippet.html.erb +2 -14
 - data/lib/lucid_intercom/uninstalled_event.rb +27 -0
 - data/lib/lucid_intercom/update_user.rb +24 -54
 - data/lib/lucid_intercom/user_attributes.rb +47 -0
 - data/lib/lucid_intercom/version.rb +1 -1
 - data/lib/lucid_intercom.rb +18 -6
 - metadata +56 -16
 - data/lib/lucid_intercom/attributes/base.rb +0 -63
 - data/lib/lucid_intercom/attributes/company.rb +0 -22
 - data/lib/lucid_intercom/attributes/custom.rb +0 -47
 - data/lib/lucid_intercom/attributes/user.rb +0 -28
 - data/lib/lucid_intercom/credentials.rb +0 -35
 - data/lib/lucid_intercom/errors/missing_credentials_error.rb +0 -7
 - data/lib/lucid_intercom/errors/request_error.rb +0 -17
 - data/lib/lucid_intercom/errors.rb +0 -3
 - data/lib/lucid_intercom/events/base.rb +0 -23
 - data/lib/lucid_intercom/events/changed_plan.rb +0 -37
 - data/lib/lucid_intercom/events/installed.rb +0 -37
 - data/lib/lucid_intercom/events/uninstalled.rb +0 -33
 - data/lib/lucid_intercom/events.rb +0 -5
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 1a133b6b1ae95502c5f15501cd40ea84d155d7f703cccc56befe4a32500533d6
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 4e0b268ce267c890be6bbf61fc52f8bfbca449d37a45ee68a1db8db25f5be494
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 6b089504958e012d93ca00a847ced2243ee5c22fbe93e2395250898be6063726f5ba87d3b2a2fae48383a3214996e73fb4ccbbb9cd958d56a50cfaec1f898762
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 470849470d05d34ed775f382af97866684559fd9e0c0fdb95fdad207729f74dc0f6169cf6a6c2916fe2341c61c13d1ec39e7918787866a1aec2916f476bf6e64
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -14,7 +14,7 @@ Usage 
     | 
|
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
            ### Configure the default API credentials
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                LucidIntercom. 
     | 
| 
      
 17 
     | 
    
         
            +
                LucidIntercom.config = LucidIntercom::Config.new(
         
     | 
| 
       18 
18 
     | 
    
         
             
                  '...', # access_token
         
     | 
| 
       19 
19 
     | 
    
         
             
                  '...', # secret
         
     | 
| 
       20 
20 
     | 
    
         
             
                  '...', # app_id
         
     | 
| 
         @@ -23,13 +23,10 @@ Usage 
     | 
|
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
            Here, ‘app_prefix’ is the snakecased app name, e.g. ‘smart_order_tags’
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
            Alternatively, a credentials object may optionally be passed as a
         
     | 
| 
       27 
     | 
    
         
            -
            keyword argument to any of the classes listed below.
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
26 
     | 
    
         | 
| 
       30 
27 
     | 
    
         
             
            ### Render the browser snippet
         
     | 
| 
       31 
28 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
                LucidIntercom::RenderSnippet.new( 
     | 
| 
      
 29 
     | 
    
         
            +
                LucidIntercom::RenderSnippet.new.(shopify_data, app_data)
         
     | 
| 
       33 
30 
     | 
    
         | 
| 
       34 
31 
     | 
    
         
             
            This returns an HTML string which you can use in your view layout.
         
     | 
| 
       35 
32 
     | 
    
         | 
| 
         @@ -40,12 +37,14 @@ See the source code for documentation of arguments. 
     | 
|
| 
       40 
37 
     | 
    
         | 
| 
       41 
38 
     | 
    
         
             
            When a user installs/uninstalls the app, or changes their plan:
         
     | 
| 
       42 
39 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                LucidIntercom:: 
     | 
| 
       44 
     | 
    
         
            -
                LucidIntercom:: 
     | 
| 
       45 
     | 
    
         
            -
                LucidIntercom:: 
     | 
| 
      
 40 
     | 
    
         
            +
                event = LucidIntercom::InstalledEvent.new(shopify_data, new_plan)
         
     | 
| 
      
 41 
     | 
    
         
            +
                event = LucidIntercom::UninstalledEvent.new(shopify_data)
         
     | 
| 
      
 42 
     | 
    
         
            +
                event = LucidIntercom::ChangedPlanEvent.new(shopify_data, new_plan)
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                LucidIntercom::SendEvent.new.(event)
         
     | 
| 
       46 
45 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
            Note that the ` 
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
      
 46 
     | 
    
         
            +
            Note that the `shopify_data` hash for uninstalled events cannot be
         
     | 
| 
      
 47 
     | 
    
         
            +
            read from the API (as the access token is invalid at this stage).
         
     | 
| 
       49 
48 
     | 
    
         
             
            You should use the data hash provided with Shopify’s ‘app/uninstalled’
         
     | 
| 
       50 
49 
     | 
    
         
             
            webhook instead.
         
     | 
| 
       51 
50 
     | 
    
         | 
| 
         @@ -61,16 +60,7 @@ For free apps, use ‘free’. 
     | 
|
| 
       61 
60 
     | 
    
         
             
            For partner-friendly app installs, use ‘partner’.
         
     | 
| 
       62 
61 
     | 
    
         | 
| 
       63 
62 
     | 
    
         | 
| 
       64 
     | 
    
         
            -
            ###  
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
                LucidIntercom::SendEvent.new(shop_attributes).(event_name, event_metadata)
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
            See the source code for documentation of arguments.
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
            ### Update a user
         
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
                LucidIntercom::UpdateUser.new(shop_attributes, app_attributes).()
         
     | 
| 
      
 63 
     | 
    
         
            +
            ### Custom events
         
     | 
| 
       74 
64 
     | 
    
         | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
      
 65 
     | 
    
         
            +
            To define a custom event, subclass `LucidIntercom::Event`. See the
         
     | 
| 
      
 66 
     | 
    
         
            +
            source code for documentation.
         
     | 
| 
         @@ -1,57 +1,25 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            require 'lucid_intercom/ 
     | 
| 
      
 3 
     | 
    
         
            +
            require 'dry-initializer'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'lucid_intercom/convert'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            module LucidIntercom
         
     | 
| 
       8 
8 
     | 
    
         
             
              class Attributes
         
     | 
| 
       9 
     | 
    
         
            -
                 
     | 
| 
       10 
     | 
    
         
            -
                # @see LucidIntercom::Attributes::Base#initialize
         
     | 
| 
       11 
     | 
    
         
            -
                #
         
     | 
| 
       12 
     | 
    
         
            -
                def initialize(*args)
         
     | 
| 
       13 
     | 
    
         
            -
                  @args = args
         
     | 
| 
       14 
     | 
    
         
            -
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
                extend Dry::Initializer
         
     | 
| 
       15 
10 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
                #
         
     | 
| 
       17 
     | 
    
         
            -
                 
     | 
| 
       18 
     | 
    
         
            -
                #
         
     | 
| 
       19 
     | 
    
         
            -
                def user
         
     | 
| 
       20 
     | 
    
         
            -
                  user_browser.reject { |k, _| k == :user_hash }
         
     | 
| 
       21 
     | 
    
         
            -
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
                # @return [Hash] shop attributes as returned by the Shopify API
         
     | 
| 
      
 12 
     | 
    
         
            +
                param :shopify_data, reader: :private
         
     | 
| 
       22 
13 
     | 
    
         | 
| 
       23 
14 
     | 
    
         
             
                #
         
     | 
| 
       24 
     | 
    
         
            -
                #  
     | 
| 
       25 
     | 
    
         
            -
                #
         
     | 
| 
       26 
     | 
    
         
            -
                # @return [Hash]
         
     | 
| 
      
 15 
     | 
    
         
            +
                # @abstract
         
     | 
| 
       27 
16 
     | 
    
         
             
                #
         
     | 
| 
       28 
     | 
    
         
            -
                 
     | 
| 
       29 
     | 
    
         
            -
                  User.new(*@args).()
         
     | 
| 
       30 
     | 
    
         
            -
                end
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                #
         
     | 
| 
       33 
     | 
    
         
            -
                # @return [Hash]
         
     | 
| 
       34 
     | 
    
         
            -
                #
         
     | 
| 
       35 
     | 
    
         
            -
                def company
         
     | 
| 
       36 
     | 
    
         
            -
                  Company.new(*@args).()
         
     | 
| 
       37 
     | 
    
         
            -
                end
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                #
         
     | 
| 
       40 
     | 
    
         
            -
                # Company attributes for browser (expects 'id', not 'company_id').
         
     | 
| 
       41 
     | 
    
         
            -
                #
         
     | 
| 
       42 
     | 
    
         
            -
                # @return [Hash]
         
     | 
| 
       43 
     | 
    
         
            -
                #
         
     | 
| 
       44 
     | 
    
         
            -
                def company_browser
         
     | 
| 
       45 
     | 
    
         
            -
                  company2 = company
         
     | 
| 
       46 
     | 
    
         
            -
                  company2[:id] = company2.delete(:company_id)
         
     | 
| 
       47 
     | 
    
         
            -
                  company2
         
     | 
| 
       48 
     | 
    
         
            -
                end
         
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 17 
     | 
    
         
            +
                # @param convert [#call]
         
     | 
| 
       50 
18 
     | 
    
         
             
                #
         
     | 
| 
       51 
19 
     | 
    
         
             
                # @return [Hash]
         
     | 
| 
       52 
20 
     | 
    
         
             
                #
         
     | 
| 
       53 
     | 
    
         
            -
                def  
     | 
| 
       54 
     | 
    
         
            -
                   
     | 
| 
      
 21 
     | 
    
         
            +
                def to_h(convert: Convert.new)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  convert.({})
         
     | 
| 
       55 
23 
     | 
    
         
             
                end
         
     | 
| 
       56 
24 
     | 
    
         
             
              end
         
     | 
| 
       57 
25 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'lucid_intercom/event'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 6 
     | 
    
         
            +
              class ChangedPlanEvent < Event
         
     | 
| 
      
 7 
     | 
    
         
            +
                # @return [String, nil] e.g. 'free', or nil to unset
         
     | 
| 
      
 8 
     | 
    
         
            +
                param :new_plan
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                event :changed_plan
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                #
         
     | 
| 
      
 13 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 14 
     | 
    
         
            +
                #
         
     | 
| 
      
 15 
     | 
    
         
            +
                def event_metadata
         
     | 
| 
      
 16 
     | 
    
         
            +
                  {
         
     | 
| 
      
 17 
     | 
    
         
            +
                    company_id: company.to_h[:company_id],
         
     | 
| 
      
 18 
     | 
    
         
            +
                    new_plan: new_plan,
         
     | 
| 
      
 19 
     | 
    
         
            +
                  }
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                #
         
     | 
| 
      
 23 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 24 
     | 
    
         
            +
                #
         
     | 
| 
      
 25 
     | 
    
         
            +
                def app_data
         
     | 
| 
      
 26 
     | 
    
         
            +
                  {
         
     | 
| 
      
 27 
     | 
    
         
            +
                    plan: new_plan,
         
     | 
| 
      
 28 
     | 
    
         
            +
                  }
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'lucid_intercom/attributes'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 6 
     | 
    
         
            +
              class CompanyAttributes < Attributes
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @param browser [Boolean] format for browser snippet
         
     | 
| 
      
 9 
     | 
    
         
            +
                # @param convert [#call]
         
     | 
| 
      
 10 
     | 
    
         
            +
                #
         
     | 
| 
      
 11 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 12 
     | 
    
         
            +
                #
         
     | 
| 
      
 13 
     | 
    
         
            +
                def to_h(browser: false, convert: Convert.new)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  convert.({}.tap do |h|
         
     | 
| 
      
 15 
     | 
    
         
            +
                    h[browser ? :id : :company_id] = shopify_data['myshopify_domain']
         
     | 
| 
      
 16 
     | 
    
         
            +
                    h[:name] = shopify_data['name']
         
     | 
| 
      
 17 
     | 
    
         
            +
                    h[:plan] = shopify_data['plan_name']
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end)
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,48 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'lucid_intercom/attributes'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'lucid_intercom/config'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 7 
     | 
    
         
            +
              class CompanyCustomAttributes < Attributes
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @return [Hash] app attributes (unprefixed)
         
     | 
| 
      
 9 
     | 
    
         
            +
                param :app_data, reader: :private
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                #
         
     | 
| 
      
 12 
     | 
    
         
            +
                # @param convert [#call]
         
     | 
| 
      
 13 
     | 
    
         
            +
                #
         
     | 
| 
      
 14 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 15 
     | 
    
         
            +
                #
         
     | 
| 
      
 16 
     | 
    
         
            +
                def to_h(convert: Convert.new)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  convert.(shopify.merge(app))
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                #
         
     | 
| 
      
 21 
     | 
    
         
            +
                # These attributes are prefixed with 'merchant_' to distinguish them from
         
     | 
| 
      
 22 
     | 
    
         
            +
                # the Shopify intergration's 'shopify_' prefix.
         
     | 
| 
      
 23 
     | 
    
         
            +
                #
         
     | 
| 
      
 24 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 25 
     | 
    
         
            +
                #
         
     | 
| 
      
 26 
     | 
    
         
            +
                private def shopify
         
     | 
| 
      
 27 
     | 
    
         
            +
                  {
         
     | 
| 
      
 28 
     | 
    
         
            +
                    merchant_domain: shopify_data['domain'],
         
     | 
| 
      
 29 
     | 
    
         
            +
                    merchant_myshopify_domain: shopify_data['myshopify_domain'],
         
     | 
| 
      
 30 
     | 
    
         
            +
                    merchant_shop_owner: shopify_data['shop_owner'],
         
     | 
| 
      
 31 
     | 
    
         
            +
                    merchant_timezone: shopify_data['timezone'],
         
     | 
| 
      
 32 
     | 
    
         
            +
                  }
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                #
         
     | 
| 
      
 36 
     | 
    
         
            +
                # Any app-specific attributes.
         
     | 
| 
      
 37 
     | 
    
         
            +
                #
         
     | 
| 
      
 38 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 39 
     | 
    
         
            +
                #
         
     | 
| 
      
 40 
     | 
    
         
            +
                private def app
         
     | 
| 
      
 41 
     | 
    
         
            +
                  prefix = LucidIntercom.app_prefix
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  app_data.each_with_object({}) do |(k, v), h|
         
     | 
| 
      
 44 
     | 
    
         
            +
                    h["#{prefix}_#{k}"] = v
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,44 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'dry-initializer'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'forwardable'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'lucid_intercom/error'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 9 
     | 
    
         
            +
              NotConfiguredError = Class.new(Error)
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              class << self
         
     | 
| 
      
 12 
     | 
    
         
            +
                extend Forwardable
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                # TODO: *Config.dry_initializer.attributes (version 2.0.0+)
         
     | 
| 
      
 15 
     | 
    
         
            +
                def_delegators :config, :access_token, :secret, :app_id, :app_prefix
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                # @param config [Config]
         
     | 
| 
      
 18 
     | 
    
         
            +
                attr_writer :config
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                #
         
     | 
| 
      
 21 
     | 
    
         
            +
                # @return [Config]
         
     | 
| 
      
 22 
     | 
    
         
            +
                #
         
     | 
| 
      
 23 
     | 
    
         
            +
                # @raise [NotConfiguredError] if config is unset
         
     | 
| 
      
 24 
     | 
    
         
            +
                #
         
     | 
| 
      
 25 
     | 
    
         
            +
                def config
         
     | 
| 
      
 26 
     | 
    
         
            +
                  raise LucidIntercom::NotConfiguredError unless @config
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  @config
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              class Config
         
     | 
| 
      
 33 
     | 
    
         
            +
                extend Dry::Initializer
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                # @return [String]
         
     | 
| 
      
 36 
     | 
    
         
            +
                param :access_token
         
     | 
| 
      
 37 
     | 
    
         
            +
                # @return [String]
         
     | 
| 
      
 38 
     | 
    
         
            +
                param :secret
         
     | 
| 
      
 39 
     | 
    
         
            +
                # @return [String]
         
     | 
| 
      
 40 
     | 
    
         
            +
                param :app_id
         
     | 
| 
      
 41 
     | 
    
         
            +
                # @return [String] the snakecased app name, e.g. 'smart_order_tags'
         
     | 
| 
      
 42 
     | 
    
         
            +
                param :app_prefix
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 4 
     | 
    
         
            +
              class Convert
         
     | 
| 
      
 5 
     | 
    
         
            +
                #
         
     | 
| 
      
 6 
     | 
    
         
            +
                # @param attributes [Hash]
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 9 
     | 
    
         
            +
                #
         
     | 
| 
      
 10 
     | 
    
         
            +
                def call(attributes)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  attributes.each_with_object({}) do |(k, obj), h|
         
     | 
| 
      
 12 
     | 
    
         
            +
                    h[k] = convert(obj)
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                #
         
     | 
| 
      
 17 
     | 
    
         
            +
                # @param obj [Object]
         
     | 
| 
      
 18 
     | 
    
         
            +
                #
         
     | 
| 
      
 19 
     | 
    
         
            +
                # @return [Object] a valid Intercom type
         
     | 
| 
      
 20 
     | 
    
         
            +
                #
         
     | 
| 
      
 21 
     | 
    
         
            +
                private def convert(obj)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  case obj
         
     | 
| 
      
 23 
     | 
    
         
            +
                  when Numeric, nil # nil to unset
         
     | 
| 
      
 24 
     | 
    
         
            +
                    obj
         
     | 
| 
      
 25 
     | 
    
         
            +
                  when Time
         
     | 
| 
      
 26 
     | 
    
         
            +
                    obj.to_i
         
     | 
| 
      
 27 
     | 
    
         
            +
                  else
         
     | 
| 
      
 28 
     | 
    
         
            +
                    obj.to_s
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
| 
         
            File without changes
         
     | 
| 
         @@ -0,0 +1,77 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'lucid_intercom/company_attributes'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'lucid_intercom/company_custom_attributes'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'lucid_intercom/config'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'lucid_intercom/user_attributes'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 9 
     | 
    
         
            +
              class Event
         
     | 
| 
      
 10 
     | 
    
         
            +
                extend Dry::Initializer
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                # @return [Hash] shop attributes as returned by the Shopify API
         
     | 
| 
      
 13 
     | 
    
         
            +
                param :shopify_data
         
     | 
| 
      
 14 
     | 
    
         
            +
                # @return [CompanyAttributes]
         
     | 
| 
      
 15 
     | 
    
         
            +
                option :company, default: proc { CompanyAttributes.new(shopify_data) }
         
     | 
| 
      
 16 
     | 
    
         
            +
                # @return [CompanyCustomAttributes]
         
     | 
| 
      
 17 
     | 
    
         
            +
                option :company_custom, default: proc { CompanyCustomAttributes.new(shopify_data, app_data) }
         
     | 
| 
      
 18 
     | 
    
         
            +
                # @return [UserAttributes]
         
     | 
| 
      
 19 
     | 
    
         
            +
                option :user, default: proc { UserAttributes.new(shopify_data) }
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                #
         
     | 
| 
      
 22 
     | 
    
         
            +
                # Set the event name for the subclass.
         
     | 
| 
      
 23 
     | 
    
         
            +
                #
         
     | 
| 
      
 24 
     | 
    
         
            +
                # @param event_name [String, #to_s]
         
     | 
| 
      
 25 
     | 
    
         
            +
                #
         
     | 
| 
      
 26 
     | 
    
         
            +
                # @example
         
     | 
| 
      
 27 
     | 
    
         
            +
                #   event :changed_plan
         
     | 
| 
      
 28 
     | 
    
         
            +
                #
         
     | 
| 
      
 29 
     | 
    
         
            +
                def self.event(event_name)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  define_method(:event_name) do
         
     | 
| 
      
 31 
     | 
    
         
            +
                    "#{LucidIntercom.app_prefix}_#{event_name}"
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                #
         
     | 
| 
      
 36 
     | 
    
         
            +
                # @abstract
         
     | 
| 
      
 37 
     | 
    
         
            +
                #
         
     | 
| 
      
 38 
     | 
    
         
            +
                # @return [String]
         
     | 
| 
      
 39 
     | 
    
         
            +
                #
         
     | 
| 
      
 40 
     | 
    
         
            +
                def event_name
         
     | 
| 
      
 41 
     | 
    
         
            +
                  raise NotImplementedError
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                #
         
     | 
| 
      
 45 
     | 
    
         
            +
                # @abstract
         
     | 
| 
      
 46 
     | 
    
         
            +
                #
         
     | 
| 
      
 47 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 48 
     | 
    
         
            +
                #
         
     | 
| 
      
 49 
     | 
    
         
            +
                def event_metadata
         
     | 
| 
      
 50 
     | 
    
         
            +
                  raise NotImplementedError
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                #
         
     | 
| 
      
 54 
     | 
    
         
            +
                # Additional custom attributes related to the event (unprefixed).
         
     | 
| 
      
 55 
     | 
    
         
            +
                #
         
     | 
| 
      
 56 
     | 
    
         
            +
                # @example
         
     | 
| 
      
 57 
     | 
    
         
            +
                #   {plan: 'free'}
         
     | 
| 
      
 58 
     | 
    
         
            +
                #
         
     | 
| 
      
 59 
     | 
    
         
            +
                # @example
         
     | 
| 
      
 60 
     | 
    
         
            +
                #   {plan: nil}
         
     | 
| 
      
 61 
     | 
    
         
            +
                #
         
     | 
| 
      
 62 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 63 
     | 
    
         
            +
                #
         
     | 
| 
      
 64 
     | 
    
         
            +
                def app_data
         
     | 
| 
      
 65 
     | 
    
         
            +
                  {}
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                #
         
     | 
| 
      
 69 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 70 
     | 
    
         
            +
                #
         
     | 
| 
      
 71 
     | 
    
         
            +
                def user_id
         
     | 
| 
      
 72 
     | 
    
         
            +
                  {
         
     | 
| 
      
 73 
     | 
    
         
            +
                    user.id_key => user.id,
         
     | 
| 
      
 74 
     | 
    
         
            +
                  }
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
              end
         
     | 
| 
      
 77 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'lucid_intercom/event'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 6 
     | 
    
         
            +
              class InstalledEvent < Event
         
     | 
| 
      
 7 
     | 
    
         
            +
                # @return [String] e.g. 'free'
         
     | 
| 
      
 8 
     | 
    
         
            +
                param :new_plan
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                event :installed
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                #
         
     | 
| 
      
 13 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 14 
     | 
    
         
            +
                #
         
     | 
| 
      
 15 
     | 
    
         
            +
                def event_metadata
         
     | 
| 
      
 16 
     | 
    
         
            +
                  {
         
     | 
| 
      
 17 
     | 
    
         
            +
                    company_id: company.to_h[:company_id],
         
     | 
| 
      
 18 
     | 
    
         
            +
                    new_plan: new_plan,
         
     | 
| 
      
 19 
     | 
    
         
            +
                  }
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                #
         
     | 
| 
      
 23 
     | 
    
         
            +
                # @return [Hash]
         
     | 
| 
      
 24 
     | 
    
         
            +
                #
         
     | 
| 
      
 25 
     | 
    
         
            +
                def app_data
         
     | 
| 
      
 26 
     | 
    
         
            +
                  {
         
     | 
| 
      
 27 
     | 
    
         
            +
                    plan: new_plan,
         
     | 
| 
      
 28 
     | 
    
         
            +
                  }
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'http'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'lucid_intercom/config'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'lucid_intercom/response'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 9 
     | 
    
         
            +
              class PostRequest
         
     | 
| 
      
 10 
     | 
    
         
            +
                #
         
     | 
| 
      
 11 
     | 
    
         
            +
                # @param path [String] path relative to the domain
         
     | 
| 
      
 12 
     | 
    
         
            +
                # @param data [Hash]
         
     | 
| 
      
 13 
     | 
    
         
            +
                #
         
     | 
| 
      
 14 
     | 
    
         
            +
                # @return [Response]
         
     | 
| 
      
 15 
     | 
    
         
            +
                #
         
     | 
| 
      
 16 
     | 
    
         
            +
                def call(path, data)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  res = HTTP.headers(
         
     | 
| 
      
 18 
     | 
    
         
            +
                    'Authorization' => "Bearer #{LucidIntercom.access_token}",
         
     | 
| 
      
 19 
     | 
    
         
            +
                    'Accept' => 'application/json',
         
     | 
| 
      
 20 
     | 
    
         
            +
                    'Content-Type' => 'application/json'
         
     | 
| 
      
 21 
     | 
    
         
            +
                  ).post("https://api.intercom.io/#{path}", json: data)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  Response.new(res.code)
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,46 +1,50 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            require 'erb'
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            require 'lucid_intercom/ 
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'lucid_intercom/config'
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            module LucidIntercom
         
     | 
| 
       8 
8 
     | 
    
         
             
              class RenderSnippet
         
     | 
| 
       9 
9 
     | 
    
         
             
                TEMPLATE = ERB.new(File.read("#{__dir__}/snippet.html.erb")).freeze
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                #
         
     | 
| 
       12 
     | 
    
         
            -
                #  
     | 
| 
       13 
     | 
    
         
            -
                #
         
     | 
| 
       14 
     | 
    
         
            -
                # @param credentials [LucidIntercom::Credentials]
         
     | 
| 
      
 12 
     | 
    
         
            +
                # @param shopify_data [Hash] shop attributes as returned by the Shopify API
         
     | 
| 
      
 13 
     | 
    
         
            +
                # @param app_data [Hash] app attributes (unprefixed)
         
     | 
| 
       15 
14 
     | 
    
         
             
                #
         
     | 
| 
       16 
     | 
    
         
            -
                # @ 
     | 
| 
      
 15 
     | 
    
         
            +
                # @example Unauthenticated visitor
         
     | 
| 
      
 16 
     | 
    
         
            +
                #   render_snippet.()
         
     | 
| 
       17 
17 
     | 
    
         
             
                #
         
     | 
| 
       18 
     | 
    
         
            -
                 
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                  @attributes = Attributes.new(shop_attributes, app_attributes, credentials) if shop_attributes.empty?
         
     | 
| 
       21 
     | 
    
         
            -
                end
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                # @return [LucidIntercom::Attributes]
         
     | 
| 
       24 
     | 
    
         
            -
                attr_reader :attributes
         
     | 
| 
       25 
     | 
    
         
            -
                # @return [LucidIntercom::Credentials]
         
     | 
| 
       26 
     | 
    
         
            -
                attr_reader :credentials
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
                # @example
         
     | 
| 
      
 19 
     | 
    
         
            +
                #   render_snippet.(shopify_data, app_data)
         
     | 
| 
       28 
20 
     | 
    
         
             
                #
         
     | 
| 
       29 
     | 
    
         
            -
                # @return [String] 
     | 
| 
      
 21 
     | 
    
         
            +
                # @return [String]
         
     | 
| 
       30 
22 
     | 
    
         
             
                #
         
     | 
| 
       31 
     | 
    
         
            -
                def call
         
     | 
| 
      
 23 
     | 
    
         
            +
                def call(shopify_data = {}, app_data = {})
         
     | 
| 
      
 24 
     | 
    
         
            +
                  company = CompanyAttributes.new(shopify_data).to_h(browser: true)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  company_custom = CompanyCustomAttributes.new(shopify_data, app_data).to_h
         
     | 
| 
      
 26 
     | 
    
         
            +
                  user = UserAttributes.new(shopify_data).to_h(browser: true)
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
       32 
28 
     | 
    
         
             
                  TEMPLATE.result(binding)
         
     | 
| 
       33 
29 
     | 
    
         
             
                end
         
     | 
| 
       34 
30 
     | 
    
         | 
| 
       35 
31 
     | 
    
         
             
                #
         
     | 
| 
       36 
     | 
    
         
            -
                # Quote and escape a value for  
     | 
| 
      
 32 
     | 
    
         
            +
                # Quote and escape a value for JavaScript.
         
     | 
| 
       37 
33 
     | 
    
         
             
                #
         
     | 
| 
       38 
     | 
    
         
            -
                 
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                 
     | 
| 
      
 34 
     | 
    
         
            +
                # @param obj [Object]
         
     | 
| 
      
 35 
     | 
    
         
            +
                #
         
     | 
| 
      
 36 
     | 
    
         
            +
                # @return [Object]
         
     | 
| 
      
 37 
     | 
    
         
            +
                #
         
     | 
| 
      
 38 
     | 
    
         
            +
                def escape(obj)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  return obj unless obj.is_a?(String)
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  s = obj.gsub(/./) do |c|
         
     | 
| 
      
 42 
     | 
    
         
            +
                    return c unless %w(" ' / < > \\).include?(c)
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    "\\#{c}"
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
       41 
46 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                  %w(" ' / < > \\).include?(c) ? '\%s' % c : c
         
     | 
| 
      
 47 
     | 
    
         
            +
                  "\"#{s}\""
         
     | 
| 
       44 
48 
     | 
    
         
             
                end
         
     | 
| 
       45 
49 
     | 
    
         
             
              end
         
     | 
| 
       46 
50 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'dry-initializer'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'lucid_intercom/error'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module LucidIntercom
         
     | 
| 
      
 8 
     | 
    
         
            +
              class Response
         
     | 
| 
      
 9 
     | 
    
         
            +
                #
         
     | 
| 
      
 10 
     | 
    
         
            +
                # @abstract
         
     | 
| 
      
 11 
     | 
    
         
            +
                #
         
     | 
| 
      
 12 
     | 
    
         
            +
                class Error < LucidIntercom::Error
         
     | 
| 
      
 13 
     | 
    
         
            +
                  extend Dry::Initializer
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  # @return [Integer]
         
     | 
| 
      
 16 
     | 
    
         
            +
                  param :status_code
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  #
         
     | 
| 
      
 19 
     | 
    
         
            +
                  # @return [String]
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #
         
     | 
| 
      
 21 
     | 
    
         
            +
                  def message
         
     | 
| 
      
 22 
     | 
    
         
            +
                    "bad response (#{status_code})"
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                ClientError = Class.new(Error)
         
     | 
| 
      
 27 
     | 
    
         
            +
                ServerError = Class.new(Error)
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                extend Dry::Initializer
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                # @return [Integer]
         
     | 
| 
      
 32 
     | 
    
         
            +
                param :status_code
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                #
         
     | 
| 
      
 35 
     | 
    
         
            +
                # @return [Boolean]
         
     | 
| 
      
 36 
     | 
    
         
            +
                #
         
     | 
| 
      
 37 
     | 
    
         
            +
                # @raise [ClientError] for status 4xx
         
     | 
| 
      
 38 
     | 
    
         
            +
                # @raise [ServerError] for status 5xx
         
     | 
| 
      
 39 
     | 
    
         
            +
                #
         
     | 
| 
      
 40 
     | 
    
         
            +
                def assert!
         
     | 
| 
      
 41 
     | 
    
         
            +
                  case status_code
         
     | 
| 
      
 42 
     | 
    
         
            +
                  when 400..499
         
     | 
| 
      
 43 
     | 
    
         
            +
                    raise ClientError.new(status_code)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  when 500..599
         
     | 
| 
      
 45 
     | 
    
         
            +
                    raise ServerError.new(status_code)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  true
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,80 +1,42 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require ' 
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            require ' 
     | 
| 
       6 
     | 
    
         
            -
            require 'lucid_intercom/attributes'
         
     | 
| 
       7 
     | 
    
         
            -
            require 'lucid_intercom/credentials'
         
     | 
| 
       8 
     | 
    
         
            -
            require 'lucid_intercom/errors'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'dry-initializer'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require 'lucid_intercom/post_request'
         
     | 
| 
       9 
6 
     | 
    
         | 
| 
       10 
7 
     | 
    
         
             
            module LucidIntercom
         
     | 
| 
       11 
8 
     | 
    
         
             
              class SendEvent
         
     | 
| 
       12 
     | 
    
         
            -
                 
     | 
| 
       13 
     | 
    
         
            -
                # @param shop_attributes [Hash] shop attributes in format returned by the Shopify API
         
     | 
| 
       14 
     | 
    
         
            -
                # @param credentials [LucidIntercom::Credentials]
         
     | 
| 
       15 
     | 
    
         
            -
                #
         
     | 
| 
       16 
     | 
    
         
            -
                def initialize(shop_attributes, credentials = LucidIntercom.credentials)
         
     | 
| 
       17 
     | 
    
         
            -
                  @attributes = Attributes.new(shop_attributes, {}, credentials)
         
     | 
| 
       18 
     | 
    
         
            -
                  @credentials = credentials
         
     | 
| 
       19 
     | 
    
         
            -
                end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                # @return [LucidIntercom::Attributes]
         
     | 
| 
       22 
     | 
    
         
            -
                attr_reader :attributes
         
     | 
| 
       23 
     | 
    
         
            -
                # @return [LucidIntercom::Credentials]
         
     | 
| 
       24 
     | 
    
         
            -
                attr_reader :credentials
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                #
         
     | 
| 
       27 
     | 
    
         
            -
                # Send event for user identified by attributes.
         
     | 
| 
       28 
     | 
    
         
            -
                #
         
     | 
| 
       29 
     | 
    
         
            -
                # @param event_name [String]
         
     | 
| 
       30 
     | 
    
         
            -
                # @param event_metadata [Hash]
         
     | 
| 
       31 
     | 
    
         
            -
                #
         
     | 
| 
       32 
     | 
    
         
            -
                # @raise [LucidIntercom::RequestError] if the response status >= 400
         
     | 
| 
       33 
     | 
    
         
            -
                #
         
     | 
| 
       34 
     | 
    
         
            -
                def call(event_name, event_metadata)
         
     | 
| 
       35 
     | 
    
         
            -
                  res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
         
     | 
| 
       36 
     | 
    
         
            -
                    http.request(req, data(event_name, event_metadata))
         
     | 
| 
       37 
     | 
    
         
            -
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
                extend Dry::Initializer
         
     | 
| 
       38 
10 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                  end
         
     | 
| 
       44 
     | 
    
         
            -
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
                # @return [PostRequest]
         
     | 
| 
      
 12 
     | 
    
         
            +
                option :post_request, default: proc { PostRequest.new }
         
     | 
| 
      
 13 
     | 
    
         
            +
                # @return [UpdateUser]
         
     | 
| 
      
 14 
     | 
    
         
            +
                option :update_user, default: proc { UpdateUser.new }
         
     | 
| 
       45 
15 
     | 
    
         | 
| 
       46 
16 
     | 
    
         
             
                #
         
     | 
| 
       47 
     | 
    
         
            -
                # @ 
     | 
| 
      
 17 
     | 
    
         
            +
                # @param event [Events::Event]
         
     | 
| 
       48 
18 
     | 
    
         
             
                #
         
     | 
| 
       49 
     | 
    
         
            -
                 
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
                end
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
      
 19 
     | 
    
         
            +
                # @raise [Response::ClientError] for status 4xx
         
     | 
| 
      
 20 
     | 
    
         
            +
                # @raise [Response::ServerError] for status 5xx
         
     | 
| 
       53 
21 
     | 
    
         
             
                #
         
     | 
| 
       54 
     | 
    
         
            -
                 
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                private def req
         
     | 
| 
       57 
     | 
    
         
            -
                  req = Net::HTTP::Post.new(uri)
         
     | 
| 
       58 
     | 
    
         
            -
                  req['Authorization'] = "Bearer #{credentials.access_token}"
         
     | 
| 
       59 
     | 
    
         
            -
                  req['Content-Type'] = 'application/json'
         
     | 
| 
      
 22 
     | 
    
         
            +
                def call(event)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  post_request.('events', data(event)).assert!
         
     | 
| 
       60 
24 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
                   
     | 
| 
      
 25 
     | 
    
         
            +
                  update_user.(event)
         
     | 
| 
       62 
26 
     | 
    
         
             
                end
         
     | 
| 
       63 
27 
     | 
    
         | 
| 
       64 
28 
     | 
    
         
             
                #
         
     | 
| 
       65 
     | 
    
         
            -
                # @param  
     | 
| 
       66 
     | 
    
         
            -
                # @param event_metadata [Hash]
         
     | 
| 
      
 29 
     | 
    
         
            +
                # @param event [Events::Event]
         
     | 
| 
       67 
30 
     | 
    
         
             
                #
         
     | 
| 
       68 
31 
     | 
    
         
             
                # @return [Hash]
         
     | 
| 
       69 
32 
     | 
    
         
             
                #
         
     | 
| 
       70 
     | 
    
         
            -
                private def data( 
     | 
| 
       71 
     | 
    
         
            -
                   
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
                  event.to_json
         
     | 
| 
      
 33 
     | 
    
         
            +
                private def data(event)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  {
         
     | 
| 
      
 35 
     | 
    
         
            +
                    **event.user_id,
         
     | 
| 
      
 36 
     | 
    
         
            +
                    event_name: event.event_name,
         
     | 
| 
      
 37 
     | 
    
         
            +
                    created_at: Time.now.utc.to_i,
         
     | 
| 
      
 38 
     | 
    
         
            +
                    metadata: event.event_metadata,
         
     | 
| 
      
 39 
     | 
    
         
            +
                  }
         
     | 
| 
       78 
40 
     | 
    
         
             
                end
         
     | 
| 
       79 
41 
     | 
    
         
             
              end
         
     | 
| 
       80 
42 
     | 
    
         
             
            end
         
     |