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

pulibrary / tigerdata-app / bdd919ec-d8f3-4a61-a933-53fdb1f7eb3d

05 Feb 2026 09:48PM UTC coverage: 90.269% (-0.6%) from 90.825%
bdd919ec-d8f3-4a61-a933-53fdb1f7eb3d

Pull #2384

circleci

hectorcorrea
Remove unused variable
Pull Request #2384: File Explorer Proof of Concept

3 of 24 new or added lines in 2 files covered. (12.5%)

15 existing lines in 2 files now uncovered.

3052 of 3381 relevant lines covered (90.27%)

634.02 hits per line

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

76.85
/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?
23✔
9

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

13
    project_metadata = @project.metadata
21✔
14
    storage_capacity = project_metadata[:storage_capacity]
21✔
15
    size = storage_capacity[:size]
21✔
16
    unit = storage_capacity[:unit]
21✔
17

18
    @requested_size = size[:requested]
21✔
19
    @requested_unit = unit[:requested]
21✔
20

21
    @approved_size = size[:approved]
21✔
22
    @approved_unit = unit[:approved]
21✔
23

24
    @project_session = "details"
21✔
25
    @show_quota_breakdown = params["quota"] == "true"
21✔
26

27
    respond_to do |format|
21✔
28
      format.html do
21✔
29
        render
18✔
30
      end
31
      format.json do
21✔
32
        render json: project.to_json
2✔
33
      end
34
      format.xml do
21✔
35
        render xml: @presenter.to_xml
1✔
36
      end
37
    end
38
  end
39

40
  def index
2✔
41
    if current_user.eligible_sysadmin?
11✔
42
      search_projects
6✔
43
    else
44
      flash[:alert] = I18n.t(:access_denied)
5✔
45
      redirect_to dashboard_path
5✔
46
    end
47
  end
48

49
  def show
2✔
50
    return if project.blank?
40✔
51

52
    add_breadcrumb(@presenter.title, project_path)
31✔
53
    add_breadcrumb("Contents")
31✔
54

55
    @latest_completed_download = current_user.user_requests.where(project_id: @project.id, state: "completed").order(:completion_time).last
31✔
56
    @storage_usage = project.storage_usage(session_id: current_user.mediaflux_session)
31✔
57
    @storage_capacity = project.storage_capacity(session_id: current_user.mediaflux_session)
31✔
58

59
    @num_files = project.asset_count(session_id: current_user.mediaflux_session)
31✔
60

61
    @file_list = project.file_list(session_id: current_user.mediaflux_session, size: 100)
31✔
62
    @files = @file_list[:files]
31✔
63
    @files.sort_by!(&:path)
31✔
64

65
    @project_session = "content"
31✔
66
    respond_to do |format|
31✔
67
      format.html { render }
56✔
68
      format.xml { render xml: ProjectShowPresenter.new(project, current_user).to_xml
37✔
69
    }
70
    end
71
  end
72

73
  # GET "projects/:id/file-explorer"
74
  # Used via an AJAX call to retrieve the list of files for a given path within a project
75
  def file_explorer
2✔
76

NEW
77
    project # force the presenter to be set
×
NEW
78
    if params["pathId"].to_i == 0
×
NEW
79
      path = @presenter.project_directory
×
NEW
80
      path_id = project.mediaflux_id
×
81
    else
NEW
82
      path = params["path"]
×
NEW
83
      path_id = params["pathId"].to_i
×
84
    end
85

NEW
86
    iterator_id = if params["iteratorId"].to_i == 0
×
87
      # setup a new iterator
NEW
88
      project.file_explorer_setup(session_id: current_user.mediaflux_session, path_id: path_id)
×
89
    else
90
      # use the existing iterator
NEW
91
      params["iteratorId"].to_i
×
92
    end
NEW
93
    mediaflux_data = project.file_explorer_iterate(session_id: current_user.mediaflux_session, iterator_id: iterator_id)
×
94

95
    data = {
NEW
96
      fileListUrl: project_file_explorer_url,
×
97
      currentPath: path,
98
      currentPathId: path_id,
99
      iteratorId: iterator_id,
100
      files: mediaflux_data[:files],
101
      complete: mediaflux_data[:complete]
102
    }
NEW
103
    render json: data
×
104
  end
105

106
  # GET "projects/:id/:id-mf"
107
  #
108
  # This action is used to render the mediaflux metadata for a project.
109
  def show_mediaflux
2✔
110
    project_id = params[:id]
4✔
111
    project = Project.find(project_id)
4✔
112
    respond_to do |format|
3✔
113
      format.xml do
3✔
114
        render xml: project.mediaflux_meta_xml(user: current_user)
3✔
115
      end
116
    end
117
  rescue => ex
118
    Rails.logger.error "Error getting MediaFlux XML for project #{project_id}, user #{current_user.uid}: #{ex.message}"
1✔
119
    flash[:alert] = "Error fetching Mediaflux XML for this project"
1✔
120
    redirect_to project_path(project_id)
1✔
121
  end
122

123
  def list_contents
2✔
124
    return if project.blank?
4✔
125

126
    project_job_service.list_contents_job(user: current_user)
3✔
127

128
    json_response = {
129
      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✔
130
    }
131
    render json: json_response
3✔
132
  rescue => ex
UNCOV
133
    message = "Error producing document list (project id: #{project&.id}): #{ex.message}"
×
UNCOV
134
    Rails.logger.error(message)
×
UNCOV
135
    Honeybadger.notify(message)
×
UNCOV
136
    render json: { message: "Document list could not be generated." }
×
137
  end
138

139
  def file_list_download
2✔
140
    job_id = params[:job_id]
×
UNCOV
141
    user_request = FileInventoryRequest.where(job_id:job_id).first
×
UNCOV
142
    if user_request.nil?
×
143
      # TODO: handle error
144
      redirect_to "/"
×
145
    else
146
      filename = user_request.output_file
×
UNCOV
147
      send_data File.read(filename), type: "text/plain", filename: "filelist.csv", disposition: "attachment"
×
148
    end
149
  end
150

151
  private
2✔
152

153
    def project_job_service
2✔
154
      @project_job_service ||= ProjectJobService.new(project:)
3✔
155
    end
156

157
    def project
2✔
158
      @project ||= begin
205✔
159
        project = Project.find(params[:id])
67✔
160
        @presenter = ProjectShowPresenter.new(project, current_user)
67✔
161
        if project&.mediaflux_id != nil && @presenter.user_has_access?(user: current_user)
63✔
162
          project
55✔
163
        else
164
          flash[:alert] = I18n.t(:access_denied)
8✔
165
          redirect_to dashboard_path
8✔
166
          nil
8✔
167
        end
168
      end
169
    end
170

171
    def eligible_editor?
2✔
UNCOV
172
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
×
173
    end
174

175
    def set_breadcrumbs
2✔
176
      add_breadcrumb("Dashboard",dashboard_path)
88✔
177
    end
178

179
    def search_projects
2✔
180
      @title_query = if params[:title_query].present?
6✔
181
        params[:title_query]
4✔
182
      else
183
        "*" # default to all projects
2✔
184
      end
185
      result =  ProjectSearch.new.call(search_string: @title_query, requestor: current_user)
6✔
186
      if result.success?
6✔
187
        flash[:notice] = "Successful search in Mediaflux for #{@title_query}"
6✔
188
        @project_presenters = result.value!
6✔
189
      else
UNCOV
190
        flash[:notice] = "Error searching projects for #{@title_query}.  Error: #{result.failure}"
×
UNCOV
191
        @project_presenters = []
×
192
      end
193
    end
194
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