Sha256: bf7d0b0de1f91eb24ac1d19be5e551dd5c49ded6c35313ab0272075056fe8140

Contents?: true

Size: 1.74 KB

Versions: 62

Compression:

Stored size: 1.74 KB

Contents

module Workarea
  class ExportReport
    attr_reader :report, :csv

    def initialize(report, csv)
      @report = report
      @csv = csv
    end

    def save!
      report
        .reporting_class
        .collection
        .aggregate(report.aggregation + [{ '$out' => collection.name }])
        .first # make the aggregation run
    end

    def perform!
      save!
      has_headers = false

      for_each do |result|
        hash = result.to_h.except(*ignored_fields)

        unless has_headers
          csv << hash.keys
          has_headers = true
        end

        csv << hash.values
      end

    ensure
      destroy!
    end

    def destroy!
      collection.drop
    end

    def view_model
      @view_model ||= "Workarea::Admin::Reports::#{report.class.to_s.demodulize}ViewModel".constantize
    end

    def collection
      @collection ||= Mongo::Collection.new(
        report.reporting_class.collection.database,
        "#{report.class.name.demodulize.underscore}_#{Time.current.to_s(:export)}"
      )
    end

    def ignored_fields
      @ignored_fields ||= begin
        results = []

        for_each do |result|
          result.to_h.each do |key, value|
            results << key if value.is_a?(ApplicationDocument)
          end
        end

        results
      end
    end

    private

    def for_each
      i = 0

      while (results = get_results(skip: i)) && results.length > 0
        view_model.new(OpenStruct.new(results: results)).results.each do |result|
          yield(result)
          i += 1
        end
      end
    end

    def get_results(skip:)
      collection.find(
        {},
        skip: skip,
        sort: report.sort_value,
        limit: Workarea.config.reports_max_results
      ).to_a
    end
  end
end

Version data entries

62 entries across 62 versions & 1 rubygems

Version Path
workarea-core-3.5.27 app/services/workarea/export_report.rb
workarea-core-3.5.26 app/services/workarea/export_report.rb
workarea-core-3.4.45 app/services/workarea/export_report.rb
workarea-core-3.5.25 app/services/workarea/export_report.rb
workarea-core-3.5.23 app/services/workarea/export_report.rb
workarea-core-3.4.44 app/services/workarea/export_report.rb
workarea-core-3.5.22 app/services/workarea/export_report.rb
workarea-core-3.4.43 app/services/workarea/export_report.rb
workarea-core-3.5.21 app/services/workarea/export_report.rb
workarea-core-3.4.42 app/services/workarea/export_report.rb
workarea-core-3.5.20 app/services/workarea/export_report.rb
workarea-core-3.4.41 app/services/workarea/export_report.rb
workarea-core-3.5.19 app/services/workarea/export_report.rb
workarea-core-3.4.40 app/services/workarea/export_report.rb
workarea-core-3.5.18 app/services/workarea/export_report.rb
workarea-core-3.4.39 app/services/workarea/export_report.rb
workarea-core-3.5.17 app/services/workarea/export_report.rb
workarea-core-3.4.38 app/services/workarea/export_report.rb
workarea-core-3.5.16 app/services/workarea/export_report.rb
workarea-core-3.4.37 app/services/workarea/export_report.rb