Newer
Older
dmpopidor / lib / tasks / madmpopidor.rake
# frozen_string_literal: true

require "set"
# rubocop:disable Metrics/BlockLength
namespace :madmpopidor do
  desc "Upgrade to v3.0.0"
  task v3_0_0: :environment do
    Rake::Task["madmpopidor:add_structure_question_format"].execute
    Rake::Task["madmpopidor:initialize_template_locale"].execute
    Rake::Task["madmpopidor:load_registries"].execute
    Rake::Task["madmpopidor:seed"].execute
    Rake::Task["madmpopidor:initialize_plan_fragments"].execute
  end

  desc "Initialize Dmp, Project, Meta & ResearchOutputs JSON fragments for the ancient plans"
  task initialize_plan_fragments: :environment do
    Plan.all.each do |plan|
      plan.create_plan_fragments if plan.json_fragment.nil?

      plan.research_outputs.each do |research_output|
        next if research_output.nil? && research_output.json_fragment.present?

        research_output.create_json_fragments
      end
    end
  end

  desc "Add Structured question format in table"
  task add_structure_question_format: :environment do
    if QuestionFormat.find_by(title: "Structured").nil?
      QuestionFormat.create!(
        {
          title: "Structured",
          description: "Structured question format",
          option_based: false,
          formattype: 9,
          structured: true
        }
      )
    end
  end

  desc "Initialize the template locale to the default language of the application"
  task initialize_template_locale: :environment do
    languages = Language.all
    Template.all.each do |template|
      if languages.find_by(abbreviation: template.locale).nil?
        template.update(locale: Language.default.abbreviation)
      end
    end
  end

  desc "Seeds the database with the madmp data"
  task seed: :environment do
    Rake::Task["madmpopidor:load_templates"].execute
    load(Rails.root.join("db", "madmp_seeds.rb"))
  end

  # Load templates form an index file
  desc "Load JSON templates for structured questions in the database"
  task load_templates: :environment do
    # Read and parse index.json file
    index_path = Rails.root.join("config/schemas/main/index.json")
    schemas_index = JSON.load(File.open(index_path))

    # Iterate over the schemas of the index.json file
    schemas_index.each do |schema_desc|
      # Read, parse and extract useful data from the JSON schema
      schema_path = Rails.root.join("config/schemas/main/#{schema_desc['path']}")
      json_schema = JSON.load(File.open(schema_path))
      title = json_schema["title"]
      classname = schema_desc["classname"]

      begin
        schema = MadmpSchema.find_or_initialize_by(name: title) do |s|
          s.label = title
          s.name = title
          s.version = 1
          s.org_id = Org.first.id
          s.classname = classname
        end
        schema.update(schema: json_schema.to_json)
      rescue ActiveRecord::RecordInvalid
        p "ERROR: template #{title} is invalid (model validations)"
      end
    end

    # Replace all "template_name" key/values with "schema_id" equivalent in loaded schemas
    MadmpSchema.all.each do |schema|
      begin
        schema.update(schema: MadmpSchema.substitute_names(schema.schema))
      rescue ActiveRecord::RecordNotFound => e
        p "ERROR: template name substitution failed in #{schema.name}: #{e.message}"
        next
      end
    end
  end

  # Load registries
  desc "Load JSON registries"
  task load_registries: :environment do
    registries_path = Rails.root.join("config/schemas/registry_values.json")
    registries = JSON.load(File.open(registries_path))

    registries.each do |registry_name, registry_values|
      registry = Registry.find_or_initialize_by(name: registry_name) do |r|
        r.name = registry_name
        r.version = 1
      end
      registry_values.each_with_index do |reg_val, idx|
        if reg_val["label"].present?
          RegistryValue.create!(data: reg_val, registry: registry, order: idx)
        else
          RegistryValue.create!(
            data: { "value" => reg_val },
            registry: registry,
            order: idx
          )
        end
      end
    end
  end
end
# rubocop:enable Metrics/BlockLength