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

pulibrary / tigerdata-app / 5205f704-d89d-4c43-8cfa-9e6783edc33a

29 Feb 2024 07:04PM UTC coverage: 60.206% (-29.9%) from 90.092%
5205f704-d89d-4c43-8cfa-9e6783edc33a

push

circleci

jrgriffiniii
Ensuring that the storage usage and storage capacity is retrieved for
Mediaflux Projects and rendered on the "contents" Project View

11 of 34 new or added lines in 4 files covered. (32.35%)

451 existing lines in 34 files now uncovered.

935 of 1553 relevant lines covered (60.21%)

9.47 hits per line

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

75.93
/app/models/project_mediaflux.rb
1
# frozen_string_literal: true
2
class ProjectMediaflux
1✔
3
  def self.create!(project:, session_id:, xml_namespace: nil)
1✔
4
    store_name = Store.default(session_id: session_id).name
4✔
5

6
    # Make sure the root namespace exists
7
    create_root_ns(session_id: session_id)
4✔
8

9
    # Create a namespace for the project
10
    # The namespace is directly under our root namespace
11
    project_name = safe_name(project.directory)
1✔
12
    project_namespace = "#{Rails.configuration.mediaflux['api_root_ns']}/#{project_name}NS"
1✔
13
    namespace = Mediaflux::Http::NamespaceCreateRequest.new(namespace: project_namespace, description: "Namespace for project #{project.title}", store: store_name, session_token: session_id)
1✔
14
    if namespace.error?
1✔
15
      raise "Can not create the namespace #{namespace.response_error}"
×
16
    end
17
    # Create a collection asset under the root namespace and set its metadata
18
    tigerdata_values = project_values(project: project)
1✔
19
    project_parent = Rails.configuration.mediaflux["api_root_collection"]
1✔
20
    prepare_parent_collection(project_parent:, session_id:)
1✔
21
    create_request = Mediaflux::Http::CreateAssetRequest.new(session_token: session_id, namespace: project_namespace, name: project_name, tigerdata_values: tigerdata_values,
1✔
22
                                                             xml_namespace: xml_namespace, pid: project_parent)
23
    id = create_request.id
1✔
24
    if id.blank? && create_request.response_xml.text.include?("failed: The namespace #{project_namespace} already contains an asset named '#{project_name}'")
1✔
UNCOV
25
      raise "Project name already taken"
×
26
    end
27
    id
1✔
28
  end
29

30
  def self.update(project:, session_id:)
1✔
31
    tigerdata_values = project_values(project: project)
×
32
    Mediaflux::Http::UpdateAssetRequest.new(session_token: session_id, id: project.mediaflux_id, tigerdata_values: tigerdata_values).resolve
×
33
  end
34

35
  # This method is used for transforming iso8601 dates to dates that MediaFlux likes
36
  # Take a string like "2024-02-26T10:33:11-05:00" and convert this string to "22-FEB-2024 13:57:19"
37
  def self.format_date_for_mediaflux(iso8601_date)
1✔
38
    return if iso8601_date.nil?
18✔
39
    Time.parse(iso8601_date).strftime("%e-%b-%Y %H:%M:%S").upcase
17✔
40
  end
41

42
  # Translates database record into mediaflux meta document.
43
  # This is where the XML payload is generated.
44
  # rubocop:disable Metrics/MethodLength
45
  # rubocop:disable Metrics/AbcSize
46
  def self.project_values(project:)
1✔
47
    values = {
48
      code: project.directory,
9✔
49
      title: project.metadata[:title],
50
      description: project.metadata[:description],
51
      status: project.metadata[:status],
52
      data_sponsor: project.metadata[:data_sponsor],
53
      data_manager: project.metadata[:data_manager],
54
      data_user_read_only: project.metadata[:data_user_read_only],
55
      data_user_read_write: project.metadata[:data_user_read_write],
56
      departments: project.metadata[:departments],
57
      created_on: format_date_for_mediaflux(project.metadata[:created_on]),
58
      created_by: project.metadata[:created_by],
59
      updated_on: format_date_for_mediaflux(project.metadata[:updated_on]),
60
      updated_by: project.metadata[:updated_by],
61
      project_id: project.metadata[:project_id],
62
      storage_capacity: project.metadata[:storage_capacity_requested],
63
      storage_performance: project.metadata[:storage_performance_expectations_requested],
64
      project_purpose: project.metadata[:project_purpose]
65
    }
66
    values
9✔
67
  end
68
  # rubocop:enable Metrics/AbcSize
69
  # rubocop:enable Metrics/MethodLength
70

71
  def self.xml_payload(project:, xml_namespace: nil)
1✔
72
    project_name = safe_name(project.directory)
2✔
73
    project_namespace = "#{Rails.configuration.mediaflux['api_root_ns']}/#{project_name}NS"
2✔
74
    project_parent = Rails.configuration.mediaflux["api_root_collection"]
2✔
75

76
    tigerdata_values = project_values(project: project)
2✔
77
    create_request = Mediaflux::Http::CreateAssetRequest.new(session_token: nil, namespace: project_namespace, name: project_name, tigerdata_values: tigerdata_values,
2✔
78
                                                             xml_namespace: xml_namespace, pid: project_parent)
UNCOV
79
    create_request.xml_payload
×
80
  end
81

82
  def self.document(project:, xml_namespace: nil)
1✔
NEW
83
    xml_body = xml_payload(project:, xml_namespace:)
×
NEW
84
    Nokogiri::XML.parse(xml_body)
×
85
  end
86

87
  def self.safe_name(name)
1✔
88
    # only alphanumeric characters
89
    name.strip.gsub(/[^A-Za-z\d]/, "-")
6✔
90
  end
91

92
  def self.create_root_ns(session_id:)
1✔
93
    root_namespace = Rails.configuration.mediaflux["api_root_ns"]
4✔
94
    namespace_request = Mediaflux::Http::NamespaceDescribeRequest.new(path: root_namespace, session_token: session_id)
4✔
95
    if namespace_request.exists?
1✔
96
      Rails.logger.info "Root namespace #{root_namespace} already exists"
1✔
97
    else
98
      Rails.logger.info "Created root namespace #{root_namespace}"
×
99
      namespace_request = Mediaflux::Http::NamespaceCreateRequest.new(namespace: root_namespace, description: "TigerData client app root namespace",
×
100
                                                                      store: Store.all(session_id: session_id).first.name,
101
                                                                      session_token: session_id)
102
      namespace_request.response_body
×
103
    end
104
  end
105

106
  class << self
1✔
107

108
    private
1✔
109
      def prepare_parent_collection(project_parent:, session_id:)
1✔
110
        get_parent = Mediaflux::Http::GetMetadataRequest.new(session_token: session_id, id: project_parent)
1✔
111
        if get_parent.error?
1✔
UNCOV
112
          if project_parent.include?("path=")
×
UNCOV
113
            create_parent_request = Mediaflux::Http::CreateAssetRequest.new(session_token: session_id, namespace: Rails.configuration.mediaflux["api_root_collection_namespace"],
×
114
                                                                            name: Rails.configuration.mediaflux["api_root_collection_name"])
UNCOV
115
            raise "Can not create parent collection: #{create_parent_request.response_error}" if create_parent_request.error?
×
116
          end
117
        end    
118
      end
119
  end
120
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