• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pulibrary / pdc_describe / 7ae96b6b-0a64-4479-9fa1-8ba6526e2c87

20 Mar 2024 12:42PM UTC coverage: 30.068% (-66.2%) from 96.266%
7ae96b6b-0a64-4479-9fa1-8ba6526e2c87

Pull #1701

circleci

leefaisonr
makes it so that links open in new window
Pull Request #1701: Update language on submission form

1019 of 3389 relevant lines covered (30.07%)

0.4 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/app/services/work_validator.rb
1
# frozen_string_literal: true
2
class WorkValidator
×
3
  attr_reader :work
×
4

5
  delegate :errors, :metadata, :resource, :ark, :doi, :user_entered_doi, :id, :group,
×
6
           :pre_curation_uploads_fast, :post_curation_uploads, to: :work
×
7

8
  def initialize(work)
×
9
    @work = work
×
10
  end
×
11

12
  def valid?
×
13
    if work.none?
×
14
      validate_ids
×
15
    elsif work.draft?
×
16
      valid_to_draft
×
17
    else
×
18
      valid_to_submit
×
19
    end
×
20
  end
×
21

22
  def valid_to_draft(*)
×
23
    errors.add(:base, "Must provide a title") if resource.main_title.blank?
×
24
    validate_ark
×
25
    validate_creators
×
26
    validate_related_objects if resource.present? && !resource.related_objects.empty?
×
27
    errors.count == 0
×
28
  end
×
29

30
  def valid_to_submit(*args)
×
31
    valid_to_draft(args)
×
32
    validate_metadata
×
33
    if errors.count == 0
×
34
      valid_datacite? # test if the datacite update will be valid
×
35
    end
×
36
    errors.count == 0
×
37
  end
×
38

39
  def valid_to_approve(user)
×
40
    if resource.doi.blank?
×
41
      errors.add :base, "DOI must be present for a work to be approved"
×
42
    end
×
43
    valid_to_submit(user)
×
44
    unless user.has_role? :group_admin, group
×
45
      errors.add :base, "Unauthorized to Approve"
×
46
    end
×
47
    if pre_curation_uploads_fast.empty? && post_curation_uploads.empty?
×
48
      errors.add :base, "Uploads must be present for a work to be approved"
×
49
    end
×
50
    errors.count == 0
×
51
  end
×
52

53
  def valid_datacite?
×
54
    datacite_serialization = resource.datacite_serialization
×
55
    datacite_serialization.valid?
×
56
    datacite_serialization.errors.each { |error| errors.add(:base, error) }
×
57
    errors.count == 0
×
58
  rescue ArgumentError => error
×
59
    argument_path = error.backtrace_locations.first.path
×
60
    argument_file = argument_path.split("/").last
×
61
    argument_name = argument_file.split(".").first
×
62
    errors.add(:base, "#{argument_name.titleize}: #{error.message}")
×
63
    false
×
64
  end
×
65

66
  private
×
67

68
    def validate_ark
×
69
      return if ark.blank?
×
70
      return false unless unique_ark
×
71
      first_save = id.blank?
×
72
      changed_value = metadata["ark"] != ark
×
73
      if first_save || changed_value
×
74
        errors.add(:base, "Invalid ARK provided for the Work: #{ark}") unless Ark.valid?(ark)
×
75
      end
×
76
    end
×
77

78
    def validate_related_objects
×
79
      return if resource.related_objects.empty?
×
80
      invalid = resource.related_objects.reject(&:valid?)
×
81
      if invalid.count.positive?
×
82
        related_object_errors = "Related Objects are invalid: "
×
83
        prev_errors = errors.to_a
×
84
        prev_related_object_errors = prev_errors.map { |e| e.include?(related_object_errors) }.reduce(:|)
×
85

86
        errors.add(:base, "#{related_object_errors}#{invalid.map(&:errors).join(', ')}") unless prev_related_object_errors
×
87
      end
×
88
    end
×
89

90
    def validate_creators
×
91
      if resource.creators.count == 0
×
92
        errors.add(:base, "Must provide at least one Creator")
×
93
      else
×
94
        resource.creators.each do |creator|
×
95
          if creator.orcid.present? && Orcid.invalid?(creator.orcid)
×
96
            errors.add(:base, "ORCID for creator #{creator.value} is not in format 0000-0000-0000-0000")
×
97
          end
×
98
        end
×
99
      end
×
100
    end
×
101

102
    def validate_required_metadata
×
103
      return if metadata.blank?
×
104
      errors.add(:base, "Must provide a title") if resource.main_title.blank?
×
105
      validate_creators
×
106
    end
×
107

108
    def validate_doi
×
109
      return true unless user_entered_doi
×
110
      return false unless unique_doi
×
111
      if /^10.\d{4,9}\/[-._;()\/:a-z0-9\-]+$/.match?(doi.downcase)
×
112
        response = Faraday.get("#{Rails.configuration.datacite.doi_url}#{doi}")
×
113
        errors.add(:base, "Invalid DOI: can not verify it's authenticity") unless response.success? || response.status == 302
×
114
      else
×
115
        errors.add(:base, "Invalid DOI: does not match format")
×
116
      end
×
117
      errors.count == 0
×
118
    end
×
119

120
    def unique_ark
×
121
      return true if ark.blank?
×
122
      other_record = Work.find_by_ark(ark)
×
123
      return true if other_record == work
×
124
      errors.add(:base, "Invalid ARK: It has already been applied to another work #{other_record.id}")
×
125
      false
×
126
    rescue ActiveRecord::RecordNotFound
×
127
      true
×
128
    end
×
129

130
    def validate_ids
×
131
      validate_doi
×
132
      unique_ark
×
133
    end
×
134

135
    def unique_doi
×
136
      other_record = Work.find_by_doi(doi)
×
137
      return true if other_record == work
×
138
      errors.add(:base, "Invalid DOI: It has already been applied to another work #{other_record.id}")
×
139
      false
×
140
    rescue ActiveRecord::RecordNotFound
×
141
      true
×
142
    end
×
143

144
    def validate_metadata
×
145
      return if metadata.blank?
×
146
      validate_required_metadata
×
147
      errors.add(:base, "Must provide a description") if resource.description.blank?
×
148
      errors.add(:base, "Must indicate the Publisher") if resource.publisher.blank?
×
149
      errors.add(:base, "Must indicate the Publication Year") if resource.publication_year.blank?
×
150
      errors.add(:base, "Must indicate at least one Rights statement") if resource.rights_many.count == 0
×
151
      errors.add(:base, "Must provide a Version number") if resource.version_number.blank?
×
152
      validate_related_objects
×
153
    end
×
154
end
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc