diff --git a/app/controllers/v1/learning_objects/attachment_controller.rb b/app/controllers/v1/learning_objects/attachment_controller.rb index 7309fc82b2790c02651bccaf064ce5b465387ed8..cc71c6d0f1cd146913c9fc0488eb9a5b003875e9 100644 --- a/app/controllers/v1/learning_objects/attachment_controller.rb +++ b/app/controllers/v1/learning_objects/attachment_controller.rb @@ -6,7 +6,7 @@ class V1::LearningObjects::AttachmentController < ApplicationController def destroy return render status: :not_found if @learning_object.nil? || @attachment.nil? - destroy_attachment_in_dspace(@attachment.id_dspace) + DeleteBitstreamWorker.perform_async(@attachment.id) @attachment.destroy render status: :ok @@ -28,9 +28,4 @@ class V1::LearningObjects::AttachmentController < ApplicationController authorize(@learning_object, :destroy?) end - - def destroy_attachment_in_dspace(id) - client = DspaceService.create_client - client.bitstreams.delete(id: id) - end end diff --git a/app/controllers/v1/learning_objects/chunks_controller.rb b/app/controllers/v1/learning_objects/chunks_controller.rb index cc89e025261b02a570b285affc9343c47958f038..a65e77f3d613c51e00a26e535ec677e0f9e651ff 100644 --- a/app/controllers/v1/learning_objects/chunks_controller.rb +++ b/app/controllers/v1/learning_objects/chunks_controller.rb @@ -13,16 +13,13 @@ class V1::LearningObjects::ChunksController < ApplicationController if last_chunk? combine_file! - post_file! - - # TODO render new attachment ID - render status: 200 - return + attachment = post_file! + render json: attachment, status: :ok + else + render status: :ok end - - render status: 200 rescue - render status: 500 + render status: :internal_server_error end private @@ -34,17 +31,7 @@ class V1::LearningObjects::ChunksController < ApplicationController # Never trust parameters from the scary internet, only allow the white list through. def chunks_params - params.permit( - :id, - :file, - :_chunkNumber, - :_totalChunks, - :_chunkFilename, - :_chunkIdentifier, - :_chunkSize, - :_currentChunkSize, - :_totalSize - ) + params.permit(:id, :file, :_chunkNumber, :_totalChunks, :_chunkFilename, :_chunkIdentifier, :_chunkSize, :_currentChunkSize, :_totalSize) end def post_file! diff --git a/app/controllers/v1/learning_objects_controller.rb b/app/controllers/v1/learning_objects_controller.rb index 787cffc2ee8a59f77bfc3f6d22a6c19e1c023a25..ad9935aa1361acecc8e1f0e33ee04d6cd9d4ed49 100644 --- a/app/controllers/v1/learning_objects_controller.rb +++ b/app/controllers/v1/learning_objects_controller.rb @@ -14,7 +14,7 @@ class V1::LearningObjectsController < ApplicationController before_action :set_learning_object, only: [:show, :update, :destroy, :subjecting, :unsubjecting, :add_stages, :remove_stages] before_action :set_new_learning_object, only: :index before_action :authorize!, except: [:create, :tagging, :untagging, :download] - before_action :set_paper_trail_whodunnit + before_action :set_paper_trail_whodunnit, except: [:index, :show] def index learning_objects = paginate LearningObject.includes(:tags, :publisher, :language, :license, :subjects, :educational_stages, :reviews) diff --git a/app/services/learning_object_publisher.rb b/app/services/learning_object_publisher.rb index a2ba1089ea51d7e405dafa32e0330e21e0727aa9..096eff5bb2173550bddfab410e9d9b183b01eabf 100644 --- a/app/services/learning_object_publisher.rb +++ b/app/services/learning_object_publisher.rb @@ -20,7 +20,9 @@ class LearningObjectPublisher # post *media_path* to *learning_object* on dspace def upload(learning_object, media_path) - DspaceUploadWorker.perform_async learning_object.id, media_path, learning_object.description + attachment = learning_object.attachments.create(name: File.basename(media_path)) + DspaceUploadWorker.perform_async(learning_object.id, media_path, attachment.id, learning_object.description) + attachment end ## publish *learning_object* @@ -29,7 +31,7 @@ class LearningObjectPublisher return true if learning_object.published? learning_object.state = LearningObject.states[:published] - learning_object.published_at = Time.now + learning_object.published_at = Time.current ThumbnailGenerateWorker.perform_async learning_object.id, learning_object.link if learning_object.link? learning_object.save end diff --git a/app/workers/delete_bitstream_worker.rb b/app/workers/delete_bitstream_worker.rb new file mode 100644 index 0000000000000000000000000000000000000000..b19d59654894af46f56166bd95dfab936862808f --- /dev/null +++ b/app/workers/delete_bitstream_worker.rb @@ -0,0 +1,28 @@ +require_dependency 'dspace' + +class DeleteBitstreamWorker + include Sidekiq::Worker + + def perform(attachment_id = nil) + attachment = LearningObject::Attachment.find(attachment_id) + return false if attachment.blank? || !wait_bitstream(attachment) + + # Require dspace gem + Bundler.require(*Rails.groups) + + DspaceService.create_client.bitstreams.delete(id: attachment.id_dspace) + end + + private + + def wait_bitstream(attachment) + if attachment.id_dspace.blank? + Timeout.timeout(60) do + sleep(1.0) while attachment.id_dspace.blank? + end + end + true + rescue Timeout::Error + false + end +end diff --git a/app/workers/dspace_upload_worker.rb b/app/workers/dspace_upload_worker.rb index 5e27970055bfc9ff00e605bcc5b343ea5f47b53a..e7f64b155402897ef6ac04cdf5a293cbc03cefdf 100644 --- a/app/workers/dspace_upload_worker.rb +++ b/app/workers/dspace_upload_worker.rb @@ -1,24 +1,40 @@ +require_dependency 'dspace' + class DspaceUploadWorker include Sidekiq::Worker @@dspace = nil - def perform(learning_object_id, media_path, description = nil) + def perform(learning_object_id, media_path, attachment_id = nil, description = nil) # find learning object learning_object = LearningObject.find learning_object_id return false if learning_object.blank? + # Require dspace gem + Bundler.require(*Rails.groups) + # create attachment file = File.new(media_path, 'r') bitstream = dspace.items.add_bitstream(file, id: learning_object.id_dspace, name: File.basename(media_path), description: description) - attachment = learning_object.attachments.create map_bitstream2attachment(bitstream) + attachment = create_attachment(learning_object, bitstream, attachment_id) ThumbnailGenerateWorker.perform_async attachment.id, media_path end private + def create_attachment(learning_object, bitstream, attachment_id = nil) + unless attachment_id.nil? + attachment = learning_object.attachments.find(attachment_id) + unless attachment.nil? + attachment.update(map_bitstream2attachment(bitstream)) + return attachment + end + end + learning_object.attachments.create map_bitstream2attachment(bitstream) + end + def publisher @publisher ||= LearningObjectPublisher.new(dspace) end