{"record":{"id":"1960bbf8ab7f180e","repo":"chatwoot/chatwoot","slug":"unsupported-import-source","errorCode":null,"errorMessage":"Unsupported import source.","messagePattern":"Unsupported import source\\.","errorType":"validation","errorClass":"ArgumentError","httpStatus":422,"severity":"error","filePath":"app/services/data_imports/source.rb","lineNumber":15,"sourceCode":"class DataImports::Source\n  PROVIDERS = {\n    'freshdesk' => 'DataImports::Freshdesk::Source',\n    'intercom' => 'DataImports::Intercom::Source'\n  }.freeze\n\n  def self.for(data_import)\n    source_class(data_import.source_provider).new(\n      access_token: data_import.access_token,\n      source_metadata: data_import.source_metadata\n    )\n  end\n\n  def self.source_class(provider)\n    PROVIDERS.fetch(provider.to_s) { raise ArgumentError, 'Unsupported import source.' }.constantize\n  end\n\n  def self.supported?(provider)\n    PROVIDERS.key?(provider.to_s)\n  end\nend\n","sourceCodeStart":1,"sourceCodeEnd":22,"githubUrl":"https://github.com/chatwoot/chatwoot/blob/ed230f9bc068e7a13dd5c0404d5465a204b68d4c/app/services/data_imports/source.rb#L1-L22","documentation":"Raised by DataImports::Source.source_class when data_import.source_provider is not a key of the PROVIDERS map ({ 'freshdesk' => ..., 'intercom' => ... }); PROVIDERS.fetch with a raise block produces ArgumentError 'Unsupported import source.'. This factory resolves which provider-specific Source class backs a DataImport, so an unknown provider has no implementation to instantiate.","triggerScenarios":"DataImports::Source.for(data_import) with source_provider nil, 'zendesk', 'zoho', or any string other than 'freshdesk'/'intercom'; calling source_class('salesforce') directly.","commonSituations":"DataImport row created via console/API with a typo'd or future provider; provider column written before the supporting code shipped; nil provider from a bad migration or unfiltered params.","solutions":["Set source_provider to 'freshdesk' or 'intercom' (exact lowercase string).","Guard the call with DataImports::Source.supported?(provider) and show a clear unsupported-source message instead of raising.","If adding a new provider, register it in the PROVIDERS map and implement the matching Source class."],"exampleFix":"# before\nDataImports::Source.source_class('zendesk') # raises ArgumentError: Unsupported import source.\n\n# after\nunless DataImports::Source.supported?(data_import.source_provider)\n  return unsupported_provider_response\nend\nsource = DataImports::Source.for(data_import)","handlingStrategy":"validation","validationCode":"unless DataImports::Source.supported?(data_import.source_provider)\n  render_error('Unsupported import source.') && next\nend\nsource = DataImports::Source.for(data_import)","typeGuard":"def supported_import_source?(provider)\n  %w[freshdesk intercom].include?(provider.to_s)\nend","tryCatchPattern":null,"preventionTips":["Call DataImports::Source.supported?(provider) before .for(data_import).","Constrain source_provider at the model layer (inclusion validation) so bad rows cannot be created.","Gate the provider dropdown in the UI to registered providers only."],"tags":["data-import","provider","factory","argument-error"],"backgroundTag":"unsupported-provider","analyzedSha":"ed230f9bc068e7a13dd5c0404d5465a204b68d4c","analyzedAt":"2026-08-21T12:45:25.920Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}