From 9598c06e1f192a6ced01e5de22c3103ed4449df3 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Thu, 6 Feb 2014 21:02:04 +0000 Subject: [PATCH] * moved shareable_resolver into new controller, and made tests --- ruby/lib/jam_ruby/models/claimed_recording.rb | 1 + ruby/lib/jam_ruby/models/music_session.rb | 5 +++ .../jam_ruby/models/music_session_history.rb | 5 +++ ruby/lib/jam_ruby/models/recorded_track.rb | 1 + ruby/lib/jam_ruby/models/share_token.rb | 2 + ruby/spec/factories.rb | 45 +++++++++++++++++-- .../models/band_filter_search_spec.rb | 4 +- .../models/music_session_history_spec.rb | 2 +- .../music_sessions_user_history_spec.rb | 2 +- ruby/spec/jam_ruby/models/share_token_spec.rb | 28 ++++++++++++ ruby/spec/spec_helper.rb | 1 + web/Gemfile | 2 + .../controllers/api_sessions_controller.rb | 2 +- .../controllers/share_tokens_controller.rb | 14 ++++++ web/app/controllers/spikes_controller.rb | 10 ----- web/config/routes.rb | 4 +- .../share_tokens_controller_spec.rb | 14 ++++++ 17 files changed, 123 insertions(+), 19 deletions(-) create mode 100644 ruby/spec/jam_ruby/models/share_token_spec.rb create mode 100644 web/app/controllers/share_tokens_controller.rb create mode 100644 web/spec/controllers/share_tokens_controller_spec.rb diff --git a/ruby/lib/jam_ruby/models/claimed_recording.rb b/ruby/lib/jam_ruby/models/claimed_recording.rb index d85b2c727..d8dfcd648 100644 --- a/ruby/lib/jam_ruby/models/claimed_recording.rb +++ b/ruby/lib/jam_ruby/models/claimed_recording.rb @@ -64,6 +64,7 @@ module JamRuby self.share_token = ShareToken.new self.share_token.token = token self.share_token.shareable_type = "recording" + self.share_token.shareable_id = self.id end end end diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index 4ad26b7c6..57ebcee50 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -40,6 +40,11 @@ module JamRuby validate :creator_is_musician validate :no_new_playback_while_playing + before_create :create_uuid + def create_uuid + #self.id = SecureRandom.uuid + end + def before_destroy self.mount.destroy if self.mount end diff --git a/ruby/lib/jam_ruby/models/music_session_history.rb b/ruby/lib/jam_ruby/models/music_session_history.rb index d4ed4b982..cedb6a36b 100644 --- a/ruby/lib/jam_ruby/models/music_session_history.rb +++ b/ruby/lib/jam_ruby/models/music_session_history.rb @@ -160,6 +160,9 @@ module JamRuby private def generate_share_token + + self.id = music_session.id # unify music_session.id and music_session_history.id + token = loop do token = SecureRandom.urlsafe_base64(SHARE_TOKEN_LENGTH, false) token = remove_non_alpha_num(token) @@ -170,6 +173,8 @@ module JamRuby self.share_token = ShareToken.new self.share_token.token = token self.share_token.shareable_type = "session" + self.share_token.shareable_id = self.id + self.share_token.save! end end diff --git a/ruby/lib/jam_ruby/models/recorded_track.rb b/ruby/lib/jam_ruby/models/recorded_track.rb index 69933a560..5ea21b734 100644 --- a/ruby/lib/jam_ruby/models/recorded_track.rb +++ b/ruby/lib/jam_ruby/models/recorded_track.rb @@ -21,6 +21,7 @@ module JamRuby validates :sound, :inclusion => {:in => SOUND} validates :client_id, :presence => true # not a connection relation on purpose validates :track_id, :presence => true # not a track relation on purpose + validates :client_track_id, :presence => true validates :md5, :presence => true, :if => :upload_starting? validates :length, length: {minimum: 1, maximum: 1024 * 1024 * 256 }, if: :upload_starting? # 256 megs max. is this reasonable? surely... diff --git a/ruby/lib/jam_ruby/models/share_token.rb b/ruby/lib/jam_ruby/models/share_token.rb index 2f52afe41..18bb751e6 100644 --- a/ruby/lib/jam_ruby/models/share_token.rb +++ b/ruby/lib/jam_ruby/models/share_token.rb @@ -1,5 +1,7 @@ module JamRuby class ShareToken < ActiveRecord::Base belongs_to :shareable, :polymorphic => true + + end end \ No newline at end of file diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index a8eda4e0a..cf4afef18 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -32,7 +32,7 @@ FactoryGirl.define do end end - factory :music_session, :class => JamRuby::MusicSession do + factory :music_session_no_history, :class => JamRuby::MusicSession do sequence(:description) { |n| "Music Session #{n}" } fan_chat true fan_access true @@ -42,8 +42,16 @@ FactoryGirl.define do genres [JamRuby::Genre.first] association :creator, :factory => :user - factory :music_session_with_mount do + factory :music_session do + + after(:create) { |session| + MusicSessionHistory.save(session) + } + + factory :music_session_with_mount do association :mount, :factory => :icecast_mount + end + end end @@ -109,14 +117,45 @@ FactoryGirl.define do end factory :recorded_track, :class => JamRuby::RecordedTrack do + instrument JamRuby::Instrument.first + sound 'stereo' + sequence(:client_id) { |n| "client_id-#{n}"} + sequence(:track_id) { |n| "track_id-#{n}"} + sequence(:client_track_id) { |n| "client_track_id-#{n}"} + md5 'abc' + length 1 + fully_uploaded true + association :user, factory: :user + association :recording, factory: :recording end factory :instrument, :class => JamRuby::Instrument do - end factory :recording, :class => JamRuby::Recording do + association :owner, factory: :user + association :music_session, factory: :music_session + + factory :recording_with_track do + before(:create) { |recording| + recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner) + } + end + end + + factory :claimed_recording, :class => JamRuby::ClaimedRecording do + sequence(:name) { |n| "name-#{n}" } + sequence(:description) { |n| "description-#{n}" } + is_public true + is_downloadable true + association :genre, factory: :genre + association :user, factory: :user + + before(:create) { |claimed_recording| + claimed_recording.recording = FactoryGirl.create(:recording_with_track, owner: claimed_recording.user) + } + end factory :musician_instrument, :class => JamRuby::MusicianInstrument do diff --git a/ruby/spec/jam_ruby/models/band_filter_search_spec.rb b/ruby/spec/jam_ruby/models/band_filter_search_spec.rb index 1130361e2..1f5ec1eba 100644 --- a/ruby/spec/jam_ruby/models/band_filter_search_spec.rb +++ b/ruby/spec/jam_ruby/models/band_filter_search_spec.rb @@ -120,7 +120,7 @@ describe 'Band search' do it "by now playing" do # should get 1 result with 1 active session session = make_session(@band3) - FactoryGirl.create(:music_session_history, :music_session => session) + #FactoryGirl.create(:music_session_history, :music_session => session) results = Search.band_filter({ :orderby => 'playing' }) expect(results.results.count).to be 1 @@ -129,7 +129,7 @@ describe 'Band search' do # should get 2 results with 2 active sessions # sort order should be created_at DESC session = make_session(@band4) - FactoryGirl.create(:music_session_history, :music_session => session) + #FactoryGirl.create(:music_session_history, :music_session => session) results = Search.band_filter({ :orderby => 'playing' }) expect(results.results.count).to be 2 expect(results.results[0].id).to eq(@band4.id) diff --git a/ruby/spec/jam_ruby/models/music_session_history_spec.rb b/ruby/spec/jam_ruby/models/music_session_history_spec.rb index 260917687..183e9f6c4 100644 --- a/ruby/spec/jam_ruby/models/music_session_history_spec.rb +++ b/ruby/spec/jam_ruby/models/music_session_history_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe MusicSessionHistory do let(:some_user) { FactoryGirl.create(:user) } - let(:music_session) { FactoryGirl.create(:music_session) } + let(:music_session) { FactoryGirl.create(:music_session_no_history) } let(:history) { FactoryGirl.create(:music_session_history, :music_session => music_session) } let(:user_history1) { FactoryGirl.create(:music_session_user_history, :history => history, :user => music_session.creator) } let(:user_history2) { FactoryGirl.create(:music_session_user_history, :history => history, :user => some_user) } diff --git a/ruby/spec/jam_ruby/models/music_sessions_user_history_spec.rb b/ruby/spec/jam_ruby/models/music_sessions_user_history_spec.rb index c0acbc01b..b6c719151 100644 --- a/ruby/spec/jam_ruby/models/music_sessions_user_history_spec.rb +++ b/ruby/spec/jam_ruby/models/music_sessions_user_history_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe MusicSessionUserHistory do let(:some_user) { FactoryGirl.create(:user) } - let(:music_session) { FactoryGirl.create(:music_session) } + let(:music_session) { FactoryGirl.create(:music_session_no_history) } let(:history) { FactoryGirl.create(:music_session_history, :music_session => music_session) } let(:user_history1) { FactoryGirl.create(:music_session_user_history, :history => history, :user => music_session.creator) } let(:user_history2) { FactoryGirl.create(:music_session_user_history, :history => history, :user => some_user) } diff --git a/ruby/spec/jam_ruby/models/share_token_spec.rb b/ruby/spec/jam_ruby/models/share_token_spec.rb new file mode 100644 index 000000000..bf232e1f8 --- /dev/null +++ b/ruby/spec/jam_ruby/models/share_token_spec.rb @@ -0,0 +1,28 @@ +require 'spec_helper' + +describe ShareToken do + + let(:user) { FactoryGirl.create(:user) } + let(:music_session) {FactoryGirl.create(:music_session) } + let(:claimed_recording) {FactoryGirl.create(:claimed_recording) } + + before(:each) do + ShareToken.delete_all + end + + it "can reference a music session" do + music_session.touch # should create a MSH, and a token, too + ShareToken.count.should == 1 + token = ShareToken.find_by_shareable_id!(music_session.id) + token.shareable_id.should == music_session.id + token.shareable_type.should == 'session' + end + + it "can reference a claimed recording" do + claimed_recording.touch # should create a share token + ShareToken.count.should == 2 # one for MSH, one for recording + token = ShareToken.find_by_shareable_id!(claimed_recording.id) + token.shareable_type.should == 'recording' + end + +end diff --git a/ruby/spec/spec_helper.rb b/ruby/spec/spec_helper.rb index 256f7311b..052a7d1fa 100644 --- a/ruby/spec/spec_helper.rb +++ b/ruby/spec/spec_helper.rb @@ -30,6 +30,7 @@ ActiveRecord::Base.add_observer UserObserver.instance ActiveRecord::Base.add_observer FeedbackObserver.instance ActiveRecord::Base.add_observer RecordedTrackObserver.instance +RecordedTrack.observers.disable :all # only a few tests want this observer active # put ActionMailer into test mode ActionMailer::Base.delivery_method = :test diff --git a/web/Gemfile b/web/Gemfile index 93b0ffd53..d41b0fc32 100644 --- a/web/Gemfile +++ b/web/Gemfile @@ -40,7 +40,9 @@ gem 'amqp', '0.9.8' gem 'logging-rails', :require => 'logging/rails' gem 'omniauth', '1.1.1' gem 'omniauth-facebook', '1.4.1' +gem 'omniauth-twitter' gem 'omniauth-google-oauth2', '0.2.1' +gem 'twitter' gem 'fb_graph', '2.5.9' gem 'sendgrid', '1.1.0' gem 'recaptcha', '0.3.4' diff --git a/web/app/controllers/api_sessions_controller.rb b/web/app/controllers/api_sessions_controller.rb index b2f860747..95e24d563 100644 --- a/web/app/controllers/api_sessions_controller.rb +++ b/web/app/controllers/api_sessions_controller.rb @@ -1,4 +1,4 @@ -class ApiSearchController < ApiController +class ApiSessionsController < ApiController def login user = User.authenticate(params[:email], params[:password]) diff --git a/web/app/controllers/share_tokens_controller.rb b/web/app/controllers/share_tokens_controller.rb new file mode 100644 index 000000000..452dc221a --- /dev/null +++ b/web/app/controllers/share_tokens_controller.rb @@ -0,0 +1,14 @@ +class ShareTokensController < ApplicationController + + respond_to :html + + def shareable_resolver + share_token = ShareToken.find_by_token!(params[:id]) + # TODO: clean this up later to truly use polymorphic associations + if share_token.shareable_type == "session" + redirect_to music_session_detail(share_token.shareable_id) + else + redirect_to recording_detail(share_token.shareable_id) + end + end +end diff --git a/web/app/controllers/spikes_controller.rb b/web/app/controllers/spikes_controller.rb index 1eada9e3a..fc44414ab 100644 --- a/web/app/controllers/spikes_controller.rb +++ b/web/app/controllers/spikes_controller.rb @@ -44,14 +44,4 @@ class SpikesController < ApplicationController render :layout => 'web' end - def shareable_resolver - share_token = ShareToken.find_by_token(params[:id]) - # TODO: clean this up later to truly use polymorphic associations - if share_token.shareable_type == "session" - msh = MusicSessionHistory.find(share_token.shareable_id) - redirect_to "/sessions/#{msh.music_session_id}" - else - redirect_to "/recordings/#{share_token.shareable_id}" - end - end end diff --git a/web/config/routes.rb b/web/config/routes.rb index abe28b45c..491b63c69 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -63,7 +63,9 @@ SampleApp::Application.routes.draw do match '/facebook_invite', to: 'spikes#facebook_invite' match '/gmail_contacts', to: 'spikes#gmail_contacts' match '/listen_in', to: 'spikes#listen_in' - match '/:id', to: 'spikes#shareable_resolver' + + # share tokens + match '/s/:id', to: 'share_tokens#shareable_resolver' # password reset match '/request_reset_password' => 'users#request_reset_password', :via => :get diff --git a/web/spec/controllers/share_tokens_controller_spec.rb b/web/spec/controllers/share_tokens_controller_spec.rb new file mode 100644 index 000000000..7be16d2a9 --- /dev/null +++ b/web/spec/controllers/share_tokens_controller_spec.rb @@ -0,0 +1,14 @@ +require 'spec_helper' + +describe ApiSharedTokenController do + render_views + + let(:user) { FactoryGirl.create(:user) } + let(:music_session) {FactoryGirl.create(:music_session, user: user) } + + it "resolves music session" do + music_session.touch + get :shareable_resolver, :id => ShareToken.find_by_shareable_id!(music_session.id).token + end + +end