Browse Source

refactor: combine filter_manager into filter_service

pull/1675/head
natdeanlewissoftwire 3 years ago
parent
commit
2df4d54eb5
  1. 20
      app/controllers/lettings_logs_controller.rb
  2. 20
      app/controllers/organisations_controller.rb
  3. 20
      app/controllers/sales_logs_controller.rb
  4. 34
      app/models/filter_manager.rb
  5. 46
      app/services/filter_service.rb

20
app/controllers/lettings_logs_controller.rb

@ -4,7 +4,7 @@ class LettingsLogsController < LogsController
before_action :find_resource, only: %i[update show]
before_action :session_filters, if: :current_user, only: %i[index email_csv download_csv]
before_action :set_session_filters, if: :current_user, only: %i[index email_csv download_csv]
before_action -> { filter_service.serialize_filters_to_session }, if: :current_user, only: %i[index email_csv download_csv]
before_action :authenticate_scope!, only: %i[download_csv email_csv]
before_action :extract_bulk_upload_from_session_filters, only: [:index]
@ -14,7 +14,7 @@ class LettingsLogsController < LogsController
respond_to do |format|
format.html do
all_logs = current_user.lettings_logs.visible
unpaginated_filtered_logs = filter_manager.filtered_logs(all_logs, search_term, session_filters)
unpaginated_filtered_logs = filter_service.filtered_logs(all_logs, search_term, session_filters)
@search_term = search_term
@pagy, @logs = pagy(unpaginated_filtered_logs)
@ -87,7 +87,7 @@ class LettingsLogsController < LogsController
end
def download_csv
unpaginated_filtered_logs = filter_manager.filtered_logs(current_user.lettings_logs, search_term, session_filters)
unpaginated_filtered_logs = filter_service.filtered_logs(current_user.lettings_logs, search_term, session_filters)
render "download_csv", locals: { search_term:, count: unpaginated_filtered_logs.size, post_path: email_csv_lettings_logs_path, codes_only: codes_only_export? }
end
@ -114,16 +114,12 @@ class LettingsLogsController < LogsController
private
def set_session_filters
filter_manager.serialize_filters_to_session
end
def session_filters
filter_manager.session_filters
filter_service.session_filters
end
def filter_manager
FilterManager.new(current_user:, session:, params:, filter_type: "lettings_logs")
def filter_service
FilterService.new(current_user:, session:, params:, filter_type: "lettings_logs")
end
def org_params
@ -143,8 +139,8 @@ private
end
def extract_bulk_upload_from_session_filters
filter_service = FilterService.new(current_user:, session:)
@bulk_upload = filter_service.bulk_upload("lettings_logs")
filter_service = FilterService.new(current_user:, session:, params:, filter_type: "lettings_logs")
@bulk_upload = filter_service.bulk_upload
end
def permitted_log_params

20
app/controllers/organisations_controller.rb

