Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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-LDB the actual referral code is in the middle one. the first one will always be REF and 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

Improvement: