Skip to content

Commit c79a8e3

Browse files
authored
542 cleaning exported files (#750)
* Creating a cron job to delete old exported files Adding whenever gem to tigerdata Automated cron job deletes exported files that are more than one week old. * rubocop 🚨 * updating cron job * deleting inventory request record a week after it is created, and after the rake task deletes the file
1 parent 7d2ca80 commit c79a8e3

File tree

7 files changed

+104
-2
lines changed

7 files changed

+104
-2
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ gem "mailcatcher"
6565
gem "net-http-persistent"
6666
gem "sidekiq"
6767

68+
gem "whenever", require: false
6869
group :staging, :production do
6970
gem "ddtrace", require: "ddtrace/auto_instrument"
7071
end

Gemfile.lock

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ GEM
136136
rack-test (>= 0.6.3)
137137
regexp_parser (>= 1.5, < 3.0)
138138
xpath (~> 3.2)
139+
chronic (0.10.2)
139140
coderay (1.1.3)
140141
coercible (1.0.0)
141142
descendants_tracker (~> 0.0.1)
@@ -495,6 +496,8 @@ GEM
495496
websocket-driver (0.7.6)
496497
websocket-extensions (>= 0.1.0)
497498
websocket-extensions (0.1.5)
499+
whenever (1.0.0)
500+
chronic (>= 0.6.3)
498501
xpath (3.2.0)
499502
nokogiri (~> 1.8)
500503
yard (0.9.36)
@@ -557,6 +560,7 @@ DEPENDENCIES
557560
vite_rails
558561
web-console
559562
webmock
563+
whenever
560564
yard
561565

562566
RUBY VERSION

app/jobs/delete_user_job.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
class DeleteUserJob < ApplicationJob
3+
queue_as :default
4+
5+
def perform(job_id:, user_id:)
6+
user = User.find(user_id)
7+
job = UserJob.find(job_id)
8+
job.delete
9+
10+
mark_user_job_as_complete(job_id: job_id, user: user)
11+
end
12+
13+
private
14+
15+
def mark_user_job_as_complete(job_id:, user:)
16+
user_job = UserJob.create_and_link_to_user(job_id: job_id, user: user, job_title: "Deleting user job with id: #{job_id}")
17+
user_job.completed_at = Time.current.in_time_zone("America/New_York").iso8601
18+
user_job.save!
19+
user_job.reload
20+
end
21+
end

app/jobs/list_project_contents_job.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# frozen_string_literal: true
22
class ListProjectContentsJob < ApplicationJob
3+
after_perform do |job|
4+
uid = job.arguments.first[:user_id]
5+
DeleteUserJob.set(wait: 1.week).perform_later(job_id: job_id, user_id: uid)
6+
end
7+
38
def perform(user_id:, project_id:)
49
project = Project.find(project_id)
510
raise "Invalid project id #{project_id} for job #{job_id}" if project.nil?

config/schedule.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# frozen_string_literal: true
2+
# Use this file to easily define all of your cron jobs.
3+
#
4+
# It's helpful, but not entirely necessary to understand cron before proceeding.
5+
# http://en.wikipedia.org/wiki/Cron
6+
7+
# Example:
8+
#
9+
# set :output, "/path/to/my/cron_log.log"
10+
#
11+
# every 2.hours do
12+
# command "/usr/bin/some_great_command"
13+
# runner "MyModel.some_method"
14+
# rake "some:great:rake:task"
15+
# end
16+
#
17+
# every 4.days do
18+
# runner "AnotherModel.prune_old_records"
19+
# end
20+
21+
# Learn more: http://github.com/javan/whenever
22+
23+
every 1.day do
24+
rake "exports:delete_old"
25+
end

lib/tasks/exports.rake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ namespace :exports do
99
end
1010
end
1111

12-
desc "Deletes files that are too old (default to 30 days)"
12+
desc "Deletes files that are too old (default to 7 days)"
1313
task :delete_old, [:days] => [:environment] do |_, args|
14-
days = (args[:days] || "30").to_i
14+
days = (args[:days] || "7").to_i
1515
pathname = Pathname.new(Rails.configuration.mediaflux["shared_files_location"])
1616
scan_directory(pathname.join("*.csv")).each do |file|
1717
if file[:age] > days

spec/jobs/delete_user_job_spec.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# frozen_string_literal: true
2+
require "rails_helper"
3+
4+
RSpec.describe DeleteUserJob, stub_mediaflux: true do
5+
let(:user) { FactoryBot.create(:user) }
6+
let(:sponsor_user) { FactoryBot.create(:project_sponsor, uid: "pul123") }
7+
let(:metadata) do
8+
{
9+
data_sponsor: sponsor_user.uid,
10+
data_manager: sponsor_user.uid,
11+
project_directory: "project-123",
12+
title: "project 123",
13+
departments: ["RDSS"],
14+
description: "hello world",
15+
status: ::Project::PENDING_STATUS
16+
}
17+
end
18+
19+
let(:project_in_mediaflux) { FactoryBot.create(:project, mediaflux_id: 8888, metadata: metadata) }
20+
21+
before do
22+
stub_request(:post, "http://mediaflux.example.com:8888/__mflux_svc__")
23+
.with(body: /<service name=\"asset.query\" session=\"test-session-token\">/)
24+
.to_return(status: 200, body: fixture_file("files/query_response.xml"))
25+
26+
stub_request(:post, "http://mediaflux.example.com:8888/__mflux_svc__")
27+
.with(body: /<service name=\"asset.query.iterate\" session=\"test-session-token\">/)
28+
.to_return(status: 200, body: fixture_file("files/iterator_response_get_values.xml"))
29+
30+
stub_request(:post, "http://mediaflux.example.com:8888/__mflux_svc__")
31+
.with(body: /<service name=\"asset.query.iterator.destroy\" session=\"test-session-token\">/)
32+
.to_return(status: 200, body: "")
33+
end
34+
35+
describe "#perform_now" do
36+
it "deletes the user job that requested file inventory" do
37+
# Request inventory
38+
job = ListProjectContentsJob.perform_now(user_id: user.id, project_id: project_in_mediaflux.id)
39+
40+
# Delete the inventory request record after a week
41+
uid = user.id.to_s
42+
described_class.perform_now(user_id: uid, job_id: job.id)
43+
expect(user.user_jobs.where("id=#{job.id}").empty?).to be_truthy
44+
end
45+
end
46+
end

0 commit comments

Comments
 (0)