@ -6,7 +6,7 @@ class OrganisationsController < ApplicationController
before_action :find_resource, except: %i[index new create]
before_action :authenticate_scope!, except: [:index]
before_action :session_filters, if: -> { current_user.support? || current_user.organisation.has_managing_agents? }, only: %i[lettings_logs sales_logs email_lettings_csv download_lettings_csv email_sales_csv download_sales_csv]
before_action :set_session_filters, if: -> { current_user.support? || current_user.organisation.has_managing_agents? }, only: %i[lettings_logs sales_logs email_lettings_csv download_lettings_csv email_sales_csv download_sales_csv]
before_action -> { filter_service.serialize_filters_to_session }, if: -> { current_user.support? || current_user.organisation.has_managing_agents? }, only: %i[lettings_logs sales_logs email_lettings_csv download_lettings_csv email_sales_csv download_sales_csv]
def index
redirect_to organisation_path(current_user.organisation) unless current_user.support?
@ -90,7 +90,7 @@ class OrganisationsController < ApplicationController
def lettings_logs
organisation_logs = LettingsLog.visible.where(owning_organisation_id: @organisation.id)
unpaginated_filtered_logs = filter_manager.filtered_logs(organisation_logs, search_term, session_filters)
unpaginated_filtered_logs = filter_service.filtered_logs(organisation_logs, search_term, session_filters)
respond_to do |format|
format.html do
@ -107,7 +107,7 @@ class OrganisationsController < ApplicationController
def download_lettings_csv
organisation_logs = LettingsLog.visible.where(owning_organisation_id: @organisation.id)
unpaginated_filtered_logs = filter_manager.filtered_logs(organisation_logs, search_term, session_filters)
unpaginated_filtered_logs = filter_service.filtered_logs(organisation_logs, search_term, session_filters)
codes_only = params.require(:codes_only) == "true"
render "logs/download_csv", locals: { search_term:, count: unpaginated_filtered_logs.size, post_path: lettings_logs_email_csv_organisation_path, codes_only: }
@ -120,7 +120,7 @@ class OrganisationsController < ApplicationController
def sales_logs
organisation_logs = SalesLog.where(owning_organisation_id: @organisation.id)
unpaginated_filtered_logs = filter_manager.filtered_logs(organisation_logs, search_term, session_filters)
unpaginated_filtered_logs = filter_service.filtered_logs(organisation_logs, search_term, session_filters)
respond_to do |format|
format.html do
@ -141,7 +141,7 @@ class OrganisationsController < ApplicationController
def download_sales_csv
organisation_logs = SalesLog.visible.where(owning_organisation_id: @organisation.id)
unpaginated_filtered_logs = filter_manager.filtered_logs(organisation_logs, search_term, session_filters)
unpaginated_filtered_logs = filter_service.filtered_logs(organisation_logs, search_term, session_filters)
codes_only = params.require(:codes_only) == "true"
render "logs/download_csv", locals: { search_term:, count: unpaginated_filtered_logs.size, post_path: sales_logs_email_csv_organisation_path, codes_only: }
@ -166,16 +166,12 @@ private
end
end
def set_session_filters
filter_manager.serialize_filters_to_session(specific_org: true)
end
def session_filters
filter_manager.session_filters(specific_org: true)
filter_service.session_filters
end
def filter_manager
FilterManager.new(current_user:, session:, params:, filter_type:)
def filter_service
FilterService.new(current_user:, session:, params:, filter_type:)
end
def org_params

20
app/controllers/sales_logs_controller.rb

@ -2,7 +2,7 @@ class SalesLogsController < LogsController
rescue_from ActiveRecord::RecordNotFound, with: :render_not_found
before_action :session_filters, if: :current_user, only: %i[index email_csv download_csv]
before_action :set_session_filters, if: :current_user, only: %i[index email_csv download_csv]
before_action -> { filter_service.serialize_filters_to_session }, if: :current_user, only: %i[index email_csv download_csv]
before_action :authenticate_scope!, only: %i[download_csv email_csv]
before_action :extract_bulk_upload_from_session_filters, only: [:index]
@ -16,7 +16,7 @@ class SalesLogsController < LogsController
respond_to do |format|
format.html do
all_logs = current_user.sales_logs.visible
unpaginated_filtered_logs = filter_manager.filtered_logs(all_logs, search_term, session_filters)
unpaginated_filtered_logs = filter_service.filtered_logs(all_logs, search_term, session_filters)
@search_term = search_term
@pagy, @logs = pagy(unpaginated_filtered_logs)
@ -58,7 +58,7 @@ class SalesLogsController < LogsController
end
def download_csv
unpaginated_filtered_logs = filter_manager.filtered_logs(current_user.sales_logs, search_term, session_filters)
unpaginated_filtered_logs = filter_service.filtered_logs(current_user.sales_logs, search_term, session_filters)
render "download_csv", locals: { search_term:, count: unpaginated_filtered_logs.size, post_path: email_csv_sales_logs_path, codes_only: codes_only_export? }
end
@ -81,21 +81,17 @@ class SalesLogsController < LogsController
private
def set_session_filters
filter_manager.serialize_filters_to_session
end
def session_filters
filter_manager.session_filters
filter_service.session_filters
end
def filter_manager
FilterManager.new(current_user:, session:, params:, filter_type: "sales_logs")
def filter_service
FilterService.new(current_user:, session:, params:, filter_type: "sales_logs")
end
def extract_bulk_upload_from_session_filters
filter_service = FilterService.new(current_user:, session:)
@bulk_upload = filter_service.bulk_upload("sales_logs")
filter_service = FilterService.new(current_user:, session:, params:, filter_type: "lettings_logs")
@bulk_upload = filter_service.bulk_upload
end
def redirect_if_bulk_upload_resolved

