This commit is contained in:
Seth Call 2015-09-08 09:59:53 -05:00
parent 50684890cb
commit e29050b0db
10 changed files with 169 additions and 1 deletions

View File

@ -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,

View File

@ -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

View File

@ -36,7 +36,6 @@ module JamRuby
MAX_JAM_TRACK_DOWNLOADS = 1000
def after_save
# try to catch major transitions:

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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

View File

@ -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