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

pulibrary / tigerdata-app / 0a6fac8d-40b5-459e-8cdb-bf0e2a4b9d64

12 Nov 2025 09:47PM UTC coverage: 91.228% (+2.6%) from 88.673%
0a6fac8d-40b5-459e-8cdb-bf0e2a4b9d64

Pull #2191

circleci

web-flow
Merge branch 'main' into 2127-search-path-display
Pull Request #2191: Updated Search results to show Project information straight from Mediaflux

11 of 22 new or added lines in 2 files covered. (50.0%)

644 existing lines in 34 files now uncovered.

2860 of 3135 relevant lines covered (91.23%)

551.74 hits per line

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

87.13
/app/controllers/projects_controller.rb
1
# frozen_string_literal: true
2
class ProjectsController < ApplicationController
2✔
3

4
  before_action :set_breadcrumbs
2✔
5
  before_action :authenticate_user!
2✔
6

7
  def details
2✔
8
    return if project.blank?
16✔
9

10
    add_breadcrumb(@presenter.title, project_path)
14✔
11
    add_breadcrumb("Details")
14✔
12

13
    @provenance_events = project.provenance_events.where.not(event_type: ProvenanceEvent::STATUS_UPDATE_EVENT_TYPE)
14✔
14

15
    @project_eligible_to_edit = true if project.status == Project::APPROVED_STATUS && eligible_editor?
14✔
16

17
    @project_metadata = @project.metadata
14✔
18
    @storage_capacity = @project_metadata[:storage_capacity]
14✔
19
    @size = @storage_capacity[:size]
14✔
20
    @unit = @storage_capacity[:unit]
14✔
21

22
    @requested_size = @size[:requested]
14✔
23
    @requested_unit = @unit[:requested]
14✔
24

25
    @approved_size = @size[:approved]
14✔
26
    @approved_unit = @unit[:approved]
14✔
27

28
    @storage_expectations = @project_metadata[:storage_performance_expectations]
14✔
29
    @requested_storage_expectations = @storage_expectations[:requested]
14✔
30
    @approved_storage_expectations = @storage_expectations[:approved]
14✔
31

32
    @project_session = "details"
14✔
33

34
    respond_to do |format|
14✔
35
      format.html do
14✔
36
        render
11✔
37
      end
38
      format.json do
14✔
39
        render json: project.to_json
2✔
40
      end
41
      format.xml do
14✔
42
        render xml: @presenter.to_xml
1✔
43
      end
44
    end
45
  end
46

47
  def index
2✔
48
    if current_user.eligible_sysadmin?
10✔
49
      search_projects
6✔
50
    else
51
      flash[:alert] = I18n.t(:access_denied)
4✔
52
      redirect_to dashboard_path
4✔
53
    end
54
  end
55

56
  def show
2✔
57
    return if project.blank?
38✔
58

59
    add_breadcrumb(@presenter.title, project_path)
30✔
60
    add_breadcrumb("Contents")
30✔
61

62
    @latest_completed_download = current_user.user_requests.where(project_id: @project.id, state: "completed").order(:completion_time).last
30✔
63
    @storage_usage = project.storage_usage(session_id: current_user.mediaflux_session)
30✔
64
    @storage_capacity = project.storage_capacity(session_id: current_user.mediaflux_session)
30✔
65

66
    @num_files = project.asset_count(session_id: current_user.mediaflux_session)
30✔
67

68
    @file_list = project.file_list(session_id: current_user.mediaflux_session, size: 100)
30✔
69
    @files = @file_list[:files]
30✔
70
    @files.sort_by!(&:path)
30✔
71

72
    @project_session = "content"
30✔
73
    respond_to do |format|
30✔
74
      format.html { render }
54✔
75
      format.xml { render xml: ProjectShowPresenter.new(project, current_user).to_xml
36✔
76
    }
77
    end
78
  end
79

80
  # GET "projects/:id/:id-mf"
81
  #
