diff --git a/Gemfile b/Gemfile index 00289cb90..b9521b78d 100644 --- a/Gemfile +++ b/Gemfile @@ -32,7 +32,7 @@ gem 'pg', '0.14.0' gem 'compass-rails' gem 'rabl' # for JSON API development gem 'gon' # for passthrough of Ruby variables to Javascript variables -gem 'eventmachine', '1.0.0' +gem 'eventmachine', '1.0.3' gem 'amqp', '0.9.8' gem 'logging-rails', :require => 'logging/rails' gem 'omniauth', '1.1.1' @@ -45,6 +45,7 @@ gem 'aws-sdk', '1.8.0' gem 'aasm', '3.0.16' gem 'carrierwave' gem 'devise', '>= 1.1.2' +gem 'thin' #group :libv8 do # gem 'libv8', "~> 3.11.8" #end diff --git a/app/controllers/api_music_sessions_controller.rb b/app/controllers/api_music_sessions_controller.rb index 19476b1de..d2504b856 100644 --- a/app/controllers/api_music_sessions_controller.rb +++ b/app/controllers/api_music_sessions_controller.rb @@ -1,3 +1,5 @@ +require 'aws-sdk' + class ApiMusicSessionsController < ApiController # have to be signed in currently to see this screen @@ -163,16 +165,35 @@ class ApiMusicSessionsController < ApiController end def perf_upload + # URI.unescape(bucket_gen.objects[@perfdata.uri].url_for(:read, :expires => SampleApp::Application.config.perf_data_signed_url_timeout, :response_content_type => 'text/csv').to_s) + music_session = MusicSession.find(params[:id]) - if SampleApp::Application.config.upload_perf_to_s3 + @perfdata = MusicSessionPerfData.new() + @perfdata.music_session = music_session + @perfdata.client_id = params[:client_id] + @perfdata.save + if @perfdata.errors.any? + # we have to do this because api_session_detail_url will fail with a bad @music_session + response.status = :unprocessable_entity + respond_with @perfdata + return + end + + if SampleApp::Application.config.storage_type == :fog + + s3 = AWS::S3.new(:access_key_id => SampleApp::Application.config.aws_access_key_id, + :secret_access_key => SampleApp::Application.config.aws_secret_access_key) + bucket = s3.buckets[SampleApp::Application.config.aws_bucket] + redirect_to URI.unescape(bucket.objects[@perdata.uri].url_for(:write, :expires => SampleApp::Application.config.perf_data_signed_url_timeout, :'response_content_type' => 'text/csv').to_s) else - - if params[:redirected_back].nil? + if params[:redirected_back].nil? || !params[:redirected_back] # first time that a client has asked to do a PUT (not redirected back here) redirect_to request.fullpath + '&redirected_back=true' else - + # we should store it here to aid in development, but we don't have to until someone wants the feature + # so... just return 200 + render :json => { :id => @perfdata.id }, :status => 200 end end diff --git a/config/application.rb b/config/application.rb index b5c3a8ea0..f8415e620 100644 --- a/config/application.rb +++ b/config/application.rb @@ -113,5 +113,10 @@ module SampleApp config.aws_region = 'us-east-1' config.aws_bucket = 'jamkazam-dev' config.aws_cache = '315576000' + + + # perf_data configs + config.perf_data_bucket_key = "perf_data" + config.perf_data_signed_url_timeout = 3600 # 1 hour end end diff --git a/config/environments/development.rb b/config/environments/development.rb index 09f4a44d3..eae0d2676 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -41,7 +41,7 @@ SampleApp::Application.configure do # Show the logging configuration on STDOUT config.show_log_configuration = true - config.websocket_gateway_enable = true + config.websocket_gateway_enable = false TEST_CONNECT_STATES = false end diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 1e59cf4c7..c7cf97b3e 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -4,7 +4,7 @@ CarrierWave.root = Rails.root.join(Rails.public_path).to_s CarrierWave.base_path = ENV['RAILS_RELATIVE_URL_ROOT'] CarrierWave.configure do |config| - config.storage = SampleApp::Application.config.store_type + config.storage = SampleApp::Application.config.storage_type config.fog_credentials = { :provider => 'AWS', :aws_access_key_id => SampleApp::Application.config.aws_access_key_id, @@ -13,8 +13,8 @@ CarrierWave.configure do |config| } config.fog_directory = SampleApp::Application.config.aws_bucket # required config.fog_public = true # optional, defaults to true - config.fog_attributes = {'Cache-Control'=>"max-age=#{JamAdmin::Application.config.aws_cache}"} # optional, defaults to {} - end + config.fog_attributes = {'Cache-Control'=>"max-age=#{SampleApp::Application.config.aws_cache}"} # optional, defaults to {} end + require 'carrierwave/orm/activerecord' diff --git a/spec/factories.rb b/spec/factories.rb index 4d6a27e2e..e1a3c5193 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -63,6 +63,7 @@ FactoryGirl.define do sequence(:client_id) { |n| "Client#{n}" } ip_address "1.1.1.1" as_musician true + sequence(:client_id) { |n| "client_id#{n}"} end factory :friendship, :class => JamRuby::Friendship do diff --git a/spec/requests/music_sessions_api_spec.rb b/spec/requests/music_sessions_api_spec.rb index 5e9e8c636..1cb594837 100644 --- a/spec/requests/music_sessions_api_spec.rb +++ b/spec/requests/music_sessions_api_spec.rb @@ -556,6 +556,26 @@ describe "Music Session API ", :type => :api do sessions.first["description"].should == "My Session" end + it "prepare for upload" do + user = FactoryGirl.create(:user) + music_session = FactoryGirl.create(:music_session, :creator => user, :description => "My Session") + client = FactoryGirl.create(:connection, :user => user) + + put "/api/sessions/#{music_session.id}/perf.json", "CONTENT_TYPE" => "application/json" + last_response.status.should == 302 + redirect = last_response.headers["Location"] + p redirect + + put redirect + '.json', "CONTENT_TYPE" => 'application/json' + last_response.status.should == 200 + body = JSON.parse(last_response.body) + perf_data_id = body["id"] + + music_session_perf_data = MusicSessionPerfData.find(perf_data_id) + music_session_perf_data.should_not be_nil + music_session_perf_data.music_session.should == music_session + end + end