From 34e74bf8f4ea537a788a3090809acfc711e16ce4 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 15 Feb 2018 15:43:08 -0600 Subject: [PATCH] Add mode column back, add fbos_version to devices table + TS interfaces. --- app/controllers/api/abstract_controller.rb | 3 +- app/models/application_record.rb | 3 +- app/models/device.rb | 18 +-------- app/serializers/device_serializer.rb | 4 +- app/serializers/peripheral_serializer.rb | 4 -- ...15205625_update_devices_and_peripherals.rb | 6 +++ db/schema.rb | 4 +- lib/log_service_support.rb | 2 +- .../api/sensor_readings/controller_spec.rb | 37 ++++++++++++++++++- webpack/devices/interfaces.ts | 1 + 10 files changed, 54 insertions(+), 28 deletions(-) create mode 100644 db/migrate/20180215205625_update_devices_and_peripherals.rb diff --git a/app/controllers/api/abstract_controller.rb b/app/controllers/api/abstract_controller.rb index 3d1a398fe..35a3d1ce2 100644 --- a/app/controllers/api/abstract_controller.rb +++ b/app/controllers/api/abstract_controller.rb @@ -195,7 +195,8 @@ private # We update this column every time an FBOS device talks to the API. def mark_as_seen(entity = (current_user && current_user.device)) when_farmbot_os do - entity.update_attributes(last_saw_api: Time.now) if entity + entity.update_attributes(last_saw_api: Time.now, + fbos_version: fbos_version.to_s) if entity end end end diff --git a/app/models/application_record.rb b/app/models/application_record.rb index f31031662..fe5746d59 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -12,7 +12,8 @@ class ApplicationRecord < ActiveRecord::Base "sign_in_count", "updated_at", "current_sign_in_ip", - "current_sign_in_at" ] + "current_sign_in_at", + "fbos_version" ] def the_changes self.saved_changes.except(*self.class::DONT_BROADCAST) end diff --git a/app/models/device.rb b/app/models/device.rb index 83ac6dbe1..4a7a3cc6f 100644 --- a/app/models/device.rb +++ b/app/models/device.rb @@ -15,7 +15,7 @@ class Device < ApplicationRecord has_many :tools, dependent: :destroy has_many :images, dependent: :destroy has_many :webcam_feeds, dependent: :destroy - has_many :sensor_reading, dependent: :destroy + has_many :sensor_readings, dependent: :destroy validates :timezone, inclusion: { in: TIMEZONES, message: BAD_TZ, allow_nil: true } @@ -30,22 +30,6 @@ class Device < ApplicationRecord logs.all.last(max_log_count || DEFAULT_MAX_LOGS) end - # def auth_token - # SessionToken.as_json(self.users.first)[:token].encoded - # end - - # # Send a realtime message to a logged in user. - # def tell(message, chan = "toast") - # log = Log.new({ device: self, - # message: message, - # created_at: Time.now, - # channels: [chan], - # meta: { type: "info" } }) - # json = LogSerializer.new(log).as_json.to_json - - # Transport.amqp_send(json, self.id, "logs") - # end - def self.current RequestStore.store[:device] end diff --git a/app/serializers/device_serializer.rb b/app/serializers/device_serializer.rb index d97666779..7425f58be 100644 --- a/app/serializers/device_serializer.rb +++ b/app/serializers/device_serializer.rb @@ -1,6 +1,6 @@ class DeviceSerializer < ActiveModel::Serializer - attributes :id, :name, :timezone, :last_saw_api, :last_saw_mq, - :last_seen, :tz_offset_hrs + attributes :id, :name, :timezone, :last_saw_api, :last_saw_mq, :last_seen, + :tz_offset_hrs, :fbos_version def last_seen # TODO: Remove this by December 2017. diff --git a/app/serializers/peripheral_serializer.rb b/app/serializers/peripheral_serializer.rb index 72787d672..a14943d06 100644 --- a/app/serializers/peripheral_serializer.rb +++ b/app/serializers/peripheral_serializer.rb @@ -1,7 +1,3 @@ class PeripheralSerializer < ActiveModel::Serializer attributes :id, :pin, :label, :mode - - def mode - -1 # DEPRECATED. Still here for legacy reasons. Don't use it. - RC - end end diff --git a/db/migrate/20180215205625_update_devices_and_peripherals.rb b/db/migrate/20180215205625_update_devices_and_peripherals.rb new file mode 100644 index 000000000..41ca44065 --- /dev/null +++ b/db/migrate/20180215205625_update_devices_and_peripherals.rb @@ -0,0 +1,6 @@ +class UpdateDevicesAndPeripherals < ActiveRecord::Migration[5.1] + def change + add_column :devices, :fbos_version, :string, limit: 15 # "99.99.99-rc99" + add_column :peripherals, :mode, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index aa512351f..8e41c9d56 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180215171709) do +ActiveRecord::Schema.define(version: 20180215205625) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -38,6 +38,7 @@ ActiveRecord::Schema.define(version: 20180215171709) do t.string "timezone", limit: 280 t.datetime "last_saw_api" t.datetime "last_saw_mq" + t.string "fbos_version", limit: 15 t.index ["timezone"], name: "index_devices_on_timezone" end @@ -224,6 +225,7 @@ ActiveRecord::Schema.define(version: 20180215171709) do t.string "label", limit: 280 t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "mode" t.index ["device_id"], name: "index_peripherals_on_device_id" end diff --git a/lib/log_service_support.rb b/lib/log_service_support.rb index 3622e551b..6f5e96202 100644 --- a/lib/log_service_support.rb +++ b/lib/log_service_support.rb @@ -29,7 +29,7 @@ class LogService if(major_version >= 6) device_id = delivery_info.routing_key.split(".")[1].gsub("device_", "").to_i if save?(log) - device = Device.find(device_id) + device = Device.find(device_id) db_log = Logs::Create.run!(log, device: device) db_log.save! maybe_clear_logs(device) diff --git a/spec/controllers/api/sensor_readings/controller_spec.rb b/spec/controllers/api/sensor_readings/controller_spec.rb index aadd1f10e..78ea9c20c 100644 --- a/spec/controllers/api/sensor_readings/controller_spec.rb +++ b/spec/controllers/api/sensor_readings/controller_spec.rb @@ -14,7 +14,7 @@ describe Api::SensorReadingsController do body: { pin: 13, value: 128, x: nil, y: 1, z: 2 }.to_json, params: { format: :json } - expect(response.status).to eq(200) + expect(response.status).to eq(200) expect(json[:id]).to be_kind_of(Integer) expect(json[:value]).to eq(128) expect(json[:device_id]).to eq(nil) # Use the serializer, not as_json. @@ -25,6 +25,41 @@ describe Api::SensorReadingsController do expect(before < SensorReading.count).to be_truthy end + it 'shows one reading' do + sign_in user + SensorReading.destroy_all + id = reading.id + get :show, params: { format: :json, id: id } + expect(json).to be_kind_of(Hash) + reading.reload + [ :id, :value, :x, :y, :z, :pin ].map do |attr| + expect(json[attr]).to eq(reading.send(attr)) + end + end + + it 'shows all readings' do + sign_in user + SensorReading.destroy_all + id = reading.id + get :index, params: { format: :json } + expect(json).to be_kind_of(Array) + expect(json.length).to eq(user.device.sensor_readings.length) + keys = json.first.keys + expect(json.map{|x| x[:id] }).to include(id) + expect(keys).to include(:x, :y, :z, :value, :pin) + end + + it 'destroys a reading' do + sign_in user + SensorReading.destroy_all + id = reading.id + before = SensorReading.count + expect(before).to eq(1) + delete :destroy, params: { format: :json, id: id } + expect(SensorReading.where(id: id).count).to eq(0) + expect(before).to be > SensorReading.count + end + it 'requires logged in user' do post :create, params: {} expect(response.status).to eq(401) diff --git a/webpack/devices/interfaces.ts b/webpack/devices/interfaces.ts index 0d39405e8..3450451b3 100644 --- a/webpack/devices/interfaces.ts +++ b/webpack/devices/interfaces.ts @@ -46,6 +46,7 @@ export interface DeviceAccountSettings { name: string; timezone?: string | undefined; tz_offset_hrs: number; + fbos_version?: string | undefined; last_saw_api?: string | undefined; last_saw_mq?: string | undefined; }