diff --git a/db/manifest b/db/manifest index dac7cba7e..2667c3c18 100755 --- a/db/manifest +++ b/db/manifest @@ -335,4 +335,5 @@ whitelist.sql teacher_student_flags.sql add_sale_source_col.sql jamblaster_v2.sql -acapella_rename.sql \ No newline at end of file +acapella_rename.sql +jamblaster_pairing_active.sql \ No newline at end of file diff --git a/db/up/jamblaster_pairing_active.sql b/db/up/jamblaster_pairing_active.sql new file mode 100644 index 000000000..057fd895d --- /dev/null +++ b/db/up/jamblaster_pairing_active.sql @@ -0,0 +1 @@ +ALTER TABLE jamblaster_pairing_requests ADD COLUMN active BOOLEAN NOT NULL DEFAULT FALSE; \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/jamblaster.rb b/ruby/lib/jam_ruby/models/jamblaster.rb index cd25ce9eb..4782d6b4f 100644 --- a/ruby/lib/jam_ruby/models/jamblaster.rb +++ b/ruby/lib/jam_ruby/models/jamblaster.rb @@ -23,6 +23,10 @@ module JamRuby self.serial_no = nil if self.serial_no == '' end + def most_recent_pairing + jamblaster_pairing_requests.where(active: true).first + end + class << self @@mq_router = MQRouter.new @@ -37,4 +41,4 @@ module JamRuby end end end -end +end \ No newline at end of file diff --git a/ruby/lib/jam_ruby/models/jamblaster_pairing_request.rb b/ruby/lib/jam_ruby/models/jamblaster_pairing_request.rb index 19328fc5e..a198353c0 100644 --- a/ruby/lib/jam_ruby/models/jamblaster_pairing_request.rb +++ b/ruby/lib/jam_ruby/models/jamblaster_pairing_request.rb @@ -12,5 +12,17 @@ module JamRuby def key sibling_key end + + def activate(key) + JamblasterPairingRequest.transaction do + JamblasterPairingRequest.where(jamblaster_id: jamblaster_id).update_all(active: false) + self.active = true + self.sibling_key = key + if !self.save + raise ActiveRecord::Rollback + end + end + end + end end diff --git a/ruby/spec/factories.rb b/ruby/spec/factories.rb index 5233c4b7b..ee219a969 100644 --- a/ruby/spec/factories.rb +++ b/ruby/spec/factories.rb @@ -903,7 +903,6 @@ FactoryGirl.define do association :jamblaster, factory: :jamblaster sequence(:jamblaster_client_id ) { |n| "jamblaster_client_id#{n}" } - sequence(:sibling_client_id ) { |n| "sibling_client_id#{n}" } sequence(:sibling_key ) { |n| "sibling_key#{n}" } end diff --git a/ruby/spec/jam_ruby/models/jamblaster_spec.rb b/ruby/spec/jam_ruby/models/jamblaster_spec.rb index a1e1370ad..6339951b2 100644 --- a/ruby/spec/jam_ruby/models/jamblaster_spec.rb +++ b/ruby/spec/jam_ruby/models/jamblaster_spec.rb @@ -2,8 +2,8 @@ require 'spec_helper' describe Jamblaster do - let(:jamblaster) {FactoryGirl.create(:jamblaster)} - let(:user) {FactoryGirl.create(:user)} + let(:jamblaster) { FactoryGirl.create(:jamblaster) } + let(:user) { FactoryGirl.create(:user) } it "can be created" do FactoryGirl.create(:jamblaster) @@ -12,6 +12,28 @@ describe Jamblaster do it "can associate to users" do jamblaster.users.should eq([]) user.jamblasters.should eq([]) + end + describe "most_recent_pairings" do + it "basic funnction" do + + jamblaster.most_recent_pairing.should be nil + + pairing1 = FactoryGirl.create(:jamblaster_pairing_request, user: user, jamblaster: jamblaster, vtoken: 'token2', sibling_key: nil) + + jamblaster.most_recent_pairing.should be nil + + pairing1.activate('abc') + + jamblaster.most_recent_pairing.should eql pairing1 + + pairing2 = FactoryGirl.create(:jamblaster_pairing_request, user: user, jamblaster: jamblaster, sibling_key: 'key1', vtoken: 'token1') + + jamblaster.most_recent_pairing.should eql pairing1 + + pairing2.activate('key2') + + jamblaster.most_recent_pairing.should eql pairing2 + end end end \ No newline at end of file diff --git a/web/app/controllers/api_jamblasters_controller.rb b/web/app/controllers/api_jamblasters_controller.rb index 09af77735..071aaab41 100644 --- a/web/app/controllers/api_jamblasters_controller.rb +++ b/web/app/controllers/api_jamblasters_controller.rb @@ -174,10 +174,9 @@ class ApiJamblastersController < ApiController jamblaster.save! end + pairing_request.activate(key) - pairing_request.sibling_key = key - - if !pairing_request.save + if pairing_request.errors.any? respond_with_model(pairing_request) else Jamblaster.send_pair_attempt(jbid, user_id, key) diff --git a/web/app/views/api_jamblasters/auth_users.rabl b/web/app/views/api_jamblasters/auth_users.rabl index 1517c55fd..99a9b613b 100644 --- a/web/app/views/api_jamblasters/auth_users.rabl +++ b/web/app/views/api_jamblasters/auth_users.rabl @@ -2,6 +2,10 @@ object @jamblaster attributes :id, :serial_no, :client_id -child(:jamblaster_pairing_requests => :pairings) { - attributes :id, :user_id, :sibling_client_id, :vtoken, :key +child(:most_recent_pairing => :pairing) do |pairing| + attributes :key +end + +child(:users => :users) { + attributes :id } \ No newline at end of file diff --git a/web/app/views/api_jamblasters/get_tokens.rabl b/web/app/views/api_jamblasters/get_tokens.rabl index 6a718fde8..f18b4b302 100644 --- a/web/app/views/api_jamblasters/get_tokens.rabl +++ b/web/app/views/api_jamblasters/get_tokens.rabl @@ -2,6 +2,7 @@ object @jamblasters attributes :id, :serial_no, :client_id -child(:jamblaster_pairing_requests => :pairings) { - attributes :id, :user_id, :sibling_client_id, :jamblaster_client_id, :vtoken, :key -} \ No newline at end of file +child(:most_recent_pairing => :pairing) do |pairing| + attributes :key, :user_id +end + diff --git a/web/spec/controllers/api_jamblasters_controller_spec.rb b/web/spec/controllers/api_jamblasters_controller_spec.rb index b5cf911c9..41959512f 100644 --- a/web/spec/controllers/api_jamblasters_controller_spec.rb +++ b/web/spec/controllers/api_jamblasters_controller_spec.rb @@ -58,7 +58,24 @@ describe ApiJamblastersController do get :auth_users, {:format => 'json', jbid: jamblaster.client_id, serial_no: jamblaster.serial_no} response.status.should == 200 json = JSON.parse(response.body) - json["pairings"].length.should eq(0) + json["pairing"].should be nil + json["users"].length.should eq(1) + json["users"][0]["id"].should eql user.id + + pairing1 = FactoryGirl.create(:jamblaster_pairing_request, user: user, jamblaster: jamblaster, vtoken:'token2', sibling_key:nil) + + get :auth_users, {:format => 'json', jbid: jamblaster.client_id, serial_no: jamblaster.serial_no} + response.status.should == 200 + json = JSON.parse(response.body) + json["pairing"].should be nil + + pairing1.activate('abc') + pairing1.errors.any?.should be false + + get :auth_users, {:format => 'json', jbid: jamblaster.client_id, serial_no: jamblaster.serial_no} + response.status.should == 200 + json = JSON.parse(response.body) + json["pairing"]["key"].should eql 'abc' end end @@ -67,7 +84,8 @@ describe ApiJamblastersController do get :auth_users, {:format => 'json', jbid: jamblaster.client_id, serial_no: jamblaster.serial_no} response.status.should == 200 json = JSON.parse(response.body) - json["pairings"].length.should eq(0) + json["pairing"].should be nil + json["users"].length.should eq(0) end end @@ -245,8 +263,8 @@ describe ApiJamblastersController do response.status.should == 200 json = JSON.parse(response.body) json.length.should eq(1) - vtoken = json[0]["pairings"][0]["vtoken"] - vtoken.should eq("vtoken4") + key = json[0]["pairing"]["key"] + key.should eq("abc") end end @@ -277,8 +295,10 @@ describe ApiJamblastersController do response.status.should == 200 json = JSON.parse(response.body) json.length.should eq(1) - vtoken = json[0]["pairings"][0]["vtoken"] - vtoken.should eq("vtoken4") + key = json[0]["pairing"]["key"] + key.should eq("abc") + + puts response.body jamblaster.reload jamblaster.users.include?(user).should be true diff --git a/web/spec/factories.rb b/web/spec/factories.rb index ebf0fbe84..39f4b45f9 100644 --- a/web/spec/factories.rb +++ b/web/spec/factories.rb @@ -872,7 +872,6 @@ FactoryGirl.define do association :jamblaster, factory: :jamblaster sequence(:jamblaster_client_id ) { |n| "jamblaster_client_id#{n}" } - sequence(:sibling_client_id ) { |n| "sibling_client_id#{n}" } sequence(:sibling_key ) { |n| "sibling_key#{n}" } end end