class AdLocalize::Interactors::ExportGSpreadsheet

Public Class Methods

new(value_range_to_wording: nil) click to toggle source
# File lib/ad_localize/interactors/export_g_spreadsheet.rb, line 4
def initialize(value_range_to_wording: nil)
  @value_range_to_wording = value_range_to_wording.presence || Mappers::ValueRangeToWording.new
  @g_sheets_repository = Repositories::GSheetsRepository.new
end

Public Instance Methods

call(export_request:) click to toggle source
# File lib/ad_localize/interactors/export_g_spreadsheet.rb, line 9
def call(export_request:)
  LOGGER.debug("Starting export google spreadsheet")
  if export_request.g_spreadsheet_options.service_account_config
    export_with_service_account(export_request: export_request)
  else
    export_without_service_account(export_request: export_request)
  end
end

Private Instance Methods

download_public_sheet(url:) click to toggle source
# File lib/ad_localize/interactors/export_g_spreadsheet.rb, line 49
def download_public_sheet(url:)
  tempfile = Tempfile.new
  URI.open(url) do |uri_io|
    tempfile.write uri_io.read
    tempfile.rewind
  end
  tempfile
end
export_with_service_account(export_request:) click to toggle source
# File lib/ad_localize/interactors/export_g_spreadsheet.rb, line 20
def export_with_service_account(export_request:)
  LOGGER.debug("Using service account")
  value_ranges = @g_sheets_repository.get_sheets_values(g_spreadsheet_options: export_request.g_spreadsheet_options)
  wordings = value_ranges.map { |value_range| @value_range_to_wording.map(value_range: value_range) }
  wording = MergeWordings.new.call(wordings: wordings.compact, merge_policy: export_request.merge_policy)
  ExportWording.new.call(export_request: export_request, wording: wording)
end
export_without_service_account(export_request:) click to toggle source
# File lib/ad_localize/interactors/export_g_spreadsheet.rb, line 28
def export_without_service_account(export_request:)
  LOGGER.debug("Using direct access to spreadsheet")
  downloaded_files = export_request.g_spreadsheet_options.public_download_urls.map do |sheet_download_url|
    download_public_sheet(url: sheet_download_url)
  end
  export_request.csv_paths = downloaded_files.map(&:path)
  if export_request.has_csv_files?
    ExportCSVFiles.new.call(export_request: export_request)
  elsif export_request.has_empty_files?
    # When downloading an empty spreadsheet, the content type of the downloaded file is "inode/x-empty"
    LOGGER.warn("Your spreadsheet is empty. Add content and retry.")
  else
    # When shared configuration is misconfigured, the content type of the downloaded file is "text/html"
    LOGGER.error("Invalid export request. Check the spreadsheet share configuration")
  end
  downloaded_files.select { |downloaded_file| File.exist?(downloaded_file.path) }.each do |downloaded_file|
    downloaded_file.close
    downloaded_file.unlink
  end
end