.vbw-planning/milestones/03-coverage-analysis-quick-wins-critical-path-test-co/phases/03-large-file-refactoring/PLAN-03.md
Extract app/controllers/source_monitor/import_sessions_controller.rb (792 lines) into focused concerns under app/controllers/source_monitor/import_sessions/. The controller has five distinct responsibility clusters beyond the core CRUD: (1) OPML file parsing and validation, (2) entry annotation/filtering/selection, (3) health check lifecycle management, (4) bulk source configuration. Each becomes a concern module included in the controller. The controller retains the action methods (new, create, show, update, destroy), step handlers, and before_action filters.
Decomposition rationale: ImportSessionsController has four clearly separable responsibility clusters:
The remaining ~400 lines (action methods, step handlers, prepare_* context methods, user auth, step navigation) stay in the controller.
Trade-offs considered:
What constrains the structure:
extend ActiveSupport::Concern and included in the controllerinclude the concerns and delegate appropriatelyname: extract-opml-parser
files:
app/controllers/source_monitor/import_sessions/opml_parser.rb (new)app/controllers/source_monitor/import_sessions_controller.rbaction: Create app/controllers/source_monitor/import_sessions/ directory. Create opml_parser.rb containing a SourceMonitor::ImportSessions::OpmlParser module using extend ActiveSupport::Concern. Move these methods into the concern as private methods:
parse_opml_file (lines 305-327)build_entry (lines 329-353)malformed_entry (lines 355-367)outline_attribute (lines 369-372)valid_feed_url? (lines 374-379)validate_upload! (lines 282-295)content_type_allowed? (lines 297-299)generic_content_type? (lines 301-303)build_file_metadata (lines 255-264)uploading_file? (lines 266-268)Move the constants ALLOWED_CONTENT_TYPES, GENERIC_CONTENT_TYPES, and the UploadError class into the concern as well. In the controller, add include SourceMonitor::ImportSessions::OpmlParser. Remove the moved methods and constants from the controller. Add require "source_monitor/import_sessions/opml_parser" or rely on Rails autoloading in the app/ directory (prefer autoloading since this is in app/).
verify: ruby -c app/controllers/source_monitor/import_sessions/opml_parser.rb exits 0 AND bin/rails test test/controllers/source_monitor/import_sessions_controller_test.rb exits 0
done: OpmlParser concern extracted. Controller includes it. Tests pass.
name: extract-entry-annotation
files:
app/controllers/source_monitor/import_sessions/entry_annotation.rb (new)app/controllers/source_monitor/import_sessions_controller.rbaction: Create entry_annotation.rb containing a SourceMonitor::ImportSessions::EntryAnnotation module using extend ActiveSupport::Concern. Move these methods as private:
annotated_entries (lines 501-523)normalize_entry (lines 561-564)filter_entries (lines 566-575)selectable_entries_from (lines 557-559)selectable_entries (lines 607-609)build_selection_from_params (lines 577-592)health_check_selection_from_params (lines 594-605)advancing_from_health_check? (lines 611-613)advancing_from_preview? (lines 615-617)normalize_page_param (lines 619-625)permitted_filter (lines 778-783)preview_per_page (lines 785-787)In the controller, add include SourceMonitor::ImportSessions::EntryAnnotation. Remove moved methods.
verify: ruby -c app/controllers/source_monitor/import_sessions/entry_annotation.rb exits 0 AND bin/rails test test/controllers/source_monitor/import_sessions_controller_test.rb exits 0
done: EntryAnnotation concern extracted. Tests pass.
name: extract-health-check-management
files:
app/controllers/source_monitor/import_sessions/health_check_management.rb (new)app/controllers/source_monitor/import_sessions_controller.rbaction: Create health_check_management.rb containing a SourceMonitor::ImportSessions::HealthCheckManagement module. Move these methods as private:
start_health_checks_if_needed (lines 627-660)reset_health_results (lines 753-761)enqueue_health_check_jobs (lines 763-767)deactivate_health_checks! (lines 769-776)health_check_entries (lines 525-532)health_check_progress (lines 534-545)health_check_complete? (lines 547-549)health_check_targets (lines 551-555)In the controller, add include SourceMonitor::ImportSessions::HealthCheckManagement. Remove moved methods.
verify: ruby -c app/controllers/source_monitor/import_sessions/health_check_management.rb exits 0 AND bin/rails test test/controllers/source_monitor/import_sessions_controller_test.rb exits 0
done: HealthCheckManagement concern extracted. Tests pass.
name: extract-bulk-configuration
files:
app/controllers/source_monitor/import_sessions/bulk_configuration.rb (new)app/controllers/source_monitor/import_sessions_controller.rbaction: Create bulk_configuration.rb containing a SourceMonitor::ImportSessions::BulkConfiguration module. Move these methods as private:
build_bulk_source (lines 675-682)build_bulk_source_from_session (lines 662-665)build_bulk_source_from_params (lines 667-673)sample_identity_attributes (lines 684-694)selected_entries_for_identity (lines 696-702)fallback_identity (lines 704-709)configure_source_params (lines 711-715)strip_identity_attributes (lines 717-719)persist_bulk_settings_if_valid! (lines 721-727)bulk_settings_payload (lines 729-734)bulk_setting_keys (lines 736-751)In the controller, add include SourceMonitor::ImportSessions::BulkConfiguration. Remove moved methods. After this task, verify the controller is under 300 lines. It should contain: before_actions, new, create, show, update, destroy, set_import_session, set_wizard_step, persist_step!, the 5 handle_step methods, the 4 prepare_context methods, state_params, permitted_step, target_step, session_attributes, auth methods, and the include statements. If the controller is between 300-320 lines, move state_params, session_attributes, permitted_step, and target_step into the EntryAnnotation concern (they're helper methods that support step navigation and parameter handling).
verify: ruby -c app/controllers/source_monitor/import_sessions/bulk_configuration.rb exits 0 AND wc -l app/controllers/source_monitor/import_sessions_controller.rb shows fewer than 300 lines AND bin/rails test test/controllers/source_monitor/import_sessions_controller_test.rb exits 0 AND bin/rails test exits 0 with 760+ runs AND bin/rubocop app/controllers/source_monitor/import_sessions_controller.rb app/controllers/source_monitor/import_sessions/ exits 0
done: BulkConfiguration extracted. Controller under 300 lines. Full suite passes. RuboCop clean. REQ-10 satisfied.
wc -l app/controllers/source_monitor/import_sessions_controller.rb shows fewer than 300 linesls app/controllers/source_monitor/import_sessions/*.rb | wc -l shows 4 filesbin/rails test test/controllers/source_monitor/import_sessions_controller_test.rb exits 0bin/rails test exits 0 (no regressions)bin/rubocop app/controllers/source_monitor/import_sessions_controller.rb app/controllers/source_monitor/import_sessions/ exits 0