50 lines
1.4 KiB
Ruby
50 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module BulkImports
|
|
module Groups
|
|
module Pipelines
|
|
class GroupAvatarPipeline
|
|
include Pipeline
|
|
|
|
ALLOWED_AVATAR_DOWNLOAD_TYPES = (AvatarUploader::MIME_WHITELIST + %w(application/octet-stream)).freeze
|
|
|
|
GroupAvatarLoadingError = Class.new(StandardError)
|
|
|
|
def extract(context)
|
|
context.extra[:tmpdir] = Dir.mktmpdir
|
|
|
|
filepath = BulkImports::FileDownloadService.new(
|
|
configuration: context.configuration,
|
|
relative_url: "/groups/#{context.entity.encoded_source_full_path}/avatar",
|
|
dir: context.extra[:tmpdir],
|
|
file_size_limit: Avatarable::MAXIMUM_FILE_SIZE,
|
|
allowed_content_types: ALLOWED_AVATAR_DOWNLOAD_TYPES
|
|
).execute
|
|
|
|
BulkImports::Pipeline::ExtractedData.new(data: { filepath: filepath })
|
|
end
|
|
|
|
def load(context, data)
|
|
return if data.blank?
|
|
|
|
File.open(data[:filepath]) do |avatar|
|
|
service = ::Groups::UpdateService.new(
|
|
portable,
|
|
current_user,
|
|
avatar: avatar
|
|
)
|
|
|
|
unless service.execute
|
|
raise GroupAvatarLoadingError, portable.errors.full_messages.first
|
|
end
|
|
end
|
|
end
|
|
|
|
def after_run(_)
|
|
FileUtils.remove_entry(context.extra[:tmpdir]) if context.extra[:tmpdir].present?
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|