refer 1.0.3 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 50ca34096a7a905dd43530303e7fec15fb2f15286dfeb233366c39dd5ea82804
4
- data.tar.gz: 72b072e68a0d46d19bcb3541863e0b1c0344b73e4a2687dd59beb649448fb9e8
3
+ metadata.gz: 20a30a9135827cc25dc86ab2d399162e63817f1cbb063a05414b23296d9aa8d6
4
+ data.tar.gz: 23f345dec5970fcfabbbf298de2bfa65ad963218aae53d49f0703e856cb834b1
5
5
  SHA512:
6
- metadata.gz: ad12178a8266cd2b5a979a57d9c210712972a01c092a92fd2e5aafb089550f9004dbaca9237bde9b473cefe758a9eec5bbc8398ecc6129fabf806ae44886bf4c
7
- data.tar.gz: 1d95e4601ff92a4207254998ad5aacb6720759f5acae1e41cef1b7dae8fee28b5f07fe12241a46dc929416a50c37751695df1cff8b5973eb9f72f7254f1e7567
6
+ metadata.gz: da6f63c3cfc32730d3bcaeab604861e2f5b6581306c3ab9806b83264f99145b3e5b34b822d065336b39ab4e22b7efb7926a613aac626f564f1fe494557d8ccb3
7
+ data.tar.gz: 0cdf66d6870970330a36b51e9a2bfa316a2175260779bac3eedfe262b6edd07dac3519ff57302a919f126078bf4ec82321771f5eca797d9b656359d69ffde1b8
data/Rakefile CHANGED
@@ -3,6 +3,4 @@ require "bundler/setup"
3
3
  APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
4
  load "rails/tasks/engine.rake"
5
5
 
6
- load "rails/tasks/statistics.rake"
7
-
8
6
  require "bundler/gem_tasks"
@@ -1,26 +1,21 @@
1
1
  module Refer
2
2
  class Referral < ApplicationRecord
3
- belongs_to :referrer, polymorphic: true
3
+ belongs_to :referrer, polymorphic: true, default: -> { referral_code&.referrer }
4
4
  belongs_to :referee, polymorphic: true
5
5
  belongs_to :referral_code, optional: true, counter_cache: true
6
6
 
7
7
  scope :completed, -> { where.not(completed_at: nil) }
8
8
 
9
- before_validation do
10
- self.referrer = referral_code&.referrer
11
- end
12
-
13
9
  validate :ensure_not_self_referral
14
10
 
11
+ after_update_commit -> { Refer.referral_completed&.call(self) }, if: -> { saved_change_to_completed_at? && completed_at? }
12
+
15
13
  def ensure_not_self_referral
16
14
  errors.add(:base, "Self-referrals are not allowed") if referrer == referee
17
15
  end
18
16
 
19
17
  def complete!(**attributes)
20
- return if completed_at?
21
-
22
- update attributes.with_defaults(completed_at: Time.current)
23
- Refer.referral_completed&.call(self)
18
+ update(attributes.with_defaults(completed_at: Time.current)) unless completed_at?
24
19
  end
25
20
  end
26
21
  end
@@ -0,0 +1,6 @@
1
+ class AddUniqueIndexToReferReferralsReferee < ActiveRecord::Migration[7.1]
2
+ def change
3
+ remove_index :refer_referrals, [ :referee_type, :referee_id ]
4
+ add_index :refer_referrals, [ :referee_type, :referee_id ], unique: true
5
+ end
6
+ end
@@ -16,7 +16,7 @@ module Refer
16
16
 
17
17
  def set_refer_cookie(param_name: Refer.param_name, cookie_name: Refer.cookie_name, code: nil, track_visit: Refer.track_visits)
18
18
  code ||= params[param_name]
19
- return if code.blank?
19
+ return unless code.is_a?(String) && code.present?
20
20
 
21
21
  cookies[cookie_name] = Refer.cookie(code) if Refer.overwrite_cookie || cookies[cookie_name].blank?
22
22
  ReferralCode.find_by(code: code)&.track_visit(request) if track_visit
data/lib/refer/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Refer
2
- VERSION = "1.0.3"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/refer.rb CHANGED
@@ -1,25 +1,26 @@
1
1
  require "refer/version"
2
2
  require "refer/engine"
3
+ require "ipaddr"
3
4
  require "securerandom"
4
5
 
5
6
  module Refer
6
- include ActiveSupport::Configurable
7
-
8
7
  autoload :Controller, "refer/controller"
9
8
  autoload :HasReferrals, "refer/has_referrals"
10
9
  autoload :Model, "refer/model"
11
10
 
12
- config_accessor :code_generator, default: ->(referrer) { SecureRandom.alphanumeric(8) }
13
- config_accessor :cookie_length, default: 30.days
14
- config_accessor :cookie_name, default: :refer_code
15
- config_accessor :param_name, default: :ref
16
- config_accessor :overwrite_cookie, default: true
17
- config_accessor :track_visits, default: true
18
- config_accessor :mask_ips, default: true
19
- config_accessor :referral_completed
11
+ mattr_accessor :code_generator, default: ->(referrer) { SecureRandom.alphanumeric(8) }
12
+ mattr_accessor :cookie_length, default: 30.days
13
+ mattr_accessor :cookie_name, default: :refer_code
14
+ mattr_accessor :param_name, default: :ref
15
+ mattr_accessor :overwrite_cookie, default: true
16
+ mattr_accessor :track_visits, default: true
17
+ mattr_accessor :mask_ips, default: true
18
+ mattr_accessor :referral_completed
20
19
 
21
20
  class Error < StandardError; end
22
- class AlreadyReferred < Error; end
21
+ class AlreadyReferred < Error
22
+ def initialize(referee) = super("#{referee} has already been referred")
23
+ end
23
24
 
24
25
  def self.referred?(referee)
25
26
  Referral.where(referee: referee).exists?
@@ -28,11 +29,15 @@ module Refer
28
29
  def self.refer(code:, referee:)
29
30
  return if referred?(referee)
30
31
  ReferralCode.find_by(code: code)&.referrals&.create(referee: referee)
32
+ rescue ActiveRecord::RecordNotUnique
33
+ nil
31
34
  end
32
35
 
33
36
  def self.refer!(code:, referee:)
34
- raise AlreadyReferred, "#{referee} has already been referred" if referred?(referee)
37
+ raise AlreadyReferred, referee if referred?(referee)
35
38
  ReferralCode.find_by!(code: code).referrals.create!(referee: referee)
39
+ rescue ActiveRecord::RecordNotUnique
40
+ raise AlreadyReferred, referee
36
41
  end
37
42
 
38
43
  def self.cookie(code)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: refer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Oliver
@@ -41,6 +41,7 @@ files:
41
41
  - db/migrate/20240611180738_create_refer_referrals.rb
42
42
  - db/migrate/20240611183349_create_refer_referral_codes.rb
43
43
  - db/migrate/20240701172643_create_refer_visits.rb
44
+ - db/migrate/20261007000000_add_unique_index_to_refer_referrals_referee.rb
44
45
  - lib/generators/refer/install/USAGE
45
46
  - lib/generators/refer/install/install_generator.rb
46
47
  - lib/generators/refer/model/USAGE
@@ -73,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
74
  - !ruby/object:Gem::Version
74
75
  version: '0'
75
76
  requirements: []
76
- rubygems_version: 3.6.8
77
+ rubygems_version: 4.0.20
77
78
  specification_version: 4
78
79
  summary: Referral codes & affiliate links for Ruby on Rails apps
79
80
  test_files: []