From 4385c68f5fdf94f978240fa414fadc168e4fb879 Mon Sep 17 00:00:00 2001 From: zmagod Date: Tue, 21 Mar 2017 16:15:11 +0100 Subject: [PATCH] adds zip_export utility first run --- app/controllers/zip_exports_controller.rb | 21 +++++++++++ app/models/zip_export.rb | 6 ++++ app/utilities/delayed_exporter.rb | 36 +++++++++++++++++++ config/locales/en.yml | 2 ++ config/routes.rb | 5 +++ .../20170321131116_create_zip_exports.rb | 10 ++++++ db/schema.rb | 15 +++++++- test/fixtures/zip_exports.yml | 9 +++++ test/models/zip_export_test.rb | 7 ++++ 9 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 app/controllers/zip_exports_controller.rb create mode 100644 app/models/zip_export.rb create mode 100644 app/utilities/delayed_exporter.rb create mode 100644 db/migrate/20170321131116_create_zip_exports.rb create mode 100644 test/fixtures/zip_exports.yml create mode 100644 test/models/zip_export_test.rb diff --git a/app/controllers/zip_exports_controller.rb b/app/controllers/zip_exports_controller.rb new file mode 100644 index 000000000..d51c696f0 --- /dev/null +++ b/app/controllers/zip_exports_controller.rb @@ -0,0 +1,21 @@ +class ZipExportsController < ApplicationController + before_action :load_var + before_action :check_edit_permissions + + def download + send_data @zip_export.zip_file, + filename: @zip_export.file_file_name + '.zip', + type: @zip_export.file_content_type + end + + private + + def load_var + @zip_export = ZipExport.find_by_id(params[:id]) + render_404 unless @zip_export + end + + def check_edit_permissions + render_403 unless @zip_export.user == current_user + end +end diff --git a/app/models/zip_export.rb b/app/models/zip_export.rb new file mode 100644 index 000000000..74b2c5fc6 --- /dev/null +++ b/app/models/zip_export.rb @@ -0,0 +1,6 @@ +class ZipExport < ActiveRecord::Base + belongs_to :user + has_attached_file :zip_file + validates_attachment :zip_file, + content_type: { content_type: 'application/zip' } +end diff --git a/app/utilities/delayed_exporter.rb b/app/utilities/delayed_exporter.rb new file mode 100644 index 000000000..1fdac4d88 --- /dev/null +++ b/app/utilities/delayed_exporter.rb @@ -0,0 +1,36 @@ +require 'zip' +require 'tmpdir' + +class DelayedExporter + include Rails.application.routes.url_helpers + + def initialize(options = {}) + @user = options.fetch(:user) { :user_must_be_present } + @zip_export = ZipExport.new(user: @user) + end + + def run(&collection) + Delayed::Job.enqueue(setup(&collection)) + end + + def setup + temp_dir = Dir.mktempdir + zip_path = File.join(temp_dir, 'export.zip') + Zip::ZipFile.open(zip_path, true) do |zipfile| + yield(zipfile) if block_given? + end + @zip_export.zip_file = File.open(zip_path) + generate_notification if @zip_export.save + end + + private + + def generate_notification + notification = Notification.create( + type_of: :system_message, + title: t('zip_export.notification_title'), + message: zip_exports_download_url(@zip_export) + ) + UserNotification.create(notification: notification, user: @user.id) + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 65b75d20b..5e216b9c7 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1542,6 +1542,8 @@ en: deleted: "(deleted)" popover_html: "Team: %{team}
Role: %{role}
Joined: %{time}" + zip_export: + notification_title: 'Your package is ready to be exported!' # This section contains general words that can be used in any parts of # application. diff --git a/config/routes.rb b/config/routes.rb index 83da5977b..778651566 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -113,6 +113,11 @@ Rails.application.routes.draw do to: 'user_notifications#index', as: 'notifications' + # Get Zip Export + get 'zip_exports/download/:id', + to: 'zip_exports#download', + as: 'zip_exports_download' + resources :teams do resources :samples, only: [:new, :create] resources :sample_types, except: [:show, :new] do diff --git a/db/migrate/20170321131116_create_zip_exports.rb b/db/migrate/20170321131116_create_zip_exports.rb new file mode 100644 index 000000000..5794d9e45 --- /dev/null +++ b/db/migrate/20170321131116_create_zip_exports.rb @@ -0,0 +1,10 @@ +class CreateZipExports < ActiveRecord::Migration + def change + create_table :zip_exports do |t| + t.references :user, index: true, foreign_key: true + t.timestamps null: false + end + + add_attachment :zip_exports, :zip_file + end +end diff --git a/db/schema.rb b/db/schema.rb index 130b67a88..552db9a4d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170306121855) do +ActiveRecord::Schema.define(version: 20170321131116) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -700,6 +700,18 @@ ActiveRecord::Schema.define(version: 20170306121855) do t.string "proof_key_old_exp", null: false end + create_table "zip_exports", force: :cascade do |t| + t.integer "user_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "zip_file_file_name" + t.string "zip_file_content_type" + t.integer "zip_file_file_size" + t.datetime "zip_file_updated_at" + end + + add_index "zip_exports", ["user_id"], name: "index_zip_exports_on_user_id", using: :btree + add_foreign_key "activities", "my_modules" add_foreign_key "activities", "projects" add_foreign_key "activities", "users" @@ -815,4 +827,5 @@ ActiveRecord::Schema.define(version: 20170306121855) do add_foreign_key "users", "teams", column: "current_team_id" add_foreign_key "wopi_actions", "wopi_apps" add_foreign_key "wopi_apps", "wopi_discoveries" + add_foreign_key "zip_exports", "users" end diff --git a/test/fixtures/zip_exports.yml b/test/fixtures/zip_exports.yml new file mode 100644 index 000000000..0c6315ce4 --- /dev/null +++ b/test/fixtures/zip_exports.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + user_id: + zip_file: + +two: + user_id: + zip_file: diff --git a/test/models/zip_export_test.rb b/test/models/zip_export_test.rb new file mode 100644 index 000000000..d561373a7 --- /dev/null +++ b/test/models/zip_export_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ZipExportTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end