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

pulibrary / tigerdata-app / ad0791fe-7346-4026-bd55-b502efecf5e4

06 Feb 2025 03:29PM UTC coverage: 84.216% (+0.05%) from 84.171%
ad0791fe-7346-4026-bd55-b502efecf5e4

Pull #1290

circleci

carolyncole
Moving access check to a before filter
getting tests to pass
Pull Request #1290: Only allow projects access to users that are specified as part of the project

4 of 4 branches covered (100.0%)

13 of 17 new or added lines in 2 files covered. (76.47%)

17 existing lines in 1 file now uncovered.

2353 of 2794 relevant lines covered (84.22%)

391.56 hits per line

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

82.66
/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 :check_access, only: [:show, :details, :edit, :update, :list_contents, :file_list_download]
1✔
6

7
  def new
1✔
8
    add_breadcrumb("New Project Request")
16✔
9
    return build_new_project if current_user.eligible_sponsor?
16✔
10

11
    redirect_to root_path
2✔
12
  end
13

14
  def project_params
1✔
UNCOV
15
    params.dup
×
16
  end
17

18
  def create
1✔
19
    metadata_params = params.dup
12✔
20
    metadata_params[:status] = Project::PENDING_STATUS
12✔
21
    metadata_params[:created_by] = current_user.uid
12✔
22
    metadata_params[:created_on] = Time.current.in_time_zone("America/New_York").iso8601
12✔
23
    project_metadata = ProjectMetadata.new_from_params(metadata_params)
12✔
24

25
    build_new_project # calling private method to build a new project and set a class variable @project
12✔
26
    project.create!(initial_metadata: project_metadata, user: current_user)
12✔
27
    if project.metadata_model.project_id != nil
12✔
28
      begin
29
        mailer = TigerdataMailer.with(project_id: project.id)
12✔
30
        message_delivery = mailer.project_creation
12✔
31
        message_delivery.deliver_later
12✔
32

33
        redirect_to project_confirmation_path(project)
11✔
34
      rescue StandardError => mailer_error
35
        raise(TigerData::MailerError, mailer_error)
2✔
36
      end
37
    else
UNCOV
38
      render :new
×
39
    end
40
  rescue TigerData::MailerError => mailer_error
41
    logger_message = "Error encountered creating the project #{project.id} as user #{current_user.email}"
2✔
42
    Rails.logger.error(logger_message)
2✔
43
    honeybadger_context = {
44
      current_user_email: current_user.email,
2✔
45
      project_id: project.id,
46
      project_metadata: project.metadata
47
    }
48
    Honeybadger.notify(mailer_error, context: honeybadger_context)
2✔
49

50
    error_message = "We are sorry, while the project was successfully created, an error was encountered which prevents the delivery of an e-mail message confirming this. Please know that this error has been logged, and shall be reviewed by members of RDSS."
2✔
51
    flash[:notice] = error_message
2✔
52

53
    render :new
2✔
54
  rescue StandardError => error
55
    logger_message = if project.persisted?
×
UNCOV
56
                      "Error encountered creating the project #{project.id} as user #{current_user.email}"
×
57
                     else
UNCOV
58
                      "Error encountered creating the project #{metadata_params[:title]} as user #{current_user.email}"
×
59
                     end
UNCOV
60
    Rails.logger.error(logger_message)
×
61
    honeybadger_context = {
UNCOV
62
      current_user_email: current_user.email,
×
63
      project_id: project.id,
64
      project_metadata: project.metadata
65
    }
UNCOV
66
    Honeybadger.notify(error, context: honeybadger_context)
×
67

UNCOV
68
    error_message = "We are sorry, the project was not successfully created, and an error was encountered which prevents the delivery of an e-mail message confirming this. Please know that this error has been logged, and shall be reviewed by members of RDSS promptly."
×
69

70
    flash[:notice] = error_message
×
UNCOV
71
    render :new
×
72
  end
73

74
  def details
1✔
75
    add_breadcrumb(project.title, project_path)
32✔
76
    add_breadcrumb("Details")
32✔
77
    project
32✔
78

79
    @departments = project.departments.join(", ")
32✔
80
    @project_metadata = project.metadata_model
32✔
81

82
    @data_sponsor = User.find_by(uid: @project_metadata.data_sponsor)