34
app/models/filter_manager.rb

@ -1,34 +0,0 @@
class FilterManager
attr_reader :current_user, :session, :params, :filter_type
def initialize(current_user:, session:, params:, filter_type:)
@current_user = current_user
@session = session
@params = params
@filter_type = filter_type
end
def serialize_filters_to_session(specific_org: false)
session["#{@filter_type}_filters"] = session_filters(specific_org:).to_json
end
def session_filters(specific_org: false)
@session_filters ||= deserialize_filters_from_session(specific_org)
end
def deserialize_filters_from_session(specific_org)
current_filters = session["#{@filter_type}_filters"]
new_filters = current_filters.present? ? JSON.parse(current_filters) : {}
if @filter_type.include?("logs")
current_user.logs_filters(specific_org:).each do |filter|
new_filters[filter] = params[filter] if params[filter].present?
end
end
params["organisation_select"] == "all" ? new_filters.except("organisation") : new_filters
end
def filtered_logs(logs, search_term, filters)
all_orgs = params["organisation_select"] == "all"
FilterService.filter_logs(logs, search_term, filters, all_orgs, current_user)
end
end

46
app/services/filter_service.rb

@ -1,5 +1,14 @@
class FilterService
def self.filter_by_search(base_collection, search_term = nil)
attr_reader :current_user, :session, :params, :filter_type
def initialize(current_user:, session:, params:, filter_type:)
@current_user = current_user
@session = session
@params = params
@filter_type = filter_type
end
def filter_by_search(base_collection, search_term = nil)
if search_term.present?
base_collection.search_by(search_term)
else
@ -7,7 +16,7 @@ class FilterService
end
end
def self.filter_logs(logs, search_term, filters, all_orgs, user)
def filter_logs(logs, search_term, filters, all_orgs, user)
logs = filter_by_search(logs, search_term)
filters.each do |category, values|
@ -28,21 +37,38 @@ class FilterService
end
end
attr_reader :current_user, :session
def serialize_filters_to_session(specific_org: false)
session["#{@filter_type}_filters"] = session_filters(specific_org:).to_json
end
def initialize(current_user:, session:)
@current_user = current_user
@session = session
def session_filters(specific_org: false)
@session_filters ||= deserialize_filters_from_session(specific_org)
end
def deserialize_filters_from_session(specific_org)
current_filters = session["#{@filter_type}_filters"]
new_filters = current_filters.present? ? JSON.parse(current_filters) : {}
if @filter_type.include?("logs")
current_user.logs_filters(specific_org:).each do |filter|
new_filters[filter] = params[filter] if params[filter].present?
end
end
params["organisation_select"] == "all" ? new_filters.except("organisation") : new_filters
end
def filtered_logs(logs, search_term, filters)
all_orgs = params["organisation_select"] == "all"
filter_logs(logs, search_term, filters, all_orgs, current_user)
end
def bulk_upload(filter_type)
id = (logs_filters(filter_type)["bulk_upload_id"] || []).reject(&:blank?)[0]
def bulk_upload
id = (logs_filters["bulk_upload_id"] || []).reject(&:blank?)[0]
@bulk_upload ||= current_user.bulk_uploads.find_by(id:)
end
private
def logs_filters(filter_type)
JSON.parse(session["#{filter_type}_filters"] || "{}") || {}
def logs_filters
JSON.parse(session["#{@filter_type}_filters"] || "{}") || {}
end
end

Loading…
Cancel
Save