sul-dlss/argo

View on GitHub
app/jobs/manage_embargoes_job.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

##
# Job to update/add embargoes to objects
class ManageEmbargoesJob < GenericJob
  include Dry::Monads[:result]

  ##
  # A job that allows a user to provide a spreadsheet for managing embargoes.
  # @param [Integer] bulk_action_id GlobalID for a BulkAction object
  # @param [Hash] params additional parameters that an Argo job may need
  # @option params [String] :csv_file CSV string
  def perform(bulk_action_id, params)
    super

    csv = CSV.parse(params[:csv_file], headers: true)
    with_csv_items(csv, name: 'Embargo') do |cocina_object, csv_row, success, failure|
      return failure.call('Not authorized') unless ability.can?(:update, cocina_object)

      cocina_object = open_new_version_if_needed(cocina_object, 'Manage embargo')
      update_embargo(cocina_object, csv_row)
        .either(
          ->(_val) { success.call('Embargo updated') },
          ->(error) { failure.call(error) }
        )
    end
  end

  private

  def update_embargo(cocina_object, csv_row)
    validate_required_field(csv_row).bind do
      parse_date(csv_row).bind do |embargo_release_date|
        build_form(cocina_object, build_changes(csv_row, embargo_release_date)).bind do |form|
          Success(form.save)
        end
      end
    end
  end

  def validate_required_field(csv_row)
    return Failure('Missing required value for "release_date"') unless csv_row['release_date']

    Success()
  end

  def parse_date(csv_row)
    Success(DateTime.parse(csv_row['release_date']))
  rescue Date::Error
    Failure("#{csv_row['release_date']} is not a valid date")
  end

  def build_changes(csv_row, embargo_release_date)
    {
      release_date: embargo_release_date,
      view_access: csv_row['view'],
      download_access: csv_row['download'],
      access_location: csv_row['location']
    }
  end

  def build_form(cocina_object, changes)
    form = EmbargoForm.new(cocina_object)
    if form.validate(changes)
      Success(form)
    else
      Failure(form.errors.full_messages.join(','))
    end
  end
end