diff --git a/db/up/mixdown.sql b/db/up/mixdown.sql index 9a71ec7c2..357bf0ac8 100644 --- a/db/up/mixdown.sql +++ b/db/up/mixdown.sql @@ -18,6 +18,7 @@ CREATE TABLE jam_track_mixdown_packages ( md5 VARCHAR, length INTEGER, downloaded_since_sign BOOLEAN NOT NULL DEFAULT FALSE, + last_step_at TIMESTAMP, last_signed_at TIMESTAMP, download_count INTEGER NOT NULL DEFAULT 0, signed_at TIMESTAMP, diff --git a/ruby/lib/jam_ruby/models/jam_track_mixdown.rb b/ruby/lib/jam_ruby/models/jam_track_mixdown.rb index 645cf96fa..9c9777462 100644 --- a/ruby/lib/jam_ruby/models/jam_track_mixdown.rb +++ b/ruby/lib/jam_ruby/models/jam_track_mixdown.rb @@ -8,6 +8,8 @@ module JamRuby belongs_to :user, class_name: "JamRuby::User" # the owner, or purchaser of the jam_track belongs_to :jam_track, class_name: "JamRuby::JamTrack" + has_many :jam_track_mixdown_packages, class_name: "JamRuby::JamTrackMixdownPackage" + validates :name, presence: true, length: {maximum: 100} validates :description, length: {maximum: 1000} validates :user, presence: true @@ -18,6 +20,24 @@ module JamRuby validate :verify_settings + def self.index(params, user) + jam_track_id = params[:id] + + limit = 20 + + query = JamTrackMixdown.where('jam_track_id = ?', jam_track_id).where('user_id = ?', user.id).order('created_at').paginate(page: 1, per_page: limit) + + count = query.total_entries + + if count == 0 + [query, nil, count] + elsif query.length < limit + [query, nil, count] + else + [query, start + limit, count] + end + end + def verify_settings # TODO: validate settings if false diff --git a/ruby/lib/jam_ruby/models/jam_track_mixdown_package.rb b/ruby/lib/jam_ruby/models/jam_track_mixdown_package.rb index 23f09075d..7be614d8a 100644 --- a/ruby/lib/jam_ruby/models/jam_track_mixdown_package.rb +++ b/ruby/lib/jam_ruby/models/jam_track_mixdown_package.rb @@ -36,7 +36,6 @@ module JamRuby MAX_JAM_TRACK_DOWNLOADS = 1000 - def after_save # try to catch major transitions: diff --git a/ruby/spec/jam_ruby/models/jam_track_mixdown_package_spec.rb b/ruby/spec/jam_ruby/models/jam_track_mixdown_package_spec.rb index 97589813a..83786af67 100644 --- a/ruby/spec/jam_ruby/models/jam_track_mixdown_package_spec.rb +++ b/ruby/spec/jam_ruby/models/jam_track_mixdown_package_spec.rb @@ -15,5 +15,44 @@ describe JamTrackMixdownPackage do puts package.errors.inspect package.errors.any?.should == false end + + + describe "signing_state" do + it "quiet" do + package = FactoryGirl.create(:jam_track_mixdown_package) + package.signing_state.should eq('QUIET') + end + + it "signed" do + package = FactoryGirl.create(:jam_track_mixdown_package, signed: true, signing_started_at: Time.now) + package.signing_state.should eq('SIGNED') + end + + it "error" do + package = FactoryGirl.create(:jam_track_mixdown_package, error_count: 1) + package.signing_state.should eq('ERROR') + end + + it "signing" do + package = FactoryGirl.create(:jam_track_mixdown_package, signing_started_at: Time.now, packaging_steps: 3, current_packaging_step:0, last_step_at:Time.now) + package.signing_state.should eq('SIGNING') + end + + it "signing timeout" do + package = FactoryGirl.create(:jam_track_mixdown_package, signing_started_at: Time.now - 100, packaging_steps: 3, current_packaging_step:0, last_step_at:Time.now) + package.signing_state.should eq('SIGNING_TIMEOUT') + end + + it "queued" do + package = FactoryGirl.create(:jam_track_mixdown_package, signing_queued_at: Time.now) + package.signing_state.should eq('QUEUED') + end + + it "signing timeout" do + package = FactoryGirl.create(:jam_track_mixdown_package, signing_queued_at: Time.now - (APP_CONFIG.signing_job_queue_max_time + 1)) + package.signing_state.should eq('QUEUED_TIMEOUT') + end + end + end diff --git a/ruby/spec/jam_ruby/models/jam_track_mixdown_spec.rb b/ruby/spec/jam_ruby/models/jam_track_mixdown_spec.rb index d56ff8fe3..0ffdba3f9 100644 --- a/ruby/spec/jam_ruby/models/jam_track_mixdown_spec.rb +++ b/ruby/spec/jam_ruby/models/jam_track_mixdown_spec.rb @@ -16,5 +16,21 @@ describe JamTrackMixdown do mixdown = JamTrackMixdown.create('abc', user, jam_track, {}) mixdown.errors.any?.should == false end + + it "index" do + query, start, count = JamTrackMixdown.index({id: jam_track}, user) + + query.length.should eq(0) + start.should be_nil + count.should eq(0) + + mixdown = FactoryGirl.create(:jam_track_mixdown, user: user, jam_track: jam_track) + + query, start, count = JamTrackMixdown.index({id: jam_track}, user) + query[0].should eq(mixdown) + start.should be_nil + count.should eq(1) + end + end diff --git a/web/app/controllers/api_jam_track_mixdowns_controller.rb b/web/app/controllers/api_jam_track_mixdowns_controller.rb new file mode 100644 index 000000000..1864b2378 --- /dev/null +++ b/web/app/controllers/api_jam_track_mixdowns_controller.rb @@ -0,0 +1,65 @@ +class ApiJamTrackMixdownsController < ApiController + + # have to be signed in currently to see this screen + before_filter :api_signed_in_user + before_filter :lookup_jam_track_right, :only => [:download,:enqueue] + + respond_to :json + + def log + @log || Logging.logger[ApiJamTrackMixdownsController] + end + + def index + data = JamTrackMixdown.index(params, current_user) + @jam_track_mixdowns, @next, @count = data[0], data[1], data[2] + + render "api_jam_track_mixdowns/index", :layout => nil + end + + def download + if @jam_track_right.valid? + + all_fingerprint = params[:all_fp] + running_fingerprint = params[:running_fp] + + if Rails.application.config.guard_against_fraud + error = @jam_track_right.guard_against_fraud(current_user, {all:all_fingerprint, running: running_fingerprint}, request.remote_ip) + if error + log.warn("potential fraud detected: #{error}") + render :json => { :message => error }, :status => 403 + return + end + end + + sample_rate = params[:sample_rate].nil? ? nil : params[:sample_rate].to_i + if @jam_track_right && @jam_track_right.ready?(sample_rate) + @jam_track_right.update_download_count + now = Time.now + @jam_track_right.last_downloaded_at = now + @jam_track_right.first_downloaded_at = now if @jam_track_right.first_downloaded_at.nil? + @jam_track_right.save! + redirect_to @jam_track_right.sign_url(120, sample_rate) + else + @jam_track_right.enqueue_if_needed(sample_rate) + render :json => { :message => "not available, digitally signing Jam Track offline." }, :status => 202 + end + else + render :json => { :message => "download limit surpassed", :errors=>@jam_track_right.errors }, :status => 403 + end + end + + def enqueue + sample_rate = params[:sample_rate].nil? ? nil : params[:sample_rate].to_i + enqueued = @jam_track_right.enqueue_if_needed(sample_rate) + log.debug("jamtrack #{enqueued ? "ENQUEUED" : "NOT ENQUEUED"}: jam_track_right=#{@jam_track_right.id} sample_rate=#{sample_rate} ") + render :json => { :message => "enqueued" }, :status => 200 + end + + private + def lookup_jam_track_right + @jam_track_right = JamTrackRight.where("jam_track_id=? AND user_id=?", params[:id], current_user.id).first + raise JamPermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR unless @jam_track_right + end + +end # class ApiJamTracksController diff --git a/web/app/views/api_jam_track_mixdowns/index.rabl b/web/app/views/api_jam_track_mixdowns/index.rabl new file mode 100644 index 000000000..3cfb8508b --- /dev/null +++ b/web/app/views/api_jam_track_mixdowns/index.rabl @@ -0,0 +1,11 @@ +node :next do |page| + @next +end + +node :count do |page| + @count +end + +node :mixdowns do |page| + partial "api_jam_track_mixdowns/show", object: @jam_track_mixdowns +end \ No newline at end of file diff --git a/web/app/views/api_jam_track_mixdowns/show.rabl b/web/app/views/api_jam_track_mixdowns/show.rabl new file mode 100644 index 000000000..a599f8a64 --- /dev/null +++ b/web/app/views/api_jam_track_mixdowns/show.rabl @@ -0,0 +1,13 @@ +object @jam_track_mixdown + +attributes :id, :name, :description, :jam_track_id + +node :settings do |item| + JSON.parse(item.settings) +end + +child(:jam_track_mixdown_packages => :packages) { + node do |package| + partial("api_jam_track_mixdowns/show_package", :object => package) + end +} diff --git a/web/app/views/api_jam_track_mixdowns/show_package.rabl b/web/app/views/api_jam_track_mixdowns/show_package.rabl new file mode 100644 index 000000000..5dba729db --- /dev/null +++ b/web/app/views/api_jam_track_mixdowns/show_package.rabl @@ -0,0 +1,3 @@ +object @package + +attributes :id, :file_type, :sample_rate, :encrypt_type, :error_count, :error_reason, :error_detail, :signing_state, :packaging_steps, :current_packaging_step diff --git a/web/config/routes.rb b/web/config/routes.rb index e0e9ea630..8c994ed6f 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -247,6 +247,7 @@ SampleApp::Application.routes.draw do match '/jamtracks/enqueue/:id' => 'api_jam_tracks#enqueue', :via => :post, :as => 'api_jam_tracks_enqueue' match '/jamtracks/rights/:id' => 'api_jam_tracks#show_jam_track_right', :via => :get, :as => 'api_jam_tracks_show_right' match '/jamtracks/keys' => 'api_jam_tracks#keys', :via => :post, :as => 'api_jam_tracks_keys' + match '/jamtracks/:id/mixdowns' => 'api_jam_track_mixdowns#index', :via => :get # Shopping carts match '/shopping_carts/add_jamtrack' => 'api_shopping_carts#add_jamtrack', :via => :post