diff --git a/app/controllers/lettings_logs_controller.rb b/app/controllers/lettings_logs_controller.rb index 88e32e6fe..39af74d6c 100644 --- a/app/controllers/lettings_logs_controller.rb +++ b/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 diff --git a/app/controllers/organisations_controller.rb b/app/controllers/organisations_controller.rb index 50d104541..13ca25e27 100644 --- a/app/controllers/organisations_controller.rb +++ b/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 diff --git a/app/controllers/sales_logs_controller.rb b/app/controllers/sales_logs_controller.rb index 3b7d04698..944033e9b 100644 --- a/app/controllers/sales_logs_controller.rb +++ b/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 diff --git a/app/models/filter_manager.rb b/app/models/filter_manager.rb deleted file mode 100644 index b5ee34c88..000000000 --- a/app/models/filter_manager.rb +++ /dev/null @@ -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 diff --git a/app/services/filter_service.rb b/app/services/filter_service.rb index 4e998ca50..f98a5cc34 100644 --- a/app/services/filter_service.rb +++ b/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