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

pulibrary / tigerdata-app / b02c9aef-4555-41f7-b867-4789f70cfdd9

02 Dec 2024 06:13PM UTC coverage: 84.167% (-0.1%) from 84.262%
b02c9aef-4555-41f7-b867-4789f70cfdd9

Pull #1077

circleci

JaymeeH
updating quota usage text
Pull Request #1077: Adding project quota to the datatable

4 of 4 branches covered (100.0%)

10 of 10 new or added lines in 3 files covered. (100.0%)

4 existing lines in 2 files now uncovered.

2222 of 2640 relevant lines covered (84.17%)

318.55 hits per line

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

92.98
/app/models/project_mediaflux.rb
1
# frozen_string_literal: true
2

3
# A custom exception class for when a namespace path is already taken
4
class MediafluxDuplicateNamespaceError < StandardError
1✔
5
end
6

7
# Take an instance of Project and adds it to MediaFlux
8
class ProjectMediaflux
1✔
9
  # If the project hasn't yet been created in mediaflux, create it.
10
  # If it already exists, update it.
11
  # @return [String] the mediaflux id of the project
12
  def self.save(project:, user:, xml_namespace: nil)
1✔
13
    session_id = user.mediaflux_session
16✔
14
    if project.mediaflux_id.nil?
16✔
15
      mediaflux_id = ProjectMediaflux.create!(project: project, user: user)
15✔
16
      ProjectAccumulator.new(project: project, session_id: session_id).create!()
15✔
17
      Rails.logger.debug "Project #{project.id} has been created in MediaFlux (asset id #{mediaflux_id})"
15✔
18
    else
19
      ProjectMediaflux.update(project: project, user: user)
1✔
20
      Rails.logger.debug "Project #{project.id} has been updated in MediaFlux (asset id #{project.mediaflux_id})"
1✔
21
    end
22
    project.reload
16✔
23
    project.mediaflux_id
16✔
24
  end
25

26
  # Create a project in MediaFlux
27
  #
28
  # @param project [Project] the project that needs to be added to MediaFlux
29
  # @param session_id [] the session id for the user who is currently authenticated to MediaFlux
30
  # @param xml_namespace []
31
  # @return [String] The id of the project that got created
32
  def self.create!(project:, user:, xml_namespace: nil)
1✔
33
    session_id = user.mediaflux_session
63✔
34
    store_name = Store.default(session_id: session_id).name
63✔
35

36
    # Make sure the root namespace and the required nodes below it exist.
37
    create_root_tree(session_id: session_id)
63✔
38

39
    # Create a namespace for the project
40
    # The namespace is directly under our root namespace'
41
    project_name = project.project_directory
63✔
42
    project_namespace = "#{project_name}NS"
63✔
43
    namespace = Mediaflux::NamespaceCreateRequest.new(namespace: project_namespace, description: "Namespace for project #{project.title}", store: store_name, session_token: session_id)
63✔
44
    if namespace.error?
63✔
45
      raise MediafluxDuplicateNamespaceError.new("Can not create the namespace #{namespace.response_error}")
1✔
46
    end
47
    # Create a collection asset under the root namespace and set its metadata
48
    project_parent = Mediaflux::Connection.root_collection
62✔
49
    create_request = Mediaflux::ProjectCreateRequest.new(session_token: session_id, namespace: project_namespace, project:, xml_namespace: xml_namespace, pid: project_parent)
62✔
50
    id = create_request.id
62✔
51
    if id.blank?
62✔
52
      response_error = create_request.response_error
2✔
53
      case response_error[:message]
2✔
54
      when "failed: The namespace #{project_namespace} already contains an asset named '#{project_name}'"
55
        raise "Project name already taken"
×
56
      when /'asset.create' failed/
57

58
        # Ensure that the metadata validations are run
59
        if project.valid?
2✔
60
          raise response_error[:message]  # something strange went wrong
1✔
61
        else
62
          raise TigerData::MissingMetadata.missing_metadata(schema_version: ::TigerdataSchema::SCHEMA_VERSION, errors: project.errors)
1✔
63
        end
64
      else
65
        raise(StandardError,"An error has occured during project creation, not related to namespace creation or collection creation")
×
66
      end
67
    end
68

69
    # Save the ActiveRecord to make sure the mediaflux_id is recorded
70
    project.mediaflux_id = id
60✔
71
    project.save!
60✔
72

73
    id
60✔
74
  end
75

76
  def self.update(project:, user:)
1✔
77
    session_id = user.mediaflux_session
3✔
78
    project.metadata_model.updated_on ||= Time.current.in_time_zone("America/New_York").iso8601
3✔
79
    project.metadata_model.updated_by ||= user.uid
3✔
80
    update_request = Mediaflux::ProjectUpdateRequest.new(session_token: session_id, project: project)
3✔
81
    update_request.resolve
3✔
82
    raise update_request.response_error[:message] if update_request.error?
3✔
83

84
    # Save the ActiveRecord to make sure the updated metadata is also saved in our PostgreSQL database
85
    project.save!
3✔
86
  end
87

88
  def self.xml_payload(project:, xml_namespace: nil)
1✔
89
    project_name = project.project_directory
5✔
90
    project_namespace = "#{project_name}NS"
5✔
91
    project_parent = Mediaflux::Connection.root_collection
5✔
92

93
    create_request = Mediaflux::ProjectCreateRequest.new(session_token: nil, namespace: project_namespace, project:, xml_namespace: xml_namespace, pid: project_parent)
5✔
94
    create_request.xml_payload
5✔
95
  end
96

97
  def self.document(project:, xml_namespace: nil)
1✔
UNCOV
98
    xml_body = xml_payload(project:, xml_namespace:)
×
UNCOV
99
    Nokogiri::XML.parse(xml_body)
×
100
  end
101

102
  def self.create_root_tree(session_id:)
1✔
103
    root_ns = Rails.configuration.mediaflux["api_root_collection_namespace"]
281✔
104
    parent_collection = Rails.configuration.mediaflux["api_root_collection_name"]
281✔
105
    req = Mediaflux::RootCollectionAsset.new(session_token: session_id, root_ns:, parent_collection:)
281✔
106
    req.create
281✔
107
  end
108
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