* recording file/manager fixes and aging of recordings

This commit is contained in:
Seth Call 2014-11-07 16:12:36 -06:00
parent 164fe8db61
commit 8cad33a303
8 changed files with 70 additions and 52 deletions

View File

@ -1,8 +1,10 @@
-- this is to make sure we don't delete any recordings for 7 days
UPDATE recordings SET updated_at = NOW();
ALTER TABLE recordings ADD COLUMN deleted BOOLEAN DEFAULT FALSE NOT NULL;
DROP VIEW user_syncs;
CREATE VIEW user_syncs AS

View File

@ -21,7 +21,15 @@ module JamRuby
raise 'no user id specified' if user_id.blank?
query = UserSync.includes(recorded_track: [{recording: [:owner, {claimed_recordings: [:share_token]}, {recorded_tracks: [:user]}, {comments:[:user]}, :likes, :plays, :mixes]}, user: [], instrument:[]], mix: [], quick_mix:[]).where(user_id: user_id).paginate(:page => page, :per_page => limit).order('created_at DESC, unified_id')
query = UserSync
.includes(recorded_track: [{recording: [:owner, {claimed_recordings: [:share_token]}, {recorded_tracks: [:user]}, {comments:[:user]}, :likes, :plays, :mixes]}, user: [], instrument:[]], mix: [], quick_mix:[])
.joins("LEFT OUTER JOIN claimed_recordings ON claimed_recordings.user_id = user_syncs.user_id AND claimed_recordings.recording_id = user_syncs.recording_id")
.where(user_id: user_id)
.where(%Q{
((claimed_recordings IS NULL OR claimed_recordings.discarded = TRUE) AND fully_uploaded = FALSE) OR (claimed_recordings IS NOT NULL AND claimed_recordings.discarded = FALSE)
})
.paginate(:page => page, :per_page => limit)
.order('created_at DESC, unified_id')
# allow selection of single user_sync, by ID

View File

@ -65,10 +65,9 @@ module JamRuby
cleanup_files
@@log.info("audiomixer job successful. mix_id #{quick_mix_id}")
@@log.info("quickmixer job successful. mix_id #{quick_mix_id}")
rescue Exception => e
puts "EEOUOU #{e}"
post_error(@quick_mix, e)
raise
end

View File

@ -41,6 +41,22 @@ describe UserSync do
user_syncs[2].quick_mix.should eq(quick_mix)
end
# https://jamkazam.atlassian.net/browse/VRFS-2450
it "no longer returned after fully uploaded and unclaimed" do
mix = FactoryGirl.create(:mix)
mix.recording.duration = 1
mix.recording.save!
quick_mix = FactoryGirl.create(:quick_mix_completed, recording:mix.recording, user: mix.recording.recorded_tracks[0].user, autowire:false, fully_uploaded: true)
mix.recording.recorded_tracks[0].fully_uploaded = true
mix.recording.recorded_tracks[0].save!
mix.recording.claimed_recordings[0].discarded = true
mix.recording.claimed_recordings[0].save!
data = UserSync.index({user_id: mix.recording.recorded_tracks[0].user.id})
user_syncs = data[:query]
user_syncs.length.should == 0
end
it "two mixes, one not belonging to querier" do
mix1 = FactoryGirl.create(:mix)
mix2 = FactoryGirl.create(:mix)
@ -71,8 +87,8 @@ describe UserSync do
describe "one recording with two users" do
let!(:recording1) {
recording = FactoryGirl.create(:recording, owner: user1, band: nil, duration:1)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: user2)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner, fully_uploaded:false)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: user2, fully_uploaded:false)
recording.save!
recording.reload
recording
@ -177,10 +193,10 @@ describe UserSync do
describe "one recording with multi-track users" do
let!(:recording1) {
recording = FactoryGirl.create(:recording, owner: user1, band: nil, duration:1)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: user2)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: user2)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner, fully_uploaded:false)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner, fully_uploaded:false)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: user2, fully_uploaded:false)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: user2, fully_uploaded:false)
recording.save!
recording.reload
recording
@ -228,6 +244,7 @@ describe UserSync do
recording = FactoryGirl.create(:recording, owner: user1, band: nil, duration:1)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner)
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: user2)
claimed_recording = FactoryGirl.create(:claimed_recording, user: recording.owner, recording: recording, discarded:false)
recording.save!
recording.reload
recording

View File

@ -204,7 +204,7 @@
// @FIXME -- this will need to be tweaked when we allow unfollowing
$('div[data-band-id='+newFollowing.band_id+'] .search-m-follow').removeClass('button-orange').addClass('button-grey');
},
error: app.ajaxError
error: app.ajaxError(arguments)
});
}

View File

