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

pulibrary / tigerdata-app / 2217866f-1493-4902-91c3-581887e6c91e

03 Mar 2026 08:47PM UTC coverage: 86.493%. First build
2217866f-1493-4902-91c3-581887e6c91e

Pull #2442

circleci

JaymeeH
add tests for globus access request
Pull Request #2442: Create modal for globus access request

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

3016 of 3487 relevant lines covered (86.49%)

414.0 hits per line

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

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

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

7
  def details
1✔
8
    return if project.blank?
5✔
9

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

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

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

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

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

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

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

49
  def show
1✔
50
    return if project.blank?
9✔
51

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

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

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

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

65
    @project_session = "content"
4✔
66
    respond_to do |format|
4✔
67
      format.html { render }
6✔
68
      format.xml { render xml: ProjectShowPresenter.new(project, current_user).to_xml
6✔
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
1✔
76
    project # force the presenter to be set
×
77

78
    if params["pathId"].to_i == 0
×
79
      path = @presenter.project_directory
×
80
      path_id = project.mediaflux_id
×
81
    else
82
      path = params["path"]
×
83
      path_id = params["pathId"].to_i
×
84
    end
85

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

94
    mediaflux_data = project.file_explorer_iterate(session_id: current_user.mediaflux_session, iterator_id: iterator_id)
×
95
    if mediaflux_data[:error]
×
96
      render json: {}, status: 500
×
97
    else
98
      data = {
99
        fileListUrl: project_file_explorer_url,
×
100
        currentPath: path,
101
        currentPathId: path_id,
102
        iteratorId: iterator_id,
103
        files: mediaflux_data[:files],
104
        complete: mediaflux_data[:complete]
105
      }
106
      render json: data
×
107
    end
108
  end
109

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

127
  def list_contents
1✔
128
    return if project.blank?
2✔
129

130
    project_job_service.list_contents_job(user: current_user)
1✔
131

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

143
  def file_list_download
1✔
144
    job_id = params[:job_id]
×
145
    file_inventory_request = FileInventoryRequest.where(job_id:job_id).first
×
146
    if file_inventory_request.nil?
×
147
      # TODO: handle error
148
      redirect_to "/"
×
149
    else
150
      filename = file_inventory_request.output_file
×
151
      send_data File.read(filename), type: "text/plain", filename: "filelist.csv", disposition: "attachment"
×
152
    end
153
  end
154

155
  def send_globus_access_request
1✔
NEW
156
    project_id = params[:project_id].to_i
×
NEW
157
    TigerdataMailer.with(project_id: project_id, submitter: current_user).globus_access_request.deliver_later
×
158
  rescue StandardError => e
NEW
159
    render json: { error: e.message }, status: :unprocessable_entity
×
160
  end
161

162
  private
1✔
163

164
    def project_job_service
1✔
165
      @project_job_service ||= ProjectJobService.new(project:)
1✔
166
    end
167

168
    def project
1✔
169
      @project ||= begin
38✔
170
        project = Project.find(params[:id])
16✔
171
        @presenter = ProjectShowPresenter.new(project, current_user)
16✔
172
        if project&.mediaflux_id != nil && @presenter.user_has_access?(user: current_user)
12✔
173
          project
9✔
174
        else
175
          flash[:alert] = I18n.t(:access_denied)
3✔
176
          redirect_to dashboard_path
3✔
177
          nil
3✔
178
        end
179
      end
180
    end
181

182
    def eligible_editor?
1✔
183
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
×
184
    end
185

186
    def set_breadcrumbs
1✔
187
      add_breadcrumb("Dashboard",dashboard_path)
28✔
188
    end
189

190
    def search_projects
1✔
191
      @title_query = if params[:title_query].present?
3✔
192
        params[:title_query]
2✔
193
      else
194
        "*" # default to all projects
1✔
195
      end
196
      result =  ProjectSearch.new.call(search_string: @title_query, requestor: current_user)
3✔
197
      if result.success?
3✔
198
        flash[:notice] = "Successful search in Mediaflux for #{@title_query}"
3✔
199
        @project_presenters = result.value!
3✔
200
      else
201
        flash[:notice] = "Error searching projects for #{@title_query}.  Error: #{result.failure}"
×
202
        @project_presenters = []
×
203
      end
204
    end
205
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