VRFS-1576 affiliate_partner model

This commit is contained in:
Jonathan Kolyer 2014-04-20 22:54:49 +00:00
parent 0a811a147c
commit 937efed3e5
9 changed files with 91 additions and 16 deletions

View File

@ -143,3 +143,5 @@ emails.sql
email_batch.sql
user_progress_tracking2.sql
bands_did_session.sql
affiliate_partners.sql

View File

@ -0,0 +1,15 @@
CREATE TABLE affiliate_partners (
id VARCHAR(64) PRIMARY KEY DEFAULT uuid_generate_v4(),
partner_name VARCHAR(128) NOT NULL,
partner_code VARCHAR(128) NOT NULL,
partner_user_id VARCHAR(64) NOT NULL,
user_email VARCHAR(255),
referral_user_count INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX affiliate_partners_code_idx ON affiliate_partners(partner_code);
CREATE INDEX affiliate_partners_user_idx ON affiliate_partners(partner_user_id);
ALTER TABLE users ADD COLUMN affiliate_referral_id VARCHAR(64) REFERENCES affiliate_partners(id);

View File

@ -65,7 +65,7 @@ module JamWebEventMachine
end
def self.run
return if defined?(Rails::Console)
current = Thread.current
Thread.new do
run_em(current)

View File

@ -0,0 +1,27 @@
class JamRuby::AffiliatePartner < ActiveRecord::Base
has_one :partner_user, :class_name => "JamRuby::User", :foreign_key => :partner_user_id
has_many :user_referrals, :class_name => "JamRuby::User", :foreign_key => :affiliate_referral_id
attr_accessible :partner_name, :partner_code, :partner_user_id
validates :user_email, format: {with: JamRuby::User::VALID_EMAIL_REGEX}, :if => :user_email
validates :partner_name, presence: true
validates :partner_code, presence: true
validates :partner_user, presence: true
def self.create_with_params(params={})
oo = self.new
oo.partner_name = params[:partner_name]
oo.partner_code = params[:partner_code]
oo.partner_user = User.where(:email => params[:user_email]).limit(1).first
oo.partner_user_id = oo.partner_user.try(:id)
oo.save!
oo
end
def self.coded_id(code=nil)
self.where(:partner_code => code).limit(1).pluck(:id).first if code.present?
end
end

View File

@ -99,6 +99,10 @@ module JamRuby
# events
has_many :event_sessions, :class_name => "JamRuby::EventSession"
# affiliate_partner
has_one :affiliate_partner, :class_name => "JamRuby::AffiliatePartner", :foreign_key => :partner_user_id
belongs_to :affiliate_referral, :class_name => "JamRuby::AffiliatePartner", :foreign_key => :affiliate_referral_id, :counter_cache => :referral_user_count
# This causes the authenticate method to be generated (among other stuff)
#has_secure_password
@ -735,6 +739,7 @@ module JamRuby
invited_user = options[:invited_user]
fb_signup = options[:fb_signup]
signup_confirm_url = options[:signup_confirm_url]
affiliate_referral_id = options[:affiliate_referral_id]
user = User.new
@ -836,6 +841,10 @@ module JamRuby
if user.errors.any?
raise ActiveRecord::Rollback
else
if user.affiliate_referral = AffiliatePartner.find_by_id(affiliate_referral_id)
user.save
end if affiliate_referral_id.present?
# don't send an signup email if email is already confirmed
if user.email_confirmed
UserMailer.welcome_message(user).deliver

View File

@ -8,6 +8,14 @@ class ApplicationController < ActionController::Base
# inject username/email into bugsnag data
before_bugsnag_notify :add_user_info_to_bugsnag
def affiliate_code
cookies[:affiliate_code]
end
def affiliate_code=(code)
cookies[:affiliate_code] = code if code.present?
end
private
def add_user_info_to_bugsnag(notif)
# Add some app-specific data which will be displayed on a custom

View File

@ -149,19 +149,20 @@ class UsersController < ApplicationController
musician = params[:jam_ruby_user][:musician]
@user = UserManager.new.signup(remote_ip: request.remote_ip,
first_name: params[:jam_ruby_user][:first_name],
last_name: params[:jam_ruby_user][:last_name],
email: params[:jam_ruby_user][:email],
password: params[:jam_ruby_user][:password],
password_confirmation: params[:jam_ruby_user][:password_confirmation],
terms_of_service: terms_of_service,
instruments: instruments,
birth_date: birth_date,
location: location,
musician: musician,
invited_user: @invited_user,
fb_signup: @fb_signup,
signup_confirm_url: ApplicationHelper.base_uri(request) + "/confirm")
first_name: params[:jam_ruby_user][:first_name],
last_name: params[:jam_ruby_user][:last_name],
email: params[:jam_ruby_user][:email],
password: params[:jam_ruby_user][:password],
password_confirmation: params[:jam_ruby_user][:password_confirmation],
terms_of_service: terms_of_service,
instruments: instruments,
birth_date: birth_date,
location: location,
musician: musician,
invited_user: @invited_user,
fb_signup: @fb_signup,
signup_confirm_url: ApplicationHelper.base_uri(request) + "/confirm",
affiliate_referral_id: AffiliatePartner.coded_id(self.affiliate_code))
# check for errors
if @user.errors.any?

View File

@ -26,6 +26,7 @@ class UserManager < BaseManager
invited_user = options[:invited_user]
fb_signup = options[:fb_signup]
signup_confirm_url = options[:signup_confirm_url]
affiliate_referral_id = options[:affiliate_referral_id]
@user = User.new
@ -60,7 +61,8 @@ class UserManager < BaseManager
photo_url: photo_url,
invited_user: invited_user,
fb_signup: fb_signup,
signup_confirm_url: signup_confirm_url)
signup_confirm_url: signup_confirm_url,
affiliate_referral_id: affiliate_referral_id)
return @user
#end

View File

@ -11,6 +11,13 @@ describe UserManager do
end
describe "signup" do
let!(:user) { FactoryGirl.create(:user) }
let!(:partner) {
AffiliatePartner.create_with_params({:partner_name => Faker::Company.name,
:partner_code => Faker::Lorem.words(1)[0],
:user_email => user.email})
}
it "signup successfully" do
MaxMindIsp.delete_all # prove that city/state/country will remain nil if no maxmind data
MaxMindGeo.delete_all
@ -24,7 +31,8 @@ describe UserManager do
terms_of_service: true,
instruments: @instruments,
musician:true,
signup_confirm_url: "http://localhost:3000/confirm" )
signup_confirm_url: "http://localhost:3000/confirm",
affiliate_referral_id: AffiliatePartner.coded_id(partner.partner_code))
@user.errors.any?.should be_false
@user.first_name.should == "bob"
@ -38,6 +46,9 @@ describe UserManager do
@user.subscribe_email.should be_true
@user.signup_token.should_not be_nil
@user.reload
expect(@user.affiliate_referral).to eq(partner)
UserMailer.deliveries.length.should == 1
end