82
  # This action is used to render the mediaflux metadata for a project.
83
  def show_mediaflux
2✔
84
    project_id = params[:id]
4✔
85
    project = Project.find(project_id)
4✔
86
    respond_to do |format|
3✔
87
      format.xml do
3✔
88
        render xml: project.mediaflux_meta_xml(user: current_user)
3✔
89
      end
90
    end
91
  rescue => ex
92
    Rails.logger.error "Error getting MediaFlux XML for project #{project_id}, user #{current_user.uid}: #{ex.message}"
1✔
93
    flash[:alert] = "Error fetching Mediaflux XML for this project"
1✔
94
    redirect_to project_path(project_id)
1✔
95
  end
96

97
  def list_contents
2✔
98
    return if project.blank?
4✔
99

100
    project_job_service.list_contents_job(user: current_user)
3✔
101

102
    json_response = {
103
      message: "File list for \"#{project.title}\" is being generated in the background. A link to the downloadable file list will be available in the \"Recent Activity\" section of your dashboard when it is available. You may safely navigate away from this page or close this tab."
3✔
104
    }
105
    render json: json_response
3✔
106
  rescue => ex
107
    message = "Error producing document list (project id: #{project&.id}): #{ex.message}"
×
108
    Rails.logger.error(message)
×
109
    Honeybadger.notify(message)
×
110
    render json: { message: "Document list could not be generated." }
×
111
  end
112

113
  def file_list_download
2✔
114
    job_id = params[:job_id]
×
115
    user_request = FileInventoryRequest.where(job_id:job_id).first
×
116
    if user_request.nil?
×
117
      # TODO: handle error
118
      redirect_to "/"
×
119
    else
120
      filename = user_request.output_file
×
121
      send_data File.read(filename), type: "text/plain", filename: "filelist.csv", disposition: "attachment"
×
122
    end
123
  end
124

125
  private
2✔
126

127
    def project_job_service
2✔
128
      @project_job_service ||= ProjectJobService.new(project:)
3✔
129
    end
130

131

132
    def build_new_project
2✔
133
      @project ||= Project.new
×
134
    end
135

136
    def project
2✔
137
      @project ||= begin
220✔
138
        project = Project.find(params[:id])
58✔
139
        @presenter = ProjectShowPresenter.new(project, current_user)
58✔
140
        if project&.mediaflux_id != nil && @presenter.user_has_access?(user: current_user)
54✔
141
          project
47✔
142
        else
143
          flash[:alert] = I18n.t(:access_denied)
7✔
144
          redirect_to dashboard_path
7✔
145
          nil
7✔
146
        end
147
      end
148
    end
149

150
    def eligible_editor?
2✔
151
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
3✔
152
    end
153

154
    def set_breadcrumbs
2✔
155
      add_breadcrumb("Dashboard",dashboard_path)
78✔
156
    end
157

158
    def search_projects
2✔
NEW
159
      @title_query = if params[:title_query].present?
6✔
NEW
160
        params[:title_query]
4✔
161
      else
NEW
162
        "*" # default to all projects
2✔
NEW
163
      end
NEW
164
      result =  ProjectSearch.new.call(search_string: @title_query, requestor: current_user)
6✔
NEW
165
      if result.success?
6✔
NEW
166
        flash[:notice] = "Successful search in Mediaflux for #{@title_query}"
6✔
167
        # As of today the search results and the Dashboard show similar information (a list of projects)
168
        # and it makes sense to use the same presenter. If once we flesh out the search feature the
169
        # results become too different from each other we can create a specific presenter for the search
170
        # results.
NEW
171
        @project_presenters = result.value!.map { |project| ProjectDashboardPresenter.new(project, current_user) }
18✔
NEW
172
      else
NEW
173
        flash[:notice] = "Error searching projects for #{@title_query}.  Error: #{result.failure}"
×
NEW
174
        @project_presenters = []
×
175
      end
176
    end
177
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

© 2026 Coveralls, Inc