class GoodData::LCM2::SynchronizePPDashboardPermissions

Constants

DESCRIPTION
PARAMS

Public Class Methods

call(params) click to toggle source
# File lib/gooddata/lcm/actions/synchronize_pp_dashboard_permission.rb, line 48
def call(params)
  results = []
  disable_pp_dashboard_permission = GoodData::Helpers.to_boolean(params.disable_pp_dashboard_permission)
  collect_synced_status = collect_synced_status(params)
  failed_projects = ThreadSafe::Array.new

  if disable_pp_dashboard_permission
    params.gdc_logger.info "Skip synchronize Pixel Perfect dashboard permission."
  else
    client = params.gdc_gd_client
    development_client = params.development_client
    failed_projects = ThreadSafe::Array.new

    params.synchronize.peach do |info|
      from_project = info.from
      to_projects = info.to
      sync_success = false

      from = development_client.projects(from_project)
      unless from
        process_failed_project(from_project, "Invalid 'from' project specified - '#{from_project}'", failed_projects, collect_synced_status)
        next
      end

      source_dashboards = from.dashboards

      params.gdc_logger.info "Transferring Pixel Perfect Dashboard permission, from project: '#{from.title}', PID: '#{from.pid}' for dashboard(s): #{source_dashboards.map { |d| "#{d.title.inspect}" }.join(', ')}" # rubocop:disable Metrics/LineLength
      to_projects.peach do |entry|
        pid = entry[:pid]
        next if sync_failed_project(pid, params)

        to_project = client.projects(pid)
        unless to_project
          process_failed_project(pid, "Invalid 'to' project specified - '#{pid}'", failed_projects, collect_synced_status)
          next
        end

        target_dashboards = to_project.dashboards
        begin
          GoodData::Project.transfer_dashboard_permission(from, to_project, source_dashboards, target_dashboards)
          sync_success = true
        rescue StandardError => err
          process_failed_project(pid, err.message, failed_projects, collect_synced_status)
        end
      end

      results << {
        from_project_name: from.title,
        from_project_pid: from.pid,
        status: 'ok'
      } if sync_success
    end
  end

  process_failed_projects(failed_projects, short_name, params) if collect_synced_status
  results
end