diff --git a/app/controllers/api/devices_controller.rb b/app/controllers/api/devices_controller.rb index eba1fbcdd..22dc7ed04 100644 --- a/app/controllers/api/devices_controller.rb +++ b/app/controllers/api/devices_controller.rb @@ -12,14 +12,14 @@ module Api # POST /api/device def create - mutate Devices::Create.run(device_params, user: current_user) + mutate Devices::Create.run(params, user: current_user) end # PATCH/PUT /api/device def update - # Because of the way bots are shared, there is no true 'update' action. - # Just a creation/reasignment of bots based on UUID / Token. - create + current_device + .if_null { create } + .if_not_null { mutate Devices::Update.run(params, device: current_device) } end # DELETE /api/devices/1 diff --git a/app/mutations/devices/create.rb b/app/mutations/devices/create.rb index d5e2922bd..df93df65d 100644 --- a/app/mutations/devices/create.rb +++ b/app/mutations/devices/create.rb @@ -9,18 +9,18 @@ module Devices optional do string :uuid string :name + string :webcam_url end def execute merge_default_values - + device = Device.new(inputs.except(:user)) ActiveRecord::Base.transaction do - device.update_attributes!(inputs.except(:user)) - old_device = user.device - user.update_attributes!(device_id: device.id) - if device.users.count < 1 - old_device.destroy! # Clean up "orphan" devices. - end + old_device = user.device # Ref. to old device + device.save! # Create the new one. + user.update_attributes!(device_id: device.id) # Detach from old one. + # Remove userless devices. + old_device.destroy! if old_device && device.users.count < 1 end device @@ -31,9 +31,5 @@ module Devices inputs[:uuid] ||= SecureRandom.uuid inputs[:name] ||= Haikunator.haikunate(9999) end - - def device - @device ||= Device.find_by(uuid: uuid) || Device.new(uuid: uuid) - end end end diff --git a/app/mutations/devices/update.rb b/app/mutations/devices/update.rb new file mode 100644 index 000000000..c6af0ba88 --- /dev/null +++ b/app/mutations/devices/update.rb @@ -0,0 +1,16 @@ +module Devices + class Update < Mutations::Command + required do + model :device, class: Device + end + + optional do + string :name + string :webcam_url + end + + def execute + device.update_attributes inputs.except(:device) + end + end +end diff --git a/spec/controllers/api/devices/devices_controller_create_spec.rb b/spec/controllers/api/devices/devices_controller_create_spec.rb index 04450ba52..98f53c27b 100644 --- a/spec/controllers/api/devices/devices_controller_create_spec.rb +++ b/spec/controllers/api/devices/devices_controller_create_spec.rb @@ -19,15 +19,5 @@ describe Api::DevicesController do expect(user.device).to eq(new_device) expect(response.status).to eq(200) end - - it 'shares devices between two users' do - bot = user.device - sign_in user2 - params = {name: 'QQQ', uuid: bot.uuid} - post :create, params - expect(user.reload.device.reload.name).to eq("QQQ") - expect(user2.reload.device.reload.name).to eq("QQQ") - expect(user.device_id).to eq(user2.device_id) - end end end diff --git a/spec/controllers/api/devices/devices_controller_update_spec.rb b/spec/controllers/api/devices/devices_controller_update_spec.rb index bf02a8e0f..c71d5a550 100644 --- a/spec/controllers/api/devices/devices_controller_update_spec.rb +++ b/spec/controllers/api/devices/devices_controller_update_spec.rb @@ -32,14 +32,5 @@ describe Api::DevicesController do expect(user.device['name'].length).to be > 4 # Haikunator expect(user.device['uuid']).to eq('1') end - - it 'shares devices between two users' do - bot = user.device - sign_in user2 - post :update, { name: 'Frank', uuid: bot.uuid } - user.reload - user2.reload - expect(user.device.id).to eq(user2.device.id) - end end end diff --git a/spec/factories/devices.rb b/spec/factories/devices.rb index fc0885688..478f2a218 100644 --- a/spec/factories/devices.rb +++ b/spec/factories/devices.rb @@ -5,5 +5,6 @@ FactoryGirl.define do factory :device do name { Faker::Internet.user_name } uuid { SecureRandom.uuid } + webcam_url { Faker::Company.logo } end end diff --git a/spec/mutations/devices/update_spec.rb b/spec/mutations/devices/update_spec.rb new file mode 100644 index 000000000..f0c466567 --- /dev/null +++ b/spec/mutations/devices/update_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Devices::Update do + let(:user) { FactoryGirl.create(:user) } + let(:device) { user.device } + + + it 'updates an existing device' do + previous_name = device.name + previous_webcam_url = device.webcam_url + p = { webcam_url: "http://myfeed.com/feed.jpeg", name: "Feedy McFeedington" } + Devices::Update.run!({device: device}, p) + device.reload + expect(device.name).to eq(p[:name]) + expect(device.webcam_url).to eq(p[:webcam_url]) + end +end \ No newline at end of file