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

pulibrary / tigerdata-app / d0ec7503-d043-4d89-92d6-13f93b4a78a2

07 May 2025 11:40PM UTC coverage: 84.551% (-0.1%) from 84.649%
d0ec7503-d043-4d89-92d6-13f93b4a78a2

Pull #1456

circleci

carolyncole
Adding documentation about the request wizard pattern
refs #1437
Pull Request #1456: Adding documentation about the request wizard pattern

4 of 4 branches covered (100.0%)

2512 of 2971 relevant lines covered (84.55%)

463.41 hits per line

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

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

4
  before_action :set_breadcrumbs
1✔
5

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

10
    redirect_to dashboard_path
2✔
11
  end
12

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

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

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

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

49
    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✔
50
    flash[:notice] = error_message
2✔
51

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

67
    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."
×
68

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

73
  def details
1✔
74
    return if project.blank?
33✔
75

76
    add_breadcrumb(project.title, project_path)
32✔
77
    add_breadcrumb("Details")
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
    if current_user.eligible_sysadmin?
5✔
175
      @projects = Project.all
1✔
176
    else
177
      flash[:alert] = I18n.t(:access_denied)
4✔
178
      redirect_to dashboard_path
4✔
179
    end
180
  end
181

182
  def confirmation; end
1✔
183
  def revision_confirmation; end
1✔
184

185
  def show
1✔
186
    return if project.blank?
33✔
187

188
    add_breadcrumb(project.title, project_path)
32✔
189
    add_breadcrumb("Contents")
32✔
190

191
    @latest_completed_download = current_user.user_requests.where(project_id: @project.id, state: "completed").order(:completion_time).last
32✔
192
    @storage_usage = project.storage_usage(session_id: current_user.mediaflux_session)
32✔
193
    @storage_capacity = project.storage_capacity(session_id: current_user.mediaflux_session)
28✔
194

195
    @num_files = project.asset_count(session_id: current_user.mediaflux_session)
28✔
196

197
    @file_list = project.file_list(session_id: current_user.mediaflux_session, size: 100)
28✔
198
    @files = @file_list[:files]
28✔
199
    @files.sort_by!(&:path)
28✔
200
    @project = ProjectShowPresenter.new(project)
28✔
201

202
    @project_session = "content"
28✔
203
  end
204

205
  def project_job_service
1✔
206
    @project_job_service ||= ProjectJobService.new(project:)
1✔
207
  end
208

209
  def list_contents
1✔
210
    return if project.blank?
2✔
211

212
    project_job_service.list_contents_job(user: current_user)
1✔
213

214
    json_response = {
215
      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✔
216
    }
217
    render json: json_response
1✔
218
  rescue => ex
219
    message = "Error producing document list (project id: #{project&.id}): #{ex.message}"
×
220
    Rails.logger.error(message)
×
221
    Honeybadger.notify(message)
×
222
    render json: { message: "Document list could not be generated." }
×
223
  end
224

225
  def file_list_download
1✔
226
    job_id = params[:job_id]
×
227
    user_request = FileInventoryRequest.where(job_id:job_id).first
×
228
    if user_request.nil?
×
229
      # TODO: handle error
230
      redirect_to "/"
×
231
    else
232
      filename = user_request.output_file
×
233
      send_data File.read(filename), type: "text/plain", filename: "filelist.csv", disposition: "attachment"
×
234
    end
235
  end
236

237
  def approve
1✔
238
    if current_user.eligible_sysadmin?
7✔
239
      add_breadcrumb(project.title, project_path)
4✔
240
      add_breadcrumb("Approval Settings", project_approve_path)
4✔
241
      add_breadcrumb("Edit")
4✔
242
      project
4✔
243
      @departments = project.departments.join(", ")
4✔
244
      @project_metadata = project.metadata
4✔
245
      sponsor_uid = @project_metadata[:data_sponsor]
4✔
246
      @data_sponsor = User.find_by(uid: sponsor_uid)
4✔
247
      @provenance_events = project.provenance_events.where.not(event_type: ProvenanceEvent::STATUS_UPDATE_EVENT_TYPE)
4✔
248

249
      @title = @project_metadata["title"]
4✔
250
    else redirect_to dashboard_path
3✔
251
    end
252
  end
253

254
  def create_script
1✔
255
    project_id = params[:id]
×
256
    project = Project.find(project_id)
×
257
    service = MediafluxScriptFactory.new(project: project)
×
258
    respond_to do |format|
×
259
      format.json { render json: {script: service.aterm_script} }
×
260
    end
261
  end
262

263
  private
1✔
264

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

269
    def project
1✔
270
      @project ||= begin
591✔
271
        project = Project.find(params[:id])
86✔
272
        if project.user_has_access?(user: current_user)
86✔
273
          project
83✔
274
        else
275
          flash[:alert] = I18n.t(:access_denied)
3✔
276
          redirect_to dashboard_path
3✔
277
          nil
3✔
278
        end
279
      end
280
    end
281

282
    def eligible_editor?
1✔
283
      return true if current_user.eligible_sponsor? or current_user.eligible_manager?
22✔
284
    end
285

286
    def shared_file_location(filename)
1✔
287
      raise "Shared location is not configured" if Rails.configuration.mediaflux["shared_files_location"].blank?
×
288
      location = Pathname.new(Rails.configuration.mediaflux["shared_files_location"])
×
289
      location.join(filename).to_s
×
290
    end
291

292
    def set_breadcrumbs
1✔
293
      add_breadcrumb("Dashboard",dashboard_path)
145✔
294
    end
295
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