CartoDB/cartodb20

View on GitHub
services/importer/lib/importer/mail_notifier.rb

Summary

Maintainability
A
0 mins
Test Coverage
require_relative '../../../../lib/resque/user_jobs'

module CartoDB
  module Importer2
    class MailNotifier
      MIN_IMPORT_TIME_TO_NOTIFY = 3 * 60 # seconds

      def initialize(data_import, results, resque)
        @data_import = data_import
        @results = results
        @resque = resque
        @mail_sent = false
      end

      def notify_if_needed
        send! if should_notify?
      end

      def should_notify?
        import_time >= MIN_IMPORT_TIME_TO_NOTIFY && @data_import.synchronization_id.nil? && @data_import.final_state?
      end

      def import_time
        @data_import.updated_at - @data_import.created_at
      end

      def send!
        user_id = @data_import.user_id
        filenames = extract_file_names(@data_import)
        imported_tables = @results.select {|r| r.success }.length
        total_tables = @results.length
        first_imported_table = imported_tables == 0 ? nil : @results.select {|r| r.success }.first
        first_table = @results.first
        error_text = @data_import.get_error_text
        errors = error_text.present? ? error_text : nil
        @mail_sent = @resque.enqueue(::Resque::UserJobs::Mail::DataImportFinished,
                                     user_id, imported_tables, total_tables, first_imported_table,
                                     first_table, errors, filenames)
      end

      def extract_file_names(data_import)
        files = []

        begin
          file_stats = JSON.parse(data_import.stats)
        rescue JSON::ParserError
          file_stats = []
        end

        if !file_stats.empty?
          file_stats.each do |file_data|
            files << file_data['filename']
          end
        else
          # This case happens before process the files when there
          # is no file stats
          if data_import.service_name == 'connector'
            # Connector imports have all its parameters in service_item_id
            # but we don't want to make them visible because they may contain
            # credentials
            files << "(connector)"
          elsif !data_import.service_item_id.blank?
            # Imports from files, URLs  have a service_item_id
            files << File.basename(data_import.service_item_id)
          elsif !data_import.table_name.blank?
            # Imports from queries or table duplications use table_name
            files << File.basename(data_import.table_name)
          end
        end

        files
      end

      def mail_sent?
        return @mail_sent
      end
    end
  end
end