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

pulibrary / tigerdata-app / 6913411a-a715-4c75-a2f2-ee2e3c99ede7

26 Jun 2025 07:51PM UTC coverage: 71.565% (-0.6%) from 72.117%
6913411a-a715-4c75-a2f2-ee2e3c99ede7

Pull #1572

circleci

hectorcorrea
Shamless green code that creates a project in Mediaflux via a rake task that calls a service defined in Mediaflux.
Pull Request #1572: Create a project in MediaFlux via the tigerdata.project.create service

4 of 18 branches covered (22.22%)

0 of 32 new or added lines in 1 file covered. (0.0%)

9 existing lines in 5 files now uncovered.

2995 of 4185 relevant lines covered (71.57%)

484.49 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
25✔
14
    if project.mediaflux_id.nil?
25✔
15
      mediaflux_id = ProjectMediaflux.create!(project: project, user: user)
22✔
16
      ProjectAccumulator.new(project: project, session_id: session_id).create!()
22✔
17
      Rails.logger.debug "Project #{project.id} has been created in MediaFlux (asset id #{mediaflux_id})"
22✔
18
    else
19
      ProjectMediaflux.update(project: project, user: user)
3✔
20
      Rails.logger.debug "Project #{project.id} has been updated in MediaFlux (asset id #{project.mediaflux_id})"
3✔
21
    end
22
    project.reload
25✔
23
    project.mediaflux_id
25✔
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
75✔
34
    store_name = Store.default(session_id: session_id).name
75✔
35

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

39
    # Create a namespace for the project
40
    # The namespace is directly under our root namespace'
41
    project_name = project.project_directory
75✔
42
    project_namespace = "#{project_name}NS"
75✔
43
    namespace = Mediaflux::NamespaceCreateRequest.new(namespace: project_namespace, description: "Namespace for project #{project.title}", store: store_name, session_token: session_id)
75✔
44
    if namespace.error?
75✔
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
74✔
49
    create_request = Mediaflux::ProjectCreateRequest.new(session_token: session_id, namespace: project_namespace, project:, xml_namespace: xml_namespace, pid: project_parent)
74✔
50
    id = create_request.id
74✔
51
    if id.blank?
74✔
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}'"
UNCOV
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
UNCOV
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
72✔
71
    project.save!
72✔
72

73
    id
72✔
74
  end
75

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

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

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

93
    create_request = Mediaflux::ProjectCreateRequest.new(session_token: nil, namespace: project_namespace, project:, xml_namespace: xml_namespace, pid: project_parent)
6✔
94
    create_request.xml_payload
6✔
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"]
712✔
104
    parent_collection = Rails.configuration.mediaflux["api_root_collection_name"]
712✔
105
    req = Mediaflux::RootCollectionAsset.new(session_token: session_id, root_ns:, parent_collection:)
712✔
106
    req.create
712✔
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