32✔
83
    @data_manager = User.find_by(uid: @project_metadata.data_manager)
32✔
84

85
    read_only_uids = @project_metadata.ro_users
32✔
86
    data_read_only_users = read_only_uids.map { |uid| ReadOnlyUser.find_by(uid:) }.reject(&:blank?)
48✔
87

88
    read_write_uids = @project_metadata.rw_users
32✔
89
    data_read_write_users = read_write_uids.map { |uid| User.find_by(uid:) }.reject(&:blank?)
44✔
90

91
    unsorted_data_users = data_read_only_users + data_read_write_users
32✔
92
    sorted_data_users = unsorted_data_users.sort_by { |u| u.family_name || u.uid }
60✔
93
    @data_users = sorted_data_users.uniq { |u| u.uid }
52✔
94
    user_model_names = @data_users.map(&:display_name_safe)
32✔
95
    @data_user_names = user_model_names.join(", ")
32✔
96

97
    @provenance_events = project.provenance_events.where.not(event_type: ProvenanceEvent::STATUS_UPDATE_EVENT_TYPE)
32✔
98

99
    @project_eligible_to_edit = true if project.status == Project::APPROVED_STATUS && eligible_editor?
32✔
100

101
    @project_metadata = @project.metadata
32✔
102
    @project_id = @project_metadata[:project_id] || {}
32✔
103
    @storage_capacity = @project_metadata[:storage_capacity]
32✔
104
    @size = @storage_capacity[:size]
32✔
105
    @unit = @storage_capacity[:unit]
32✔
106

107
    @requested_size = @size[:requested]
32✔
108
    @requested_unit = @unit[:requested]
32✔
109

110
    @approved_size = @size[:approved]
32✔
111
    @approved_unit = @unit[:approved]
32✔
112

113
    @storage_expectations = @project_metadata[:storage_performance_expectations]
32✔
114
    @requested_storage_expectations = @storage_expectations[:requested]
32✔
115
    @approved_storage_expectations = @storage_expectations[:approved]
32✔
116

117
    @project_purpose = @project_metadata[:project_purpose]
32✔
118

119

120
    @project_session = "details"
32✔
121

122

123
    respond_to do |format|
32✔
124
      format.html do
32✔
125
        @project = ProjectShowPresenter.new(project)
29✔
126
      end
127
      format.json do
32✔
128
        render json: project.to_json
2✔
129
      end
130
      format.xml do
32✔
131
        render xml: project.to_xml
1✔
132
      end
133
    end
134
  end
135

136
  def edit
1✔
137
    add_breadcrumb(project.title, project_path)
16✔
138
    add_breadcrumb("Edit")
16✔
139
    project
16✔
140
    if project.metadata_model.status != Project::APPROVED_STATUS
16✔
141
      flash[:notice] = "Pending projects can not be edited."
1✔
142
      redirect_to project
1✔
143
    elsif project.metadata_model.status == Project::APPROVED_STATUS && !eligible_editor? #check if the current user is a sponsor or a manager
15✔
144
      flash[:notice] = "Only data sponsors and data managers can revise this project."
2✔
145
      redirect_to project
2✔
146
    end
147
  end
148

149
  def update
1✔
150
    @project = Project.find(params[:id])
8✔
151
    #Approve action
152
    if params.key?("mediaflux_id")
8✔
153
      @project.metadata_model.update_with_params(params, current_user)
2✔
154
      @project.approve!(mediaflux_id: params["mediaflux_id"],current_user:)
2✔
155
    end
156

157
    #Edit action
158
    if params.key?("title")
8✔
159
      @project.metadata_model.status = @project.metadata_model.status || Project::PENDING_STATUS
6✔
160
      @project.metadata_model.update_with_params(params, current_user)
6✔
161
    end
162

163
    # @todo ProjectMetadata should be refactored to implement ProjectMetadata.valid?(updated_metadata)
164
    if project.save and params.key?("mediaflux_id")
8✔
165
      redirect_to project_approval_received_path(@project)
2✔
166
    elsif project.save and params.key?("title")
6✔
167
      redirect_to project_revision_confirmation_path(@project)
6✔
168
    else
169
      render :edit
×
170
    end
171
  end
172

173
  def index
1✔
174
    @projects = Project.all
2✔
175
  end
176

177
  def confirmation; end
