From 57f1fab93556c62a51625cf0bce0b329afbdb38e Mon Sep 17 00:00:00 2001 From: Bert Owen Date: Thu, 22 May 2014 16:02:48 +0800 Subject: [PATCH] VRFS-1677 fixed --- db/manifest | 3 +- db/up/started_at_music_session.sql | 1 + .../jam_ruby/models/active_music_session.rb | 3 ++ ruby/lib/jam_ruby/models/music_session.rb | 4 ++ .../api_music_sessions_controller.rb | 19 ++++++++- web/config/routes.rb | 1 + web/spec/requests/music_sessions_api_spec.rb | 41 +++++++++++++++++++ 7 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 db/up/started_at_music_session.sql diff --git a/db/manifest b/db/manifest index bfafbbbd0..c2c9fac25 100755 --- a/db/manifest +++ b/db/manifest @@ -157,4 +157,5 @@ notification_scheduled_session.sql music_notation.sql music_session_recurring_mode.sql add_timezone_music_session.sql -scheduled_sessions_2.sql \ No newline at end of file +scheduled_sessions_2.sql +started_at_music_session.sql \ No newline at end of file diff --git a/db/up/started_at_music_session.sql b/db/up/started_at_music_session.sql new file mode 100644 index 000000000..a50e26428 --- /dev/null +++ b/db/up/started_at_music_session.sql @@ -0,0 +1 @@ +ALTER TABLE music_sessions ADD COLUMN started_at TIMESTAMP WITHOUT TIME ZONE; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/active_music_session.rb b/ruby/lib/jam_ruby/models/active_music_session.rb index 9471a7875..14f475150 100644 --- a/ruby/lib/jam_ruby/models/active_music_session.rb +++ b/ruby/lib/jam_ruby/models/active_music_session.rb @@ -375,6 +375,9 @@ module JamRuby active_music_session.save unless active_music_session.errors.any? + music_session.started_at = active_music_session.created_at + music_session.save(:validate => false) + # save session parameters for next session User.save_session_settings(user, music_session) diff --git a/ruby/lib/jam_ruby/models/music_session.rb b/ruby/lib/jam_ruby/models/music_session.rb index af73f8cad..eee004673 100644 --- a/ruby/lib/jam_ruby/models/music_session.rb +++ b/ruby/lib/jam_ruby/models/music_session.rb @@ -235,6 +235,10 @@ module JamRuby active_music_session && active_music_session.mount end + def can_delete? user + self.creator == user && self.started_at.nil? + end + def recordings Recording.where(music_session_id: self.id) end diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb index 58080b591..4b3e22438 100644 --- a/web/app/controllers/api_music_sessions_controller.rb +++ b/web/app/controllers/api_music_sessions_controller.rb @@ -3,7 +3,7 @@ require 'aws-sdk' class ApiMusicSessionsController < ApiController # have to be signed in currently to see this screen - before_filter :api_signed_in_user, :except => [ :add_like, :show, :history_show ] + before_filter :api_signed_in_user, :except => [ :add_like, :show, :show_history ] before_filter :lookup_session, only: [:show, :update, :delete, :claimed_recording_start, :claimed_recording_stop, :track_sync] skip_before_filter :api_signed_in_user, only: [:perf_upload] @@ -164,6 +164,23 @@ class ApiMusicSessionsController < ApiController end end + def destroy + begin + music_session = MusicSession.find(params[:id]) + if music_session.can_delete? current_user + Notification.send_scheduled_session_cancelled music_session + music_session.destroy + + respond_with responder: ApiResponder, :status => 204 + else + render :json => { :message => ValidationMessages::PERMISSION_VALIDATION_ERROR }, :status => 404 + end + + rescue ActiveRecord::RecordNotFound + render :json => { :message => ValidationMessages::SESSION_NOT_FOUND }, :status => 404 + end + end + def participant_show @connection = Connection.find_by_client_id(params[:id]) end diff --git a/web/config/routes.rb b/web/config/routes.rb index 02333647f..de09b6319 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -151,6 +151,7 @@ SampleApp::Application.routes.draw do match '/sessions/scheduled' => 'api_music_sessions#scheduled', :via => :get match '/sessions/:id' => 'api_music_sessions#show', :via => :get, :as => 'api_session_detail' match '/sessions/:id' => 'api_music_sessions#update', :via => :put + match '/sessions/:id' => 'api_music_sessions#destroy', :via => :delete match '/sessions' => 'api_music_sessions#index', :via => :get match '/sessions' => 'api_music_sessions#create', :via => :post match '/sessions/nindex/:client_id' => 'api_music_sessions#nindex', :via => :get diff --git a/web/spec/requests/music_sessions_api_spec.rb b/web/spec/requests/music_sessions_api_spec.rb index a4425add5..e4b672b64 100644 --- a/web/spec/requests/music_sessions_api_spec.rb +++ b/web/spec/requests/music_sessions_api_spec.rb @@ -27,6 +27,7 @@ describe "Scheduled Music Session API ", :type => :api do before do #sign_in user + ActiveMusicSession.delete_all MusicSession.delete_all login(user) @@ -65,5 +66,45 @@ describe "Scheduled Music Session API ", :type => :api do music_sessions.count.should eql(2) expect(Time.parse(music_sessions[0]["scheduled_start"]).to_i).to be < Time.parse(music_sessions[1]["scheduled_start"]).to_i end + + it "should delete scheduled sessions" do + user2 = FactoryGirl.create(:user) + login(user) + + post '/api/sessions.json', defopts.merge({start: Time.now + 3.hours}).to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should eql(201) + + post '/api/sessions.json', defopts.merge({start: Time.now + 5.hours}).to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should eql(201) + + post '/api/sessions.json', defopts.merge({start: Time.now + 7.hours}).to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should eql(201) + + get '/api/sessions/scheduled.json' + last_response.status.should eql(200) + music_sessions = JSON.parse(last_response.body) + music_sessions.count.should eql(3) + + client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1", :client_id => "3") + post "/api/sessions/#{music_sessions[0]["id"]}/participants.json", + { :client_id => client.client_id, :as_musician => true, + :tracks => [{"instrument_id" => "electric guitar", + "sound" => "mono", + 'client_track_id' => "client_track_guid"}] + }.to_json, "CONTENT_TYPE" => 'application/json' + last_response.status.should eql(201) + + delete "/api/sessions/#{music_sessions[0]["id"]}.json" + last_response.status.should eql(404) + JSON.parse(last_response.body)["message"].should == ValidationMessages::PERMISSION_VALIDATION_ERROR + + delete "/api/sessions/#{music_sessions[1]["id"]}.json" + last_response.status.should eql(204) + + login(user2) + delete "/api/sessions/#{music_sessions[2]["id"]}.json" + last_response.status.should eql(404) + JSON.parse(last_response.body)["message"].should == ValidationMessages::PERMISSION_VALIDATION_ERROR + end end end \ No newline at end of file