diff --git a/app/controllers/api/projects/images_controller.rb b/app/controllers/api/projects/images_controller.rb index bb55f4ecb..7ee51e8d8 100644 --- a/app/controllers/api/projects/images_controller.rb +++ b/app/controllers/api/projects/images_controller.rb @@ -17,6 +17,18 @@ def create @project.images.attach(params[:images]) render '/api/projects/images', formats: [:json] end + + def update + @project = Project.find_by!(identifier: params[:project_id]) + authorize! :update, @project + + Rails.logger.debug params[:image] + Rails.logger.debug { "the filename is #{params[:image].original_filename}" } + existing_image = @project.images.find { |i| i.blob.filename == params[:image].original_filename } + existing_image.purge + @project.images.attach(params[:image]) + render '/api/projects/images', formats: [:json] + end end end end diff --git a/app/controllers/api/projects/remixes_controller.rb b/app/controllers/api/projects/remixes_controller.rb index 0eb1ba6e2..ce2bb03f5 100644 --- a/app/controllers/api/projects/remixes_controller.rb +++ b/app/controllers/api/projects/remixes_controller.rb @@ -54,7 +54,7 @@ def remix_params :videos, :audio, :instructions, - image_list: [], + image_list: %i[filename url content], components: %i[id name extension content index]) end end diff --git a/config/routes.rb b/config/routes.rb index f48edf7f1..ac704d57b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -38,7 +38,7 @@ put :finished, on: :member, to: 'school_projects#set_finished' resource :remix, only: %i[show create], controller: 'projects/remixes' resources :remixes, only: %i[index], controller: 'projects/remixes' - resource :images, only: %i[show create], controller: 'projects/images' + resource :images, only: %i[show create update], controller: 'projects/images' end resource :project_errors, only: %i[create] diff --git a/lib/concepts/project/operations/create_remix.rb b/lib/concepts/project/operations/create_remix.rb index ef42defc3..70efcef82 100644 --- a/lib/concepts/project/operations/create_remix.rb +++ b/lib/concepts/project/operations/create_remix.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'base64' + class Project class CreateRemix class << self @@ -11,7 +13,7 @@ def call(params:, user_id:, original_project:, remix_origin:) response rescue StandardError => e Sentry.capture_exception(e) - response[:error] = I18n.t('errors.project.remixing.cannot_save') + response[:error] = "#{I18n.t('errors.project.remixing.cannot_save')}: #{e.message}" response end @@ -31,8 +33,13 @@ def remix_project(response, params, user_id, original_project, remix_origin) def create_remix(original_project, params, user_id, remix_origin) remix = format_project(original_project, params, user_id, remix_origin) - original_project.images.each do |image| - remix.images.attach(image.blob) + params[:image_list].each do |image| + if image[:content].present? + remix.images.attach(io: extract_image_io(image), filename: image[:filename]) + else + existing_image = find_existing_image(image, original_project) + remix.images.attach(existing_image.blob) if existing_image + end end original_project.videos.each do |video| @@ -61,6 +68,14 @@ def format_project(original_project, params, user_id, remix_origin) proj.lesson_id = nil # Only the original can have a lesson id end end + + def extract_image_io(image) + StringIO.new(Base64.decode64(image[:content])) + end + + def find_existing_image(image, original_project) + original_project.images.find { |img| img.filename.to_s == image[:filename].to_s } + end end end end diff --git a/spec/concepts/project/create_remix_spec.rb b/spec/concepts/project/create_remix_spec.rb index 3978c47bc..b1c0e0822 100644 --- a/spec/concepts/project/create_remix_spec.rb +++ b/spec/concepts/project/create_remix_spec.rb @@ -20,7 +20,12 @@ extension: component.extension, content: 'some updated component content' } - ] + ], + image_list: original_project.images.map do |image| + { + filename: image.filename.to_s + } + end } end