@ -603,16 +603,26 @@ context.JK.SyncViewer = class SyncViewer
title: "Confirm Deletion",
html: "Are you sure you want to delete this recording?",
yes: =>
@rest.deleteRecordingClaim(recordingId).done((response)->
@rest.deleteRecordingClaim(recordingId).done((response)=>
cmd =
{ type: 'recording_directory',
action: 'delete',
queue: 'cleanup',
recording_id: recordingId}
context.JK.ackBubble($delete, 'command-enqueued', {}, {offsetParent: $delete.closest('.dialog')})
logger.debug("enqueueing delete #{recordingId}")
# now check if the sync is gone entirely, allowing us to delete it from the UI
@rest.getUserSync({user_sync_id: recordingId}).done((userSync) =>
# the user sync is still here. tell user it'll be done as soon as they've uploaded their files
context.JK.ackBubble($delete, 'file-sync-delayed-deletion', {}, {offsetParent: $delete.closest('.dialog')})
)
.fail((xhr) =>
if xhr.status == 404
# the userSync is gone; remove from file manager dynamically
$recordingHolder = $details.closest('.recording-holder')
$recordingHolder.slideUp()
else
@app.ajaxError(arguments)
)
context.jamClient.OnTrySyncCommand(cmd)
)
@ -622,7 +632,7 @@ context.JK.SyncViewer = class SyncViewer
return false;
displaySize: (size) =>
# size is in bytes. divide by million, and round to one decimal place
# size is in bytes. divide by million, anxosd round to one decimal place
megs = Math.round(size * 10 / (1024 * 1024) ) / 10
"#{megs}M"

View File

@ -148,8 +148,12 @@
<script type="text/template" id="template-help-command-enqueued">
<div class="help-recording-command-enqueued">
Your request will be executed immediately, or after File Manager finishes it's current task.
Your request will be executed as soon as possible.
</div>
</script>
<script type="text/template" id="template-help-file-sync-delayed-deletion">
<div class="file-sync-delayed-deletion">
The files associated with this recording will be deleted as soon as your client has uploaded your tracks and stream mix from this recording.
</div>
</script>

View File

@ -46,23 +46,12 @@ describe ApiUserSyncsController do
}
it "no claimed_recordings" do
# every is supposed to upload immediately, but no downloads until you try claim it. The assertions below validate this
# if there are no claims, then no one wants the recording. no usersyncs
get :index, { :format => 'json', :id => user1.id }
json = JSON.parse(response.body, :symbolize_names => true)
json[:next].should be_nil
json[:entries].length.should == 2
recorded_track1 = json[:entries][0]
recorded_track1[:upload][:should_upload].should be_true
recorded_track1[:upload][:too_many_upload_failures].should be_false
recorded_track1[:download][:should_download].should be_false
recorded_track1[:download][:too_many_downloads].should be_false
recorded_track2 = json[:entries][1]
recorded_track2[:upload][:should_upload].should be_true
recorded_track2[:upload][:too_many_upload_failures].should be_false
recorded_track2[:download][:should_download].should be_false
recorded_track2[:download][:too_many_downloads].should be_false
json[:entries].length.should == 0
end
it "recording isn't over" do
@ -79,6 +68,9 @@ describe ApiUserSyncsController do
FactoryGirl.create(:claimed_recording, user: user1, recording: recording1, discarded:false)
recording1.recorded_tracks[0].fully_uploaded = false
recording1.recorded_tracks[0].save!
get :index, { :format => 'json', :id => user1.id }
json = JSON.parse(response.body, :symbolize_names => true)
json[:next].should be_nil
@ -100,7 +92,7 @@ describe ApiUserSyncsController do
get :index, { :format => 'json', :id => user2.id }
json = JSON.parse(response.body, :symbolize_names => true)
json[:next].should be_nil
json[:entries].length.should == 2
json[:entries].length.should == 1
recorded_track1 = json[:entries][0]
recorded_track1[:upload][:should_upload].should be_true
@ -108,32 +100,17 @@ describe ApiUserSyncsController do
recorded_track1[:download][:should_download].should be_false
recorded_track1[:download][:too_many_downloads].should be_false
recorded_track2 = json[:entries][1]
recorded_track2[:upload][:should_upload].should be_true
recorded_track2[:upload][:too_many_upload_failures].should be_false
recorded_track2[:download][:should_download].should be_false
recorded_track2[:download][:too_many_downloads].should be_false
end
it "one user decides to discard the recording" do
FactoryGirl.create(:claimed_recording, user: user1, recording: recording1, discarded:true)
FactoryGirl.create(:claimed_recording, user: user2, recording: recording1, discarded:false)
# it's a length of zero because recorded_tracks default to 'fully_uploaded = true'. so nothing to do for this user
get :index, { :format => 'json', :id => user1.id }
json = JSON.parse(response.body, :symbolize_names => true)
json[:next].should be_nil
json[:entries].length.should == 2
recorded_track1 = json[:entries][0]
recorded_track1[:upload][:should_upload].should be_true
recorded_track1[:upload][:too_many_upload_failures].should be_false
recorded_track1[:download][:should_download].should be_false
recorded_track1[:download][:too_many_downloads].should be_false
recorded_track2 = json[:entries][1]
recorded_track2[:upload][:should_upload].should be_true
recorded_track2[:upload][:too_many_upload_failures].should be_false
recorded_track2[:download][:should_download].should be_false
recorded_track2[:download][:too_many_downloads].should be_false
json[:entries].length.should == 0
controller.current_user = user2
get :index, { :format => 'json', :id => user2.id }
@ -141,16 +118,17 @@ describe ApiUserSyncsController do
json[:next].should be_nil
json[:entries].length.should == 2
recorded_track1 = json[:entries][0]
recorded_track1[:upload][:should_upload].should be_true
recorded_track1[:upload][:too_many_upload_failures].should be_false
recorded_track1[:download][:should_download].should be_false
recorded_track1[:download][:should_download].should be_true
recorded_track1[:download][:too_many_downloads].should be_false
recorded_track2 = json[:entries][1]
recorded_track2[:upload][:should_upload].should be_true
recorded_track2[:upload][:too_many_upload_failures].should be_false
recorded_track2[:download][:should_download].should be_false
recorded_track2[:download][:should_download].should be_true
recorded_track2[:download][:too_many_downloads].should be_false
end