refer 1.0.4 → 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: 91e18770d147ea9f2fea478624dd409e4b22d3f656fb8b2a48ba370cbc9c0985
4
- data.tar.gz: d57ac0f354306e11941261661a3c468314bc9e8df17186840c9c60515e8a06c2
3
+ metadata.gz: 20a30a9135827cc25dc86ab2d399162e63817f1cbb063a05414b23296d9aa8d6
4
+ data.tar.gz: 23f345dec5970fcfabbbf298de2bfa65ad963218aae53d49f0703e856cb834b1
5
5
  SHA512:
6
- metadata.gz: d1bf9dfadefbb59da1bcbae9de04a546ef4a9b38d1bd828bb96ff537ce3dc73194c54a23647f3529ff81ee474e0d78a49a8a9ae26d335dd2da6272acf9154dbd
7
- data.tar.gz: 632b1254ae1678221cdee7edd9f174f5209f0b02b024f9f37b829053cfd0ca63b512f188c7507707974246a438271409fe9cbfa4b644eb6b863fa6684477e013
6
+ metadata.gz: da6f63c3cfc32730d3bcaeab604861e2f5b6581306c3ab9806b83264f99145b3e5b34b822d065336b39ab4e22b7efb7926a613aac626f564f1fe494557d8ccb3
7
+ data.tar.gz: 0cdf66d6870970330a36b51e9a2bfa316a2175260779bac3eedfe262b6edd07dac3519ff57302a919f126078bf4ec82321771f5eca797d9b656359d69ffde1b8
@@ -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.4"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/refer.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "refer/version"
2
2
  require "refer/engine"
3
+ require "ipaddr"
3
4
  require "securerandom"
4
5
 
5
6
  module Refer
@@ -17,7 +18,9 @@ module Refer
17
18
  mattr_accessor :referral_completed
18
19
 
19
20
  class Error < StandardError; end
20
- class AlreadyReferred < Error; end
21
+ class AlreadyReferred < Error
22
+ def initialize(referee) = super("#{referee} has already been referred")
23
+ end
21
24
 
22
25
  def self.referred?(referee)
23
26
  Referral.where(referee: referee).exists?
@@ -26,11 +29,15 @@ module Refer
26
29
  def self.refer(code:, referee:)
27
30
  return if referred?(referee)
28
31
  ReferralCode.find_by(code: code)&.referrals&.create(referee: referee)
32
+ rescue ActiveRecord::RecordNotUnique
33
+ nil
29
34
  end
30
35
 
31
36
  def self.refer!(code:, referee:)
32
- raise AlreadyReferred, "#{referee} has already been referred" if referred?(referee)
37
+ raise AlreadyReferred, referee if referred?(referee)
33
38
  ReferralCode.find_by!(code: code).referrals.create!(referee: referee)
39
+ rescue ActiveRecord::RecordNotUnique
40
+ raise AlreadyReferred, referee
34
41
  end
35
42
 
36
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.4
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.7.2
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: []