referral_box 0.1.1 → 0.1.3
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/CHANGELOG.md +19 -0
- data/lib/generators/referral_box/install/install_generator.rb +102 -13
- data/lib/generators/referral_box/install/templates/initializer.rb +2 -1
- data/lib/referral_box/version.rb +1 -1
- metadata +37 -14
- data/lib/generators/referral_box/install/templates/user_model.rb +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf16b9679f6e24b2be6b829656425f355ffd2e66bbbdf7fbc2ccc6054848d4c3
|
4
|
+
data.tar.gz: c3ef398f59824859c6397c25fa5a6e19f67331e100b746cb22b766d7ce9c4656
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3eb0fcfad35a71dd6306a58ee64377a96a37bc225e5e8ce2e406c7c368e5e2be85a0f62cec1253d657a3c2a2906580cfff489ef6baa4e842e1ca2ac62655dbc
|
7
|
+
data.tar.gz: b348dc01aec33cf0fb870c182a6d8d0b72a286abd95bbc332a14f44dcf0a8f98bcf8158337651fb7f1a196fe4784358ae53a85302e3e941997fffb39e0826074
|
data/CHANGELOG.md
CHANGED
@@ -7,6 +7,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [0.1.3] - 2025-01-XX
|
11
|
+
|
12
|
+
### Fixed
|
13
|
+
- **Migration Version Issue**: Fixed Rails migration version format to use "8.0" instead of "8"
|
14
|
+
- **Generator Compatibility**: Migration generator now works correctly with Rails 8.x applications
|
15
|
+
|
16
|
+
## [0.1.2] - 2025-01-XX
|
17
|
+
|
18
|
+
### Fixed
|
19
|
+
- **Migration Issue**: Fixed NOT NULL constraint error by making referrer_id nullable
|
20
|
+
- **Generator Improvements**: Removed interactive prompts, now reads configuration from initializer
|
21
|
+
- **Model Flexibility**: Generator automatically detects and uses the configured model class name
|
22
|
+
- **Migration Generation**: Creates proper migrations with correct table names and constraints
|
23
|
+
|
24
|
+
### Changed
|
25
|
+
- Generator no longer asks questions - uses `reference_class_name` from initializer
|
26
|
+
- Migration adds `null: true` to referrer_id to prevent constraint violations
|
27
|
+
- Added unique index on referral_code column
|
28
|
+
|
10
29
|
## [0.1.1] - 2025-01-XX
|
11
30
|
|
12
31
|
### Fixed
|
@@ -11,21 +11,39 @@ module ReferralBox
|
|
11
11
|
template "initializer.rb", "config/initializers/referral_box.rb"
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
14
|
+
def add_model_migration
|
15
|
+
# Read the configuration to determine the model class name
|
16
|
+
model_class = get_model_class_name
|
16
17
|
|
17
|
-
if
|
18
|
-
|
19
|
-
|
18
|
+
if model_class.present?
|
19
|
+
generate_migration = "AddReferralBoxTo#{model_class.pluralize}"
|
20
|
+
migration_content = generate_migration_content(model_class)
|
21
|
+
|
22
|
+
create_file "db/migrate/#{Time.current.strftime('%Y%m%d%H%M%S')}_#{generate_migration.underscore}.rb", migration_content
|
23
|
+
|
24
|
+
puts "Migration generated for #{model_class} model!"
|
25
|
+
puts "Run 'rails db:migrate' to apply it."
|
26
|
+
else
|
27
|
+
puts "Warning: Could not determine model class name from configuration."
|
28
|
+
puts "Please manually create migration for your model."
|
20
29
|
end
|
21
30
|
end
|
22
31
|
|
23
|
-
def
|
24
|
-
|
25
|
-
user_class = "User" if user_class.blank?
|
32
|
+
def add_model_methods
|
33
|
+
model_class = get_model_class_name
|
26
34
|
|
27
|
-
|
28
|
-
|
35
|
+
if model_class.present?
|
36
|
+
model_file = "app/models/#{model_class.underscore}.rb"
|
37
|
+
|
38
|
+
if File.exist?(model_file)
|
39
|
+
inject_into_file model_file, after: "class #{model_class} < ApplicationRecord" do
|
40
|
+
"\n " + generate_model_methods(model_class)
|
41
|
+
end
|
42
|
+
puts "Added ReferralBox methods to #{model_class} model."
|
43
|
+
else
|
44
|
+
puts "Warning: #{model_file} not found. Please manually add ReferralBox methods to your #{model_class} model."
|
45
|
+
end
|
46
|
+
end
|
29
47
|
end
|
30
48
|
|
31
49
|
def show_instructions
|
@@ -34,12 +52,83 @@ module ReferralBox
|
|
34
52
|
puts "="*60
|
35
53
|
puts "\nNext steps:"
|
36
54
|
puts "1. Run 'rails db:migrate' to create the database tables"
|
37
|
-
puts "2.
|
38
|
-
puts "3.
|
39
|
-
puts "4. Visit /referral_box to access the admin dashboard"
|
55
|
+
puts "2. Configure ReferralBox in config/initializers/referral_box.rb"
|
56
|
+
puts "3. Visit /referral_box to access the admin dashboard"
|
40
57
|
puts "\nFor more information, see the documentation!"
|
41
58
|
puts "="*60
|
42
59
|
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def get_model_class_name
|
64
|
+
# Try to read from existing initializer first
|
65
|
+
initializer_path = "config/initializers/referral_box.rb"
|
66
|
+
|
67
|
+
if File.exist?(initializer_path)
|
68
|
+
content = File.read(initializer_path)
|
69
|
+
if match = content.match(/config\.reference_class_name\s*=\s*['"]([^'"]+)['"]/)
|
70
|
+
return match[1]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Default to 'User' if not found
|
75
|
+
'User'
|
76
|
+
end
|
77
|
+
|
78
|
+
def generate_migration_content(model_class)
|
79
|
+
<<~MIGRATION
|
80
|
+
# frozen_string_literal: true
|
81
|
+
|
82
|
+
class AddReferralBoxTo#{model_class.pluralize} < ActiveRecord::Migration[#{get_rails_version}]
|
83
|
+
def change
|
84
|
+
add_column :#{model_class.underscore.pluralize}, :referral_code, :string
|
85
|
+
add_column :#{model_class.underscore.pluralize}, :tier, :string
|
86
|
+
add_reference :#{model_class.underscore.pluralize}, :referrer, null: true, foreign_key: { to_table: :#{model_class.underscore.pluralize} }
|
87
|
+
|
88
|
+
add_index :#{model_class.underscore.pluralize}, :referral_code, unique: true
|
89
|
+
end
|
90
|
+
end
|
91
|
+
MIGRATION
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_rails_version
|
95
|
+
# Get the major and minor version (e.g., "8.0" instead of just "8")
|
96
|
+
major, minor = Rails.version.split('.')[0..1]
|
97
|
+
"#{major}.#{minor}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def generate_model_methods(model_class)
|
101
|
+
<<~METHODS
|
102
|
+
has_many :referral_box_transactions, class_name: 'ReferralBox::Transaction', as: :user
|
103
|
+
has_many :referrals, class_name: '#{model_class}', foreign_key: 'referrer_id'
|
104
|
+
belongs_to :referrer, class_name: '#{model_class}', optional: true
|
105
|
+
|
106
|
+
before_create :generate_referral_code
|
107
|
+
|
108
|
+
def points_balance
|
109
|
+
ReferralBox.balance(self)
|
110
|
+
end
|
111
|
+
|
112
|
+
def current_tier
|
113
|
+
ReferralBox.tier(self)
|
114
|
+
end
|
115
|
+
|
116
|
+
def referral_link
|
117
|
+
"\#{Rails.application.routes.url_helpers.root_url}?ref=\#{referral_code}"
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def generate_referral_code
|
123
|
+
return if referral_code.present?
|
124
|
+
|
125
|
+
loop do
|
126
|
+
self.referral_code = SecureRandom.alphanumeric(ReferralBox.configuration.referral_code_length).upcase
|
127
|
+
break unless #{model_class}.exists?(referral_code: referral_code)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
METHODS
|
131
|
+
end
|
43
132
|
end
|
44
133
|
end
|
45
134
|
end
|
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
ReferralBox.configure do |config|
|
4
4
|
# Define which model represents your app's user/customer
|
5
|
-
|
5
|
+
# Change this to match your model: 'User', 'Customer', 'Account', 'Member', etc.
|
6
|
+
config.reference_class_name = 'User'
|
6
7
|
|
7
8
|
# Custom earning rule - earn points based on events
|
8
9
|
config.earning_rule = ->(user, event) do
|
data/lib/referral_box/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: referral_box
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kapil Dev Pal
|
@@ -16,56 +16,80 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 6.0
|
19
|
+
version: '6.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '9.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version: 6.0
|
29
|
+
version: '6.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '9.0'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: activerecord
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: 6.0
|
39
|
+
version: '6.0'
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '9.0'
|
34
43
|
type: :runtime
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
47
|
- - ">="
|
39
48
|
- !ruby/object:Gem::Version
|
40
|
-
version: 6.0
|
49
|
+
version: '6.0'
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '9.0'
|
41
53
|
- !ruby/object:Gem::Dependency
|
42
54
|
name: actionview
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
57
|
- - ">="
|
46
58
|
- !ruby/object:Gem::Version
|
47
|
-
version: 6.0
|
59
|
+
version: '6.0'
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '9.0'
|
48
63
|
type: :runtime
|
49
64
|
prerelease: false
|
50
65
|
version_requirements: !ruby/object:Gem::Requirement
|
51
66
|
requirements:
|
52
67
|
- - ">="
|
53
68
|
- !ruby/object:Gem::Version
|
54
|
-
version: 6.0
|
69
|
+
version: '6.0'
|
70
|
+
- - "<"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '9.0'
|
55
73
|
- !ruby/object:Gem::Dependency
|
56
74
|
name: actionpack
|
57
75
|
requirement: !ruby/object:Gem::Requirement
|
58
76
|
requirements:
|
59
77
|
- - ">="
|
60
78
|
- !ruby/object:Gem::Version
|
61
|
-
version: 6.0
|
79
|
+
version: '6.0'
|
80
|
+
- - "<"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '9.0'
|
62
83
|
type: :runtime
|
63
84
|
prerelease: false
|
64
85
|
version_requirements: !ruby/object:Gem::Requirement
|
65
86
|
requirements:
|
66
87
|
- - ">="
|
67
88
|
- !ruby/object:Gem::Version
|
68
|
-
version: 6.0
|
89
|
+
version: '6.0'
|
90
|
+
- - "<"
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '9.0'
|
69
93
|
- !ruby/object:Gem::Dependency
|
70
94
|
name: kaminari
|
71
95
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,28 +108,28 @@ dependencies:
|
|
84
108
|
name: rspec-rails
|
85
109
|
requirement: !ruby/object:Gem::Requirement
|
86
110
|
requirements:
|
87
|
-
- - "
|
111
|
+
- - "~>"
|
88
112
|
- !ruby/object:Gem::Version
|
89
113
|
version: '5.0'
|
90
114
|
type: :development
|
91
115
|
prerelease: false
|
92
116
|
version_requirements: !ruby/object:Gem::Requirement
|
93
117
|
requirements:
|
94
|
-
- - "
|
118
|
+
- - "~>"
|
95
119
|
- !ruby/object:Gem::Version
|
96
120
|
version: '5.0'
|
97
121
|
- !ruby/object:Gem::Dependency
|
98
122
|
name: factory_bot_rails
|
99
123
|
requirement: !ruby/object:Gem::Requirement
|
100
124
|
requirements:
|
101
|
-
- - "
|
125
|
+
- - "~>"
|
102
126
|
- !ruby/object:Gem::Version
|
103
127
|
version: '6.0'
|
104
128
|
type: :development
|
105
129
|
prerelease: false
|
106
130
|
version_requirements: !ruby/object:Gem::Requirement
|
107
131
|
requirements:
|
108
|
-
- - "
|
132
|
+
- - "~>"
|
109
133
|
- !ruby/object:Gem::Version
|
110
134
|
version: '6.0'
|
111
135
|
- !ruby/object:Gem::Dependency
|
@@ -173,7 +197,6 @@ files:
|
|
173
197
|
- db/migrate/002_create_referral_box_referral_logs.rb
|
174
198
|
- lib/generators/referral_box/install/install_generator.rb
|
175
199
|
- lib/generators/referral_box/install/templates/initializer.rb
|
176
|
-
- lib/generators/referral_box/install/templates/user_model.rb
|
177
200
|
- lib/referral_box.rb
|
178
201
|
- lib/referral_box/configuration.rb
|
179
202
|
- lib/referral_box/engine.rb
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class User < ApplicationRecord
|
4
|
-
# Add these columns to your users table:
|
5
|
-
# add_column :users, :referral_code, :string
|
6
|
-
# add_column :users, :tier, :string
|
7
|
-
# add_index :users, :referral_code, unique: true
|
8
|
-
|
9
|
-
has_many :referral_box_transactions, class_name: 'ReferralBox::Transaction', as: :user
|
10
|
-
has_many :referrals, class_name: 'User', foreign_key: 'referrer_id'
|
11
|
-
belongs_to :referrer, class_name: 'User', optional: true
|
12
|
-
|
13
|
-
before_create :generate_referral_code
|
14
|
-
|
15
|
-
def points_balance
|
16
|
-
ReferralBox.balance(self)
|
17
|
-
end
|
18
|
-
|
19
|
-
def current_tier
|
20
|
-
ReferralBox.tier(self)
|
21
|
-
end
|
22
|
-
|
23
|
-
def referral_link
|
24
|
-
"#{Rails.application.routes.url_helpers.root_url}?ref=#{referral_code}"
|
25
|
-
end
|
26
|
-
|
27
|
-
def total_referrals
|
28
|
-
referrals.count
|
29
|
-
end
|
30
|
-
|
31
|
-
def successful_referrals
|
32
|
-
referrals.joins(:referral_box_transactions).distinct.count
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def generate_referral_code
|
38
|
-
return if referral_code.present?
|
39
|
-
|
40
|
-
loop do
|
41
|
-
self.referral_code = SecureRandom.alphanumeric(ReferralBox.configuration.referral_code_length).upcase
|
42
|
-
break unless User.exists?(referral_code: referral_code)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|