opf/openproject

View on GitHub
modules/bim/lib/open_project/bim/bcf_xml/aggregations.rb

Summary

Maintainability
A
0 mins
Test Coverage
module OpenProject::Bim::BcfXml
  class Aggregations
    attr_reader :listings, :project, :instance_cache

    def initialize(listing, project)
      @listings = listing
      @project = project

      @instance_cache = {}
    end

    def all_people
      @instance_cache[:all_people] ||= listings.pluck(:people).flatten.uniq
    end

    def all_mails
      @instance_cache[:all_mails] ||= listings.pluck(:mail_addresses).flatten.uniq
    end

    def known_users
      @instance_cache[:known_users] ||= User.where(mail: all_mails).includes(:memberships)
    end

    def unknown_mails
      @instance_cache[:unknown_mails] ||= all_mails.map(&:downcase) - known_users.map(&:mail).map(&:downcase)
    end

    def members
      @instance_cache[:members] ||= known_users.select { |user| user.projects.map(&:id).include? @project.id }
    end

    def non_members
      @instance_cache[:non_members] ||= known_users - members
    end

    def invalid_people
      @instance_cache[:invalid_people] ||= all_people - all_mails
    end

    def all_statuses
      @instance_cache[:all_statuses] ||= listings.pluck(:status).flatten.uniq
    end

    def unknown_statuses
      @instance_cache[:unknown_statuses] ||= all_statuses - Status.all.map(&:name)
    end

    def all_types
      @instance_cache[:all_types] ||= listings.pluck(:type).flatten.uniq
    end

    def unknown_types
      @instance_cache[:unknown_types] ||= all_types - Type.all.map(&:name)
    end

    def all_priorities
      @instance_cache[:all_priorities] ||= listings.pluck(:priority).flatten.uniq
    end

    def unknown_priorities
      @instance_cache[:unknown_priorities] ||= all_priorities - IssuePriority.all.map(&:name)
    end

    def clear_instance_cache
      @instance_cache = {}
    end
  end
end