diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index b119084e6..ae2c1717e 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -41,6 +41,7 @@ require "jam_ruby/resque/scheduled/audiomixer_retry" require "jam_ruby/resque/scheduled/icecast_config_retry" require "jam_ruby/resque/scheduled/icecast_source_check" require "jam_ruby/resque/scheduled/cleanup_facebook_signup" +require "jam_ruby/resque/scheduled/unused_music_notation_cleaner" require "jam_ruby/resque/google_analytics_event" require "jam_ruby/mq_router" require "jam_ruby/base_manager" diff --git a/ruby/lib/jam_ruby/resque/scheduled/unused_music_notation_cleaner.rb b/ruby/lib/jam_ruby/resque/scheduled/unused_music_notation_cleaner.rb new file mode 100644 index 000000000..9fb3e307f --- /dev/null +++ b/ruby/lib/jam_ruby/resque/scheduled/unused_music_notation_cleaner.rb @@ -0,0 +1,45 @@ +require 'json' +require 'resque' +require 'resque-lonely_job' +require 'net/http' +require 'digest/md5' + +module JamRuby + class UnusedMusicNotationCleaner + extend Resque::Plugins::LonelyJob + + @queue = :unused_music_notation_cleaner + + @@log = Logging.logger[UnusedMusicNotationCleaner] + + def self.lock_timeout + # this should be enough time to make sure the job has finished, but not so long that the system isn't recovering from a abandoned job + 120 + end + + def self.perform + @@log.debug("waking up") + + JamWebEventMachine.run_wait_stop do + UnusedMusicNotationCleaner.new.run + end + + @@log.debug("done") + end + + + def run + MusicNotation.find_each do |music_notation| + if music_notation.music_session && music_notation.music_session.session_removed_at + handle_notifications music_notation if music_notation.music_session.session_removed_at + 1.day < Time.now + elsif music_notation.music_session.nil? + handle_notifications music_notation if music_notation.created_at + 1.day < Time.now + end + end + end + + def handle_notifications music_notation + music_notation.destroy + end + end +end \ No newline at end of file diff --git a/ruby/spec/jam_ruby/resque/unused_music_notation_cleaner_spec.rb b/ruby/spec/jam_ruby/resque/unused_music_notation_cleaner_spec.rb new file mode 100644 index 000000000..8657a508c --- /dev/null +++ b/ruby/spec/jam_ruby/resque/unused_music_notation_cleaner_spec.rb @@ -0,0 +1,80 @@ +require 'spec_helper' +require 'fileutils' + +# these tests avoid the use of ActiveRecord and FactoryGirl to do blackbox, non test-instrumented tests +describe UnusedMusicNotationCleaner do + include UsesTempFiles + + NOTATION_TEMP_FILE='detail.png' + + in_directory_with_file(NOTATION_TEMP_FILE) + + before do + content_for_file("this is music notation test file") + end + + let(:check) { UnusedMusicNotationCleaner.new } + + describe "integration" do + + before(:all) do + MusicNotation.delete_all + end + + it "be OK with no music notations" do + MusicNotation.count().should == 0 + check.should_not_receive(:handle_notifications) + check.run + end + + + it "find no music notataions if music_session_id is nil and created at 1 hour ago" do + notation = MusicNotation.new + notation.file_url = File.open(NOTATION_TEMP_FILE) + notation.user = FactoryGirl.create(:user) + notation.created_at = Time.now - 1.hours + notation.save! + + check.should_not_receive(:handle_notifications) + check.run + end + + it "find no music notataion if music_session_id is not nil and session_removed_at is in 1 hour" do + music_session = FactoryGirl.create(:music_session, :session_removed_at => Time.now - 1.hours) + + notation = MusicNotation.new + notation.file_url = File.open(NOTATION_TEMP_FILE) + notation.user = FactoryGirl.create(:user) + notation.created_at = Time.now - 1.hours + notation.music_session = music_session + notation.save! + + check.run + end + + it "find music notataions if music_session_id is nil and created at 2 days ago" do + notation = MusicNotation.new + notation.file_url = File.open(NOTATION_TEMP_FILE) + notation.user = FactoryGirl.create(:user) + notation.created_at = Time.now - 2.days + notation.save! + + check.should_receive(:handle_notifications) + check.run + end + + it "find music notataion if music_session_id is not nil and session_removed_at 2 days ago" do + music_session = FactoryGirl.create(:music_session, :session_removed_at => Time.now - 2.days) + + notation = MusicNotation.new + notation.file_url = File.open(NOTATION_TEMP_FILE) + notation.user = FactoryGirl.create(:user) + notation.created_at = Time.now - 3.days + notation.music_session = music_session + notation.save! + + check.should_receive(:handle_notifications) + check.run + end + end +end diff --git a/web/config/scheduler.yml b/web/config/scheduler.yml index 480cefc29..b158ce4b3 100644 --- a/web/config/scheduler.yml +++ b/web/config/scheduler.yml @@ -24,3 +24,7 @@ EmailErrorCollector: class: "JamRuby::EmailErrorCollector" description: "Collects sendgrid email errors" +UnusedMusicNotationCleaner: + cron: "10 * * * * *" + class: "JamRuby::UnusedMusicNotationCleaner" + description: "Remove unused music notations" \ No newline at end of file