Newer
Older
dmpopidor / app / models / concerns / codebase_fragment.rb
# frozen_string_literal: true

module CodebaseFragment

  def save_codebase_fragment(codebase_data, schema)
    fragmented_data = {}
    codebase_data.each do |prop, content|
      schema_prop = schema.schema["properties"][prop]

      next if schema_prop&.dig("type").nil?

      if schema_prop["type"].eql?("object") &&
         schema_prop["schema_id"].present?
        ####################################
        # OBJECT FIELDS
        ####################################
        sub_data = content # TMP: for readability
        next if content["action"].nil?

        sub_schema = MadmpSchema.find(schema_prop["schema_id"])

        if sub_data["action"].eql?("create")
          next if MadmpFragment.fragment_exists?(sub_data["data"], sub_schema, dmp.id, id)

          cb_fragment = MadmpFragment.new(
            dmp_id: dmp.id,
            parent_id: id,
            madmp_schema_id: sub_schema.id,
            additional_info: { property_name: prop }
          )
          cb_fragment.classname = sub_schema.classname
          cb_fragment.instantiate
          created_frag = cb_fragment.save_codebase_fragment(sub_data["data"], sub_schema)
          # If sub_data is a Person, we need to set the dbid manually, since Person has no parent
          # and update_references function is not triggered
          fragmented_data[prop] = { "dbid" => created_frag.id } if sub_schema.classname.eql?("person")
        elsif sub_data["action"].eql?("update") && sub_data["dbid"]
          cb_fragment = MadmpFragment.find(sub_data["dbid"])
          cb_fragment.save_codebase_fragment(sub_data["data"], sub_schema)
        end
      elsif schema_prop["type"].eql?("array") &&
            schema_prop["items"]["schema_id"].present?
        ####################################
        # ARRAY FIELDS
        ####################################
        data_list = content # TMP: for readability
        data_list.each do |cb_data|
          next if cb_data["action"].nil?

          sub_schema = MadmpSchema.find(schema_prop["items"]["schema_id"])

          if cb_data["action"].eql?("create")
            next if MadmpFragment.fragment_exists?(cb_data["data"], sub_schema, dmp.id, id)

            cb_fragment = MadmpFragment.new(
              dmp_id: dmp.id,
              parent_id: id,
              madmp_schema_id: sub_schema.id,
              additional_info: { property_name: prop }
            )
            cb_fragment.classname = sub_schema.classname
            cb_fragment.instantiate
            created_frag = cb_fragment.save_codebase_fragment(cb_data["data"], sub_schema)
          elsif cb_data["action"].eql?("update") && cb_data["dbid"]
            cb_fragment = MadmpFragment.find(cb_data["dbid"])
            cb_fragment.save_codebase_fragment(cb_data["data"], sub_schema)
          end
        end
      else
        fragmented_data[prop] = content
      end
    end
    update!(
      data: data.merge(fragmented_data),
      additional_info: additional_info.except!("custom_value")
    )
    update_children_references
    self # return self
  end

end