Referral Code Revamp
Description / Background
Changing referral codes to 6-digit alphanumeric format (letters and numbers) without the “ref-” prefix. If a user uses their old referral code, it will still work. Generate new 6-digit codes for all users, but do not remove old referral codes.
Glossary
member = registered user
Objectives
- New member will receive new referral code in 6-digit format.
- Existing member will receive new referral code, but the old referral code will remain valid.
- Show old and new referral code on admin dashboard ➝ user details
- Member can find their new referral code in their profile
- Member can’t find their old referral code on their profile
- Referral code will be written
REF-9RZAWF-LDB; the actual referral code is in the middle part. The first part will always beREFand the last part is random.
Scope
TBD
Location
TBD
How to find ..
TBD
How to set ..
TBD
Sequence Diagram / Flow
ERD
Backend Implementation
Replace all the variable my_r_code into short_my_r_code .
https://github.com/hungryhub-team/hh-server/pull/5565/files
Frontend Implementation
TBD
PRD & Task
No PRD required. See ClickUp task: https://app.clickup.com/t/86cvhy9ym
Design
TBD
API Blueprint
New Query
r_code_backup = backup old referral code short_my_r_code = new referral code
DB Schema / Database Migration
Add backup referral code on user table
class AddRCodeBackupToUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :r_code_backup, :string
end
end
Add column new referral code
class AddShortMyRCodeToUsers < ActiveRecord::Migration[5.1]
def change
add_column :users, :short_my_r_code, :string
add_index :users, :short_my_r_code, unique: true
end
end
Add migrate data to clone old referral code to r_code_backup if a user has a referrer
class FixReferralsRelationship < ActiveRecord::Migration[5.1]
def up
User.where.not(r_code: nil).group(:r_code).having('count(*) >= 1').count.each do |r_code, _count|
referrer = User.match_by_referral_code(r_code)
if referrer.present?
users = User.where(r_code: r_code)
users.where.not(id: referrer.id).update_all(r_code: referrer.short_my_r_code, r_code_backup: r_code)
end
end
end
def down
User.where.not(r_code_backup: nil).find_each do |user|
user.update(r_code: user.r_code_backup)
end
end
end
Add data migration to generate new referral code
class BackfillShortMyRCode < ActiveRecord::Migration[5.1]
def up
users = []
User.find_in_batches(batch_size: 1000) do |batch|
codes = Set.new
batch.each do |user|
new_code = User.generate_short_referral_code
loop do
break unless codes.include?(new_code)
new_code = User.generate_short_referral_code
end
user.short_my_r_code = new_code
users << user
end
User.import users, on_duplicate_key_update: [:short_my_r_code], raise_error: true
users.clear
end
end
def down
end
end