Пользователь может импортировать свои данные с других сайтов. Все, что ему нужно сделать, это ввести свое имя пользователя на иностранном сайте, и мы возьмем все фотографии и сохраним их в своей галерее. Некоторые из изображений необходимо преобразовать с помощью rMagick (вращающийся, водяной знак), который зависит от импортера (зависит от того, на каком веб-сайте пользователь выбирает импорт данных)
Мы обсуждаем самый сексуальный и самый гибкий способ сделать это. Мы используем несущую волну, но мы перейдем к скрепке, если она нам больше подходит.
Структура импортера
Текущая структура выглядит как (ее грубо псевдокод)
module Importer
class Website1
def grab_pictures
end
end
class Website2
def grab_pictures
end
end
end
class ImporterJob
def perform(user, type, foreign_username)
pictures = Importer::type.grab_pictures(foreign_username)
pictures.each do |picture|
user.pictures.create picture
end
end
end
Мы боремся с решением, каково лучшее возвращение импортера.
Solution1:
Импортер возвращает массив строк с URL-адресами [ "http://..." , "http://..." , "http://..." ]. В этом массиве мы можем легко контактировать и передать несущую/скрепку на удаленные_нагрузки изображения. После этого мы запустим процессор для преобразования изображений, если нам нужно.
def get_picture_urls username
pictures = []
page = get_html(username)
page.scan(/\/p\/\d{4}-\d{2}\/#{username}\/[\w\d]{32}-thumb.jpg/).each do |path|
pictures << path
end
pictures.uniq.collect{|x| "http://www.somewebsite.com/#{x.gsub(/medium|thumb/, "big")}"}
end
это фактически возвращает массив [ "url_to_image" , "url_to_image" , "url_to_image" ]
Затем в Picture.after_create мы вызываем что-то, чтобы удалить водяной знак на этом изображении.
Solution2:
grab_pictures загружает каждое изображение в файл tempfile и преобразует его. он будет возвращать массив tempfiles [tempfile, tempfile, tempfile]
код для этого:
def read_pictures username
pictures = []
page = get_html(username)
page.scan(/\/p\/\d{4}-\d{2}\/#{username}\/[a-z0-9]{32}-thumb.jpg/).each do |path|
pictures << path
end
pictures.uniq.map { |pic_url| remove_logo(pic_url) }
end
def remove_logo pic_url
big = Magick::Image.from_blob(@agent.get(pic_url.gsub(/medium.jpg|thumb.jpg/, 'big.jpg')).body).first
# ... do some transformation and watermarking
file = Tempfile.new(['tempfile', '.jpg'])
result.write(file.path)
file
end
Это фактически возвращает массив из [Tempfile, Tempfile, Tempfile]
Резюме
Результат будет таким же для пользователя, но внутри мы обнаруживаем два разных способа обработки данных.
Мы хотим сохранить логику там, где она принадлежит, и работать как можно более общие.
Можете ли вы, ребята, помочь нам выбрать правильный путь? Longterm мы хотим иметь около 15 разных импортеров.