From 2a6fe06ba3cffe7a018508145832052e2cefdb79 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 13 Feb 2020 13:10:48 -0600 Subject: [PATCH 1/2] Cap sensor readings to 5,000 count --- .../api/sensor_readings_controller.rb | 22 ++++++++++++++++--- .../api/sensor_readings/controller_spec.rb | 19 ++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/sensor_readings_controller.rb b/app/controllers/api/sensor_readings_controller.rb index a0e945873..65feb4c28 100644 --- a/app/controllers/api/sensor_readings_controller.rb +++ b/app/controllers/api/sensor_readings_controller.rb @@ -1,7 +1,10 @@ module Api class SensorReadingsController < Api::AbstractController + LIMIT = 5000 + before_action :clean_old + def create - mutate SensorReadings::Create.run(raw_json, device: current_device) + mutate SensorReadings::Create.run(raw_json, device: current_device) end def index @@ -17,10 +20,23 @@ module Api render json: "" end - private + private + + def clean_old + if current_device.sensor_readings.count > LIMIT + current_device + .sensor_readings + .where + .not(id: readings.pluck(:id)) + .delete_all + end + end def readings - SensorReading.where(device: current_device) + @readings ||= SensorReading + .where(device: current_device) + .order(created_at: :desc) + .limit(LIMIT) end def reading diff --git a/spec/controllers/api/sensor_readings/controller_spec.rb b/spec/controllers/api/sensor_readings/controller_spec.rb index 19a1e8612..9f0aea4fb 100644 --- a/spec/controllers/api/sensor_readings/controller_spec.rb +++ b/spec/controllers/api/sensor_readings/controller_spec.rb @@ -18,7 +18,7 @@ describe Api::SensorReadingsController do x: nil, y: 1, z: 2, - mode: 1 + mode: 1, }.to_json, params: { format: :json } @@ -40,7 +40,7 @@ describe Api::SensorReadingsController do y: 1, z: 2, mode: 1, - read_at: read_at + read_at: read_at, }.to_json, params: { format: :json } @@ -105,5 +105,20 @@ describe Api::SensorReadingsController do post :create, body: {}.to_json expect(response.status).to eq(401) end + + it "cleans up excess logs" do + const_reassign(Api::SensorReadingsController, :LIMIT, 5) + sign_in user + 10.times do |n| + FactoryBot.create(:sensor_reading, + device: user.device, + created_at: n.minutes.ago) + end + expect(user.device.sensor_readings.count).to eq(10) + get :index, params: { format: :json } + expect(json.count).to eq(5) + expect(user.device.sensor_readings.count).to eq(5) + const_reassign(Api::SensorReadingsController, :LIMIT, 5000) + end end end From c1a9bc63bf0b97ed4228a3ebe6937ce41056b3d8 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 13 Feb 2020 13:15:37 -0600 Subject: [PATCH 2/2] SensorReadingController test improvement --- spec/controllers/api/sensor_readings/controller_spec.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spec/controllers/api/sensor_readings/controller_spec.rb b/spec/controllers/api/sensor_readings/controller_spec.rb index 9f0aea4fb..7f544917c 100644 --- a/spec/controllers/api/sensor_readings/controller_spec.rb +++ b/spec/controllers/api/sensor_readings/controller_spec.rb @@ -119,6 +119,9 @@ describe Api::SensorReadingsController do expect(json.count).to eq(5) expect(user.device.sensor_readings.count).to eq(5) const_reassign(Api::SensorReadingsController, :LIMIT, 5000) + first = (json.first[:created_at]) + last = (json.last[:created_at]) + expect(first).to be > last end end end