diff --git a/db/manifest b/db/manifest index d13ae148c..79e959423 100755 --- a/db/manifest +++ b/db/manifest @@ -152,4 +152,5 @@ connection_stale_expire.sql rename_chat_messages.sql fix_connection_fields.sql session_ratings.sql -scheduled_sessions.sql \ No newline at end of file +scheduled_sessions.sql +add_last_jam_user_fields.sql diff --git a/db/up/add_last_jam_user_fields.sql b/db/up/add_last_jam_user_fields.sql new file mode 100644 index 000000000..5542ec4c7 --- /dev/null +++ b/db/up/add_last_jam_user_fields.sql @@ -0,0 +1,8 @@ +ALTER TABLE users ADD COLUMN last_jam_addr BIGINT; + +ALTER TABLE users ADD COLUMN last_jam_locidispid BIGINT; + +-- (j)oin session as musician, (r)egister, (f)tue, (n)etwork test +ALTER TABLE users ADD COLUMN last_jam_updated_reason CHAR(1); + +ALTER TABLE users ADD COLUMN last_jam_updated_at TIMESTAMP; diff --git a/resetdb.sh b/resetdb.sh new file mode 100755 index 000000000..5a06c1ff0 --- /dev/null +++ b/resetdb.sh @@ -0,0 +1,7 @@ +#!/bin/sh -x +dropdb jam +dropdb jam_db_build +dropdb jam_ruby_test +dropdb jam_web_test +dropdb jam_websocket_test +createdb -Upostgres jam diff --git a/ruby/lib/jam_ruby/connection_manager.rb b/ruby/lib/jam_ruby/connection_manager.rb index 589841943..5d4eefd2c 100644 --- a/ruby/lib/jam_ruby/connection_manager.rb +++ b/ruby/lib/jam_ruby/connection_manager.rb @@ -347,7 +347,7 @@ SQL connection = Connection.find_by_client_id_and_user_id!(client_id, user.id) - connection.join_the_session(music_session, as_musician, tracks) + connection.join_the_session(music_session, as_musician, tracks, user) # connection.music_session_id = music_session.id # connection.as_musician = as_musician # connection.joining_session = true diff --git a/ruby/lib/jam_ruby/models/connection.rb b/ruby/lib/jam_ruby/models/connection.rb index f5e2d315a..d706542db 100644 --- a/ruby/lib/jam_ruby/models/connection.rb +++ b/ruby/lib/jam_ruby/models/connection.rb @@ -148,13 +148,18 @@ module JamRuby true end - def join_the_session(music_session, as_musician, tracks) + def join_the_session(music_session, as_musician, tracks, user) self.music_session_id = music_session.id self.as_musician = as_musician self.joining_session = true self.joined_session_at = Time.now associate_tracks(tracks) unless tracks.nil? self.save + + # if user joins the session as a musician, update their addr and location + if as_musician + user.update_addr_loc(self, 'j') + end end def associate_tracks(tracks) diff --git a/ruby/lib/jam_ruby/models/user.rb b/ruby/lib/jam_ruby/models/user.rb index 17b9910f1..fe3c6190b 100644 --- a/ruby/lib/jam_ruby/models/user.rb +++ b/ruby/lib/jam_ruby/models/user.rb @@ -781,7 +781,14 @@ module JamRuby user.country = location[:country] user.birth_date = birth_date - if user.musician # only update instruments if the user is a musician + if musician + user.last_jam_addr = location[:addr] + user.last_jam_locidispid = location[:locidispid] + user.last_jam_updated_reason = 'r' + user.last_jam_updated_at = Time.now + end + + if musician # only update instruments if the user is a musician unless instruments.nil? instruments.each do |musician_instrument_param| instrument = Instrument.find(musician_instrument_param[:instrument_id]) @@ -1146,6 +1153,14 @@ module JamRuby end end + def update_addr_loc(connection, reason) + self.last_jam_addr = connection.addr + self.last_jam_locidispid = connection.locidispid + self.last_jam_updated_reason = reason + self.last_jam_updated_at = Time.now + self.save + end + def top_followings @topf ||= User.joins("INNER JOIN follows ON follows.followable_id = users.id AND follows.followable_type = '#{self.class.to_s}'") .where(['follows.user_id = ?', self.id]) diff --git a/ruby/spec/jam_ruby/models/claimed_recording_spec.rb b/ruby/spec/jam_ruby/models/claimed_recording_spec.rb index 171749999..4bbbeea17 100644 --- a/ruby/spec/jam_ruby/models/claimed_recording_spec.rb +++ b/ruby/spec/jam_ruby/models/claimed_recording_spec.rb @@ -21,7 +21,7 @@ describe ClaimedRecording do @music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true, nil) + @connection.join_the_session(@music_session, true, nil, @user) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/ruby/spec/jam_ruby/models/mix_spec.rb b/ruby/spec/jam_ruby/models/mix_spec.rb index eaa65bd63..904c036a4 100755 --- a/ruby/spec/jam_ruby/models/mix_spec.rb +++ b/ruby/spec/jam_ruby/models/mix_spec.rb @@ -10,7 +10,7 @@ describe Mix do @music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true, nil) + @connection.join_the_session(@music_session, true, nil, @user) @recording = Recording.start(@music_session, @user) @recording.stop @recording.claim(@user, "name", "description", Genre.first, true) diff --git a/ruby/spec/jam_ruby/models/music_session_spec.rb b/ruby/spec/jam_ruby/models/music_session_spec.rb index 74be88bf1..44b14fe27 100644 --- a/ruby/spec/jam_ruby/models/music_session_spec.rb +++ b/ruby/spec/jam_ruby/models/music_session_spec.rb @@ -361,7 +361,7 @@ describe ActiveMusicSession do @music_session = FactoryGirl.create(:active_music_session, :creator => @user1, :musician_access => true) # @music_session.connections << @connection @music_session.save! - @connection.join_the_session(@music_session, true, nil) + @connection.join_the_session(@music_session, true, nil, @user1) end describe "not recording" do diff --git a/ruby/spec/jam_ruby/models/musician_search_spec.rb b/ruby/spec/jam_ruby/models/musician_search_spec.rb index e957b9c46..ab322f0d8 100644 --- a/ruby/spec/jam_ruby/models/musician_search_spec.rb +++ b/ruby/spec/jam_ruby/models/musician_search_spec.rb @@ -115,7 +115,7 @@ describe 'Musician search' do music_session = FactoryGirl.create(:active_music_session, :creator => usr, :musician_access => true) # music_session.connections << connection music_session.save - connection.join_the_session(music_session, true, nil) + connection.join_the_session(music_session, true, nil, usr) recording = Recording.start(music_session, usr) recording.stop recording.reload @@ -130,7 +130,7 @@ describe 'Musician search' do music_session = FactoryGirl.create(:active_music_session, :creator => usr, :musician_access => true) # music_session.connections << connection music_session.save - connection.join_the_session(music_session, true, nil) + connection.join_the_session(music_session, true, nil, usr) end context 'musician stat counters' do diff --git a/ruby/spec/jam_ruby/models/recording_spec.rb b/ruby/spec/jam_ruby/models/recording_spec.rb index f3966feb5..fa666cbea 100644 --- a/ruby/spec/jam_ruby/models/recording_spec.rb +++ b/ruby/spec/jam_ruby/models/recording_spec.rb @@ -80,7 +80,7 @@ describe Recording do @track2 = FactoryGirl.create(:track, :connection => @connection2, :instrument => @instrument2) # @music_session.connections << @connection2 - @connection2.join_the_session(@music_session, true, nil) + @connection2.join_the_session(@music_session, true, nil, @user2) @recording = Recording.start(@music_session, @user) @user.recordings.length.should == 0 @@ -179,7 +179,7 @@ describe Recording do @track = FactoryGirl.create(:track, :connection => @connection2, :instrument => @instrument) # @music_session.connections << @connection2 @music_session.save - @connection2.join_the_session(@music_session, true, nil) + @connection2.join_the_session(@music_session, true, nil, @user2) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/web/lib/max_mind_manager.rb b/web/lib/max_mind_manager.rb index e3a2a54f0..49353761a 100644 --- a/web/lib/max_mind_manager.rb +++ b/web/lib/max_mind_manager.rb @@ -10,7 +10,8 @@ class MaxMindManager < BaseManager def self.lookup(ip_address) city = state = country = nil - + locid = ispid = 0 + unless ip_address.nil? || ip_address !~ /^\d+\.\d+\.\d+\.\d+$/ #ActiveRecord::Base.connection_pool.with_connection do |connection| # pg_conn = connection.instance_variable_get("@connection") @@ -23,17 +24,29 @@ class MaxMindManager < BaseManager # end # end #end - ip_as_int = ip_address_to_int(ip_address) - block = GeoIpBlocks.lookup(ip_as_int) - location = block ? GeoIpLocations.lookup(block.locid) : nil - if location - country = location.countrycode - state = location.region - city = location.city + + addr = ip_address_to_int(ip_address) + + block = GeoIpBlocks.lookup(addr) + if block + locid = block.locid + + location = GeoIpLocations.lookup(locid) + if location + # todo translate countrycode to country, region(code) to region + country = location.countrycode + state = location.region + city = location.city + end + end + + isp = JamIsp.lookup(addr) + if isp + ispid = isp.coid end end - a = {:city => city, :state => state, :country => country} + {city: city, state: state, country: country, addr: addr, locidispid: locid*1000000+ispid} end def self.lookup_isp(ip_address) diff --git a/web/lib/user_manager.rb b/web/lib/user_manager.rb index 34be86248..d6765ad42 100644 --- a/web/lib/user_manager.rb +++ b/web/lib/user_manager.rb @@ -35,9 +35,15 @@ class UserManager < BaseManager raise PermissionError, "Signups are currently disabled" end - # a user should be able to specify their location, but if they don't, we'll best effort it - if location.nil? - location = MaxMindManager.lookup(remote_ip) + loc = MaxMindManager.lookup(remote_ip) + # there are three cases here: if location is missing, we'll auto set the city, etc. from + # the ip address; if location is present, empty or not empty, we'll set the city, etc. from + # what is present in location. we should NOT normally default city, etc. for the user, they + # own it, they may want it to be unspecified, that is their right. + if location + loc[:city] = location[:city] + loc[:state] = location[:state] + loc[:country] = location[:country] end # TODO: figure out why can't user verify_recaptcha here @@ -54,7 +60,7 @@ class UserManager < BaseManager password: password, password_confirmation: password_confirmation, terms_of_service: terms_of_service, - location: location, + location: loc, instruments: instruments, birth_date: birth_date, musician: musician, diff --git a/web/spec/controllers/api_claimed_recordings_spec.rb b/web/spec/controllers/api_claimed_recordings_spec.rb index a5d86d3c1..8778d81e4 100644 --- a/web/spec/controllers/api_claimed_recordings_spec.rb +++ b/web/spec/controllers/api_claimed_recordings_spec.rb @@ -11,7 +11,7 @@ describe ApiClaimedRecordingsController do @music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true, nil) + @connection.join_the_session(@music_session, true, nil, @user) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/web/spec/features/social_meta_spec.rb b/web/spec/features/social_meta_spec.rb index fa8a66fe8..43a11f23b 100644 --- a/web/spec/features/social_meta_spec.rb +++ b/web/spec/features/social_meta_spec.rb @@ -65,7 +65,7 @@ describe "social metadata" do ms = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => true) # ms.connections << connection ms.save! - connection.join_the_session(ms, true, nil) + connection.join_the_session(ms, true, nil, user) ms } @@ -93,7 +93,7 @@ describe "social metadata" do @music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true, nil) + @connection.join_the_session(@music_session, true, nil, @user) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/web/spec/helpers/recording_helper_spec.rb b/web/spec/helpers/recording_helper_spec.rb index 39767704c..95091ccf0 100644 --- a/web/spec/helpers/recording_helper_spec.rb +++ b/web/spec/helpers/recording_helper_spec.rb @@ -10,7 +10,7 @@ describe MusicSessionHelper do @music_session = FactoryGirl.create(:active_music_session, :creator => @user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true, nil) + @connection.join_the_session(@music_session, true, nil, @user) @recording = Recording.start(@music_session, @user) @recording.stop @recording.reload diff --git a/web/spec/requests/music_sessions_api_spec.rb b/web/spec/requests/music_sessions_api_spec.rb index f775b5051..dfd06511f 100755 --- a/web/spec/requests/music_sessions_api_spec.rb +++ b/web/spec/requests/music_sessions_api_spec.rb @@ -701,7 +701,7 @@ describe "Music Session API ", :type => :api do music_session = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => true) # music_session.connections << connection music_session.save - connection.join_the_session(music_session, true, nil) + connection.join_the_session(music_session, true, nil, user) recording = Recording.start(music_session, user) recording.stop recording.reload diff --git a/web/spec/requests/users_api_spec.rb b/web/spec/requests/users_api_spec.rb index 0a4f17da1..ba450e85a 100644 --- a/web/spec/requests/users_api_spec.rb +++ b/web/spec/requests/users_api_spec.rb @@ -985,8 +985,9 @@ describe "User API", :type => :api do ms = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => true) # ms.connections << connection ms.save! - connection.join_the_session(ms, true, nil) - ms } + connection.join_the_session(ms, true, nil, user) + ms + } it "fetches facebook successfully" do login(user.email, user.password, 200, true) @@ -1122,7 +1123,7 @@ describe "User API", :type => :api do @music_session = FactoryGirl.create(:active_music_session, :creator => user, :musician_access => true) # @music_session.connections << @connection @music_session.save - @connection.join_the_session(@music_session, true, nil) + @connection.join_the_session(@music_session, true, nil, user) @recording = Recording.start(@music_session, user) @recording.stop @recording.reload diff --git a/web/spec/spec_helper.rb b/web/spec/spec_helper.rb index 3ff0f6e46..5af0fbc83 100644 --- a/web/spec/spec_helper.rb +++ b/web/spec/spec_helper.rb @@ -30,7 +30,7 @@ db_config = YAML::load(File.open('config/database.yml'))["test"] bputs "before recreate db" -SpecDb::recreate_database(db_config) +SpecDb::recreate_database(db_config) unless ENV["TEST_WWW"] == "1" bputs "before connect db" ActiveRecord::Base.establish_connection(YAML::load(File.open('config/database.yml'))["test"])