# frozen_string_literal: true namespace :decidim do namespace :metrics do # All ------ # # Get all metrics entities and execute its own rake task. # It admits a date-string parameter, in a 'YYYY-MM-DD' format from # today to all past dates desc "Execute all metrics calculation methods" task :all, [:day] => :environment do |_task, args| Decidim::Organization.find_each do |organization| Decidim.metrics_registry.all.each do |metric_manifest| call_metric_job(metric_manifest, organization, args.day) end end end # One ------ # # Execute metric calculations for just one metric # It need a metric name and permits a date-string parameter, in a 'YYYY-MM-DD' format from # today to all past dates desc "Execute one metric calculation method" task :one, [:metric, :day] => :environment do |_task, args| next if args.metric.blank? Decidim::Organization.find_each do |organization| metric_manifest = Decidim.metrics_registry.for(args.metric) call_metric_job(metric_manifest, organization, args.day) end end desc "Rebuild calculations from specific day" task :rebuild, [:metric, :day] => :environment do |_task, args| metric = args.metric day = args.day if args.day.blank? day = args.metric metric = nil end begin raise ArgumentError if day.blank? (Date.parse(day)..Date.current).each do |d| current_day = d.to_s Decidim::Organization.find_each do |organization| if metric m_manifest = Decidim.metrics_registry.for(metric) log_info "[#{organization.name}]: rebuilding metric [#{metric}] for day [#{current_day}]" call_metric_job(m_manifest, organization, current_day) else log_info "[#{organization.name}]: rebuilding all metrics for day [#{current_day}]" Decidim.metrics_registry.all.each do |metric_manifest| call_metric_job(metric_manifest, organization, current_day) end end end end rescue ArgumentError log_error "ERROR: Please specify since which date should the metrics be rebuild" log_error "ie: rails decidim:metrics:rebuild[2019-01-01]" end end desc "Show available metrics" task list: :environment do puts Decidim.metrics_registry.all.pluck :metric_name end def call_metric_job(metric_manifest, organization, day = nil) Decidim::MetricJob.perform_later( metric_manifest.manager_class, organization.id, day ) end def log_info(msg) puts msg Rails.logger.info(msg) end def log_error(msg) puts msg Rails.logger.error(msg) end end end