Referral Code Revamp
Description / Background
Changing referral code into 6 digit alphabetical n # without "ref-". If a user uses their old referral code, it will still work. Generate a new 6-digit code for all users. but don't remove the old referral code.
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-LDBthe actual referral code is in the middle one. the first one will always beREFand the last one was random.
Scope
Location
How to find ..
How to set ..
Sequence Diagram / Flow
ERD
Backend Implementation
Replace all the variable my_r_code into short_my_r_code .
[
github.com
https://github.com/hungryhub-team/hh-server/pull/5565/files
](https://github.com/hungryhub-team/hh-server/pull/5565/files)
Frontend Implementation
PRD & Task
NO PRD Private (https://app.clickup.com/t/86cvhy9ym)
Design
-
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 user have 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