From 077894bb4d0af4356750d146dcbae6fdc1a23268 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 19 Dec 2019 19:32:51 -0600 Subject: [PATCH] Add `read_at` column to `sensor_readings` table. Closes #1363 --- app/mutations/sensor_readings/create.rb | 3 +- app/serializers/sensor_reading_serializer.rb | 9 +++++- ...20010646_add_read_at_to_sensor_readings.rb | 5 +++ db/structure.sql | 6 ++-- .../__test_support__/fake_state/resources.ts | 1 + package.json | 2 +- .../api/sensor_readings/controller_spec.rb | 31 ++++++++++++++++++- 7 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 db/migrate/20191220010646_add_read_at_to_sensor_readings.rb diff --git a/app/mutations/sensor_readings/create.rb b/app/mutations/sensor_readings/create.rb index 0688f7d7f9..56762bca5e 100644 --- a/app/mutations/sensor_readings/create.rb +++ b/app/mutations/sensor_readings/create.rb @@ -10,13 +10,14 @@ class Create < Mutations::Command end optional do + time :read_at integer :mode, in: CeleryScriptSettingsBag::ALLOWED_PIN_MODES, default: CeleryScriptSettingsBag::DIGITAL end def execute - SensorReading.create!(inputs) + SensorReading.create!(inputs.merge(read_at: read_at || Time.now)) end end end diff --git a/app/serializers/sensor_reading_serializer.rb b/app/serializers/sensor_reading_serializer.rb index cc19555dec..8cc4c0776e 100644 --- a/app/serializers/sensor_reading_serializer.rb +++ b/app/serializers/sensor_reading_serializer.rb @@ -1,3 +1,10 @@ class SensorReadingSerializer < ApplicationSerializer - attributes :mode, :pin, :value, :x, :y, :z + attributes :mode, :pin, :value, :x, :y, :z, :read_at + # This is for legacy support reasons. + # Very old sensor_readings will have a + # read_at value of `nil`, so we pre-populate it + # to `created_at` for the convinience of API users. + def read_at + object.read_at || object.created_at + end end diff --git a/db/migrate/20191220010646_add_read_at_to_sensor_readings.rb b/db/migrate/20191220010646_add_read_at_to_sensor_readings.rb new file mode 100644 index 0000000000..040deedce4 --- /dev/null +++ b/db/migrate/20191220010646_add_read_at_to_sensor_readings.rb @@ -0,0 +1,5 @@ +class AddReadAtToSensorReadings < ActiveRecord::Migration[6.0] + def change + add_column :sensor_readings, :read_at, :datetime, default: nil + end +end diff --git a/db/structure.sql b/db/structure.sql index d988eb0f09..4456e5c10b 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1483,7 +1483,8 @@ CREATE TABLE public.sensor_readings ( pin integer, created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone NOT NULL, - mode integer DEFAULT 0 + mode integer DEFAULT 0, + read_at timestamp without time zone ); @@ -3444,6 +3445,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20191107170431'), ('20191119204916'), ('20191203163621'), -('20191219212755'); +('20191219212755'), +('20191220010646'); diff --git a/frontend/__test_support__/fake_state/resources.ts b/frontend/__test_support__/fake_state/resources.ts index 65681e3225..dce3f5caba 100644 --- a/frontend/__test_support__/fake_state/resources.ts +++ b/frontend/__test_support__/fake_state/resources.ts @@ -229,6 +229,7 @@ export function fakeSensorReading(): TaggedSensorReading { return fakeResource("SensorReading", { id: idCounter++, created_at: "2018-01-11T20:20:38.362Z", + read_at: "2018-01-11T20:20:38.362Z", pin: 1, value: 0, mode: 0, diff --git a/package.json b/package.json index d0a829a626..d95ab26855 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "coveralls": "3.0.9", "enzyme": "3.10.0", "enzyme-adapter-react-16": "1.15.1", - "farmbot": "9.0.0-rc1", + "farmbot": "9.0.0", "i18next": "19.0.2", "install": "0.13.0", "lodash": "4.17.15", diff --git a/spec/controllers/api/sensor_readings/controller_spec.rb b/spec/controllers/api/sensor_readings/controller_spec.rb index 0498b6f052..34d594ff10 100644 --- a/spec/controllers/api/sensor_readings/controller_spec.rb +++ b/spec/controllers/api/sensor_readings/controller_spec.rb @@ -7,11 +7,39 @@ let(:user) { FactoryBot.create(:user) } let (:reading) { FactoryBot.create(:sensor_reading, device: user.device) } + it "sets a default `read_at` value" do + sign_in user + before = SensorReading.count + read_at = Time.now - 5.hours + post :create, + body: { + pin: 13, + value: 128, + x: nil, + y: 1, + z: 2, + mode: 1 + }.to_json, + params: { format: :json } + + expect(response.status).to eq(200) + expect(json[:created_at]).to eq(json[:read_at]) + end + it "makes a sensor reading" do sign_in user before = SensorReading.count + read_at = Time.now - 5.hours post :create, - body: { pin: 13, value: 128, x: nil, y: 1, z: 2, mode: 1 }.to_json, + body: { + pin: 13, + value: 128, + x: nil, + y: 1, + z: 2, + mode: 1, + read_at: read_at + }.to_json, params: { format: :json } expect(response.status).to eq(200) @@ -24,6 +52,7 @@ expect(json[:z]).to eq(2) expect(json[:pin]).to eq(13) expect(json[:mode]).to eq(1) + expect(read_at.as_json.first(23)).to eq(json[:read_at].first(23)) expect(before < SensorReading.count).to be_truthy end