Browse Source

Add a combined logs view to the database using scenic gem

pull/863/head
Kat 3 years ago committed by baarkerlounger
parent
commit
1475fd4995
  1. 1
      Gemfile
  2. 4
      Gemfile.lock
  3. 1
      app/controllers/lettings_logs_controller.rb
  4. 3
      app/controllers/logs_controller.rb
  5. 2
      app/models/log.rb
  6. 5
      db/migrate/20220908153924_create_logs_view.rb
  7. 16
      db/schema.rb
  8. 15
      db/views/logs_v01.sql
  9. 27
      spec/requests/logs_controller_spec.rb

1
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

4
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

1
app/controllers/lettings_logs_controller.rb

@ -1,5 +1,4 @@
class LettingsLogsController < LogsController
before_action :find_resource, except: %i[create index edit]
def index

3
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|

2
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

5
db/migrate/20220908153924_create_logs_view.rb

@ -0,0 +1,5 @@
class CreateLogsView < ActiveRecord::Migration[7.0]
def change
create_view :logs
end
end

16
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

15
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

27
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
end
end

Loading…
Cancel
Save