1✔
178
  def revision_confirmation; end
1✔
179

180
  def show
1✔
181
    add_breadcrumb(project.title, project_path)
31✔
182
    add_breadcrumb("Contents")
31✔
183
    project
31✔
184

185
    @latest_completed_download = current_user.user_requests.where(project_id: @project.id, state: "completed").order(:completion_time).last
31✔
186
    @storage_usage = project.storage_usage(session_id: current_user.mediaflux_session)
31✔
187
    @storage_capacity = project.storage_capacity(session_id: current_user.mediaflux_session)
27✔
188

189
    @num_files = project.asset_count(session_id: current_user.mediaflux_session)
27✔
190

191
    @file_list = project.file_list(session_id: current_user.mediaflux_session, size: 100)
27✔
192
    @files = @file_list[:files]
27✔
193
    @files.sort_by!(&:path)
27✔
194
    @project = ProjectShowPresenter.new(project)
27✔
195

196
    @project_session = "content"
27✔
197
  end
198

199
  def project_job_service
1✔
200
    @project_job_service ||= ProjectJobService.new(project:)
1✔
201
  end
202

203
  def list_contents
1✔
204
    project_job_service.list_contents_job(user: current_user)
1✔
205

206
    json_response = {
207
      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✔
208
    }
209
    render json: json_response
1✔
210
  rescue => ex
NEW
UNCOV
211
    message = "Error producing document list (project id: #{project&.id}): #{ex.message}"
×
212
    Rails.logger.error(message)
×
213
    Honeybadger.notify(message)
×
214
    render json: { message: "Document list could not be generated." }
×
215
  end
216

217
  def file_list_download
1✔
UNCOV
218
    job_id = params[:job_id]
×
219
    user_request = FileInventoryRequest.where(job_id:job_id).first
×
220
    if user_request.nil?
×
221
      # TODO: handle error
UNCOV
222
      redirect_to "/"
×
223
    else
UNCOV
224
      filename = user_request.output_file
×
225
      send_data File.read(filename), type: "text/plain", filename: "filelist.csv", disposition: "attachment"
×
226
    end
227
  end
228

229
  def approve
1✔
230
    if current_user.eligible_sysadmin?
7✔
231
      add_breadcrumb(project.title, project_path)
4✔
232
      add_breadcrumb("Approval Settings", project_approve_path)
4✔
233
      add_breadcrumb("Edit")
4✔
234
      project
4✔
235
      @departments = project.departments.join(", ")
4✔
236
      @project_metadata = project.metadata
4✔
237
      sponsor_uid = @project_metadata[:data_sponsor]
4✔
238
      @data_sponsor = User.find_by(uid: sponsor_uid)
4✔
239
      @provenance_events = project.provenance_events.where.not(event_type: ProvenanceEvent::STATUS_UPDATE_EVENT_TYPE)
4✔
240

241
      @title = @project_metadata["title"]
4✔
242
    else redirect_to root_path
3✔
243
    end
244
  end
245

246
  def create_script
1✔
UNCOV
247
    project_id = params[:id]
×
248
    project = Project.find(project_id)
×
249
    service = MediafluxScriptFactory.new(project: project)
×
250
    respond_to do |format|
×
251
      format.json { render json: {script: service.aterm_script} }
×
252
    end
253
  end
254

255
  private
1✔
256

257
    def check_access
1✔
258
      return if project.user_has_access?(user: current_user)
90✔
259

260
      flash[:alert] = "Access Denied"
2✔
261
      redirect_to root_path
2✔
262
    end
263

264
    def build_new_project
1✔
265
      @project ||= Project.new
26✔
266
    end
267

268
    def project
1✔
269
      @project ||= Project.find(params[:id])
670✔
270
    end
271

272
    def eligible_editor?
1✔
273
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
22✔
274
    end
275

276
    def shared_file_location(filename)
1✔
NEW
UNCOV
277
      raise "Shared location is not configured" if Rails.configuration.mediaflux["shared_files_location"].blank?
×
NEW
UNCOV
278
      location = Pathname.new(Rails.configuration.mediaflux["shared_files_location"])
×
NEW
UNCOV
279
      location.join(filename).to_s
×
280
    end
281

282
    def set_breadcrumbs
1✔
283
      add_breadcrumb("Dashboard","/")
140✔
284
    end
285
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