From 1475fd4995062f960d85254818c329768779b85f Mon Sep 17 00:00:00 2001 From: Kat Date: Thu, 8 Sep 2022 17:05:15 +0100 Subject: [PATCH] Add a combined logs view to the database using scenic gem --- Gemfile | 1 + Gemfile.lock | 4 +++ app/controllers/lettings_logs_controller.rb | 1 - app/controllers/logs_controller.rb | 3 +-- app/models/log.rb | 2 ++ db/migrate/20220908153924_create_logs_view.rb | 5 ++++ db/schema.rb | 16 ++++++++++- db/views/logs_v01.sql | 15 +++++++++++ spec/requests/logs_controller_spec.rb | 27 +++++++++---------- 9 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 db/migrate/20220908153924_create_logs_view.rb create mode 100644 db/views/logs_v01.sql diff --git a/Gemfile b/Gemfile index ad3e1893d..286ec99c5 100644 --- a/Gemfile +++ b/Gemfile @@ -58,6 +58,7 @@ gem "sentry-ruby" gem "possessive" # Strip whitespace from active record attributes gem "auto_strip_attributes" +gem "scenic" group :development, :test do # Check gems for known vulnerabilities diff --git a/Gemfile.lock b/Gemfile.lock index 4f4b352bb..2a358cc50 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -371,6 +371,9 @@ GEM ruby-progressbar (1.11.0) ruby2_keywords (0.0.5) rubyzip (2.3.2) + scenic (1.6.0) + activerecord (>= 4.0.0) + railties (>= 4.0.0) selenium-webdriver (4.4.0) childprocess (>= 0.5, < 5.0) rexml (~> 3.2, >= 3.2.5) @@ -467,6 +470,7 @@ DEPENDENCIES rubocop-govuk (= 4.3.0) rubocop-performance rubocop-rails + scenic selenium-webdriver sentry-rails sentry-ruby diff --git a/app/controllers/lettings_logs_controller.rb b/app/controllers/lettings_logs_controller.rb index df645b2d4..10b64d830 100644 --- a/app/controllers/lettings_logs_controller.rb +++ b/app/controllers/lettings_logs_controller.rb @@ -1,5 +1,4 @@ class LettingsLogsController < LogsController - before_action :find_resource, except: %i[create index edit] def index diff --git a/app/controllers/logs_controller.rb b/app/controllers/logs_controller.rb index 384b19c89..ea140426f 100644 --- a/app/controllers/logs_controller.rb +++ b/app/controllers/logs_controller.rb @@ -1,5 +1,4 @@ class LogsController < ApplicationController - include Pagy::Backend include Modules::LogsFilter include Modules::SearchFilter @@ -11,7 +10,7 @@ class LogsController < ApplicationController def index set_session_filters - all_logs = current_user.lettings_logs + current_user.sales_logs + all_logs = current_user.lettings_logs + current_user.sales_logs unpaginated_filtered_logs = filtered_logs(filtered_collection(all_logs, search_term)) respond_to do |format| diff --git a/app/models/log.rb b/app/models/log.rb index dadf14f4b..57d2935ad 100644 --- a/app/models/log.rb +++ b/app/models/log.rb @@ -5,6 +5,8 @@ class Log < ApplicationRecord belongs_to :managing_organisation, class_name: "Organisation", optional: true belongs_to :created_by, class_name: "User", optional: true + scope :combined, -> { ActiveRecord::Base.connection.execute("SELECT * FROM logs") } + def collection_start_year return @start_year if @start_year return unless startdate diff --git a/db/migrate/20220908153924_create_logs_view.rb b/db/migrate/20220908153924_create_logs_view.rb new file mode 100644 index 000000000..7827e38a1 --- /dev/null +++ b/db/migrate/20220908153924_create_logs_view.rb @@ -0,0 +1,5 @@ +class CreateLogsView < ActiveRecord::Migration[7.0] + def change + create_view :logs + end +end diff --git a/db/schema.rb b/db/schema.rb index 3d4db46c2..a4c9209d5 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[7.0].define(version: 2022_09_02_082245) do +ActiveRecord::Schema[7.0].define(version: 2022_09_08_153924) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -412,4 +412,18 @@ ActiveRecord::Schema[7.0].define(version: 2022_09_02_082245) do add_foreign_key "schemes", "organisations", column: "managing_organisation_id" add_foreign_key "schemes", "organisations", column: "owning_organisation_id", on_delete: :cascade add_foreign_key "users", "organisations", on_delete: :cascade + + create_view "logs", sql_definition: <<-SQL + SELECT lettings_logs.id, + lettings_logs.status, + lettings_logs.created_at, + 'lettings'::text AS log_type + FROM lettings_logs + UNION + SELECT sales_logs.id, + sales_logs.status, + sales_logs.created_at, + 'sales'::text AS log_type + FROM sales_logs; + SQL end diff --git a/db/views/logs_v01.sql b/db/views/logs_v01.sql new file mode 100644 index 000000000..095c5b3e6 --- /dev/null +++ b/db/views/logs_v01.sql @@ -0,0 +1,15 @@ +SELECT + id, + status, + created_at, + 'lettings' as log_type +FROM lettings_logs + +UNION + +SELECT + id, + status, + created_at, + 'sales' as log_type +FROM sales_logs diff --git a/spec/requests/logs_controller_spec.rb b/spec/requests/logs_controller_spec.rb index e123af1ab..f0c2899c4 100644 --- a/spec/requests/logs_controller_spec.rb +++ b/spec/requests/logs_controller_spec.rb @@ -1,20 +1,19 @@ require "rails_helper" RSpec.describe LettingsLogsController, type: :request do + describe "index" do + let(:user) { FactoryBot.create(:user) } + let(:page) { Capybara::Node::Simple.new(response.body) } - describe "index" do - let(:user) { FactoryBot.create(:user) } - let(:page) { Capybara::Node::Simple.new(response.body) } - - before do - sign_in user - FactoryBot.create_list(:lettings_log, 3, :completed, owning_organisation: user.organisation, created_by: user) - FactoryBot.create_list(:sales_log, 3, owning_organisation: user.organisation, created_by: user) - end + before do + sign_in user + FactoryBot.create_list(:lettings_log, 3, :completed, owning_organisation: user.organisation, created_by: user) + FactoryBot.create_list(:sales_log, 3, owning_organisation: user.organisation, created_by: user) + end - it "shows both lettings and sales logs" do - get "/logs" - expect(page).to have_content("6 total logs") - end + it "shows both lettings and sales logs" do + get "/logs" + expect(page).to have_content("6 total logs") end -end \ No newline at end of file + end +end