Class: MetadataPresenter::AnswersController

Inherits:
EngineController show all
Defined in:
app/controllers/metadata_presenter/answers_controller.rb

Instance Method Summary collapse

Methods inherited from EngineController

#allow_analytics?, #analytics_cookie_name, #analytics_tags_present?, #answered?, #back_link, #external_or_relative_link, #get_saved_progress, #increment_record_counter, #invalidate_record, #load_autocomplete_items, #maintenance_mode?, #reload_user_data, #save_form_progress, #show_cookie_confirmation?, #show_cookie_request?

Instance Method Details

#about_to_render_multiupload?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'app/controllers/metadata_presenter/answers_controller.rb', line 39

def about_to_render_multiupload?
  answers_params.present? && multiupload?
end

#createObject



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'app/controllers/metadata_presenter/answers_controller.rb', line 5

def create
  @previous_answers = reload_user_data.deep_dup

  @page_answers = PageAnswers.new(page, incoming_answer, autocomplete_items(page.components))

  if params[:save_for_later].present?
    save_user_data unless upload? || multiupload?

    redirect_to save_path(page_slug: params[:page_slug]) and return
  end

  upload_files if upload?
  upload_multiupload_new_files if multiupload? && answers_params.present?

  if @page_answers.validate_answers
    save_user_data # method signature

    # if adding another file in multi upload, redirect back to referrer
    if about_to_render_multiupload?
      redirect_back(fallback_location: root_path) and return
    end

    redirect_to_next_page
  else
    # can't render error in the same way for the multiupload component
    if about_to_render_multiupload?
      @user_data = @previous_answers

      render template: @page.template, status: :unprocessable_entity and return
    end
    render_validation_error
  end
end

#show_save_and_returnObject



88
89
90
# File 'app/controllers/metadata_presenter/answers_controller.rb', line 88

def show_save_and_return
  page.upload_components.none?
end

#update_count_matching_filenames(original_filename, user_data) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'app/controllers/metadata_presenter/answers_controller.rb', line 43

def update_count_matching_filenames(original_filename, user_data)
  extname = File.extname(original_filename)
  basename = File.basename(original_filename, extname)
  filename_regex = /^#{Regexp.quote(basename)}(?>-\((\d)\))?#{Regexp.quote(extname)}/

  user_data.select { |_k, v|
    if v.is_a?(Array)
      v.any? { |e| e['original_filename'] =~ filename_regex }
    else
      v['original_filename'] =~ filename_regex
    end
  }.count
end

#upload_multiupload_new_filesObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'app/controllers/metadata_presenter/answers_controller.rb', line 57

def upload_multiupload_new_files
  user_data = load_user_data
  @page_answers.page.multiupload_components.each do |component|
    previous_answers = user_data[component.id]
    incoming_filename = @page_answers.send(component.id)[component.id].last['original_filename']

    if editor_preview?
      @page_answers.uploaded_files.push(multiuploaded_file(previous_answers, component))
    else

      if incoming_filename.present?
        # determine if duplicate filename from any other user answer
        @page_answers.count = update_count_matching_filenames(incoming_filename, user_data)
      end

      if previous_answers.present? && previous_answers.any? { |answer| answer['original_filename'] == incoming_answer.incoming_answer.values.first.original_filename }
        @page_answers.count = nil # ensure we don't also try to suffix this filename as we will reject it anyway
        file = MetadataPresenter::UploadedFile.new(
          file: @page_answers.send(component.id)[component.id].last,
          component:
        )

        file.errors.add('invalid.multiupload')
        @page_answers.uploaded_files.push(file)
      else
        @page_answers.uploaded_files.push(multiuploaded_file(previous_answers, component))
      end
    end
  end
end