From 195e228307317922ba9037c501b8672cd43e15d5 Mon Sep 17 00:00:00 2001 From: Michael Kohl Date: Wed, 2 Dec 2020 11:03:14 +0700 Subject: [PATCH] Move GeneratedImage to Images::GenerateSocialmage (#11691) --- app/helpers/social_image_helper.rb | 2 +- app/labor/generated_image.rb | 43 ---------------- app/services/images/generate_social_image.rb | 51 +++++++++++++++++++ app/view_objects/articles/social_image.rb | 2 +- spec/helpers/social_image_helper_spec.rb | 4 +- .../images/generate_social_image_spec.rb} | 10 ++-- 6 files changed, 60 insertions(+), 52 deletions(-) delete mode 100644 app/labor/generated_image.rb create mode 100644 app/services/images/generate_social_image.rb rename spec/{labor/generated_image_spec.rb => services/images/generate_social_image_spec.rb} (70%) diff --git a/app/helpers/social_image_helper.rb b/app/helpers/social_image_helper.rb index 9d5dec093..ed204e1a4 100644 --- a/app/helpers/social_image_helper.rb +++ b/app/helpers/social_image_helper.rb @@ -4,7 +4,7 @@ module SocialImageHelper SOCIAL_PREVIEW_MIGRATION_DATETIME = Time.zone.parse("2019-04-22T00:00:00Z") def user_social_image_url(user) - return GeneratedImage.new(user).social_image unless use_new_social_url?(user) + return Images::GenerateSocialImage.call(user) unless use_new_social_url?(user) if user.is_a?(Organization) organization_social_preview_url(user, format: :png) diff --git a/app/labor/generated_image.rb b/app/labor/generated_image.rb deleted file mode 100644 index cc8d2d0b4..000000000 --- a/app/labor/generated_image.rb +++ /dev/null @@ -1,43 +0,0 @@ -class GeneratedImage - attr_reader :resource - - def initialize(resource) - @resource = resource - end - - def social_image - if resource.class.name.include?("Article") - article_image - elsif resource.instance_of?(User) - optimize_image "/user/#{resource.id}?bust=#{resource.profile_image_url}" - elsif resource.instance_of?(Organization) - optimize_image "/organization/#{resource.id}?bust=#{resource.profile_image_url}" - elsif resource.class.name.include?("Tag") - optimize_image "/tag/#{@resource.id}?bust=#{@resource.pretty_name}" - end - end - - def article_image - return resource.social_image if resource.social_image.present? - return resource.main_image if resource.main_image.present? - return resource.video_thumbnail_url if resource.video_thumbnail_url.present? - - path = "/article/#{resource.id}?bust=#{resource.comments_count}-#{resource.title}-#{resource.published}" - optimize_image(path) - end - - def optimize_image(path) - options = { - height: 400, - width: 800, - gravity: "north", - crop: "fill", - type: "url2png", - flags: nil, - quality: nil, - fetch_format: nil - } - - Images::Optimizer.call("https://dev.to/social_previews#{path}", options) - end -end diff --git a/app/services/images/generate_social_image.rb b/app/services/images/generate_social_image.rb new file mode 100644 index 000000000..fec55758a --- /dev/null +++ b/app/services/images/generate_social_image.rb @@ -0,0 +1,51 @@ +module Images + class GenerateSocialImage + def self.call(resource) + new(resource).call + end + + def initialize(resource) + @resource = resource + end + + def call + if resource.class.name.include?("Article") + article_image + elsif resource.instance_of?(User) + optimize_image "/user/#{resource.id}?bust=#{resource.profile_image_url}" + elsif resource.instance_of?(Organization) + optimize_image "/organization/#{resource.id}?bust=#{resource.profile_image_url}" + elsif resource.class.name.include?("Tag") + optimize_image "/tag/#{@resource.id}?bust=#{@resource.pretty_name}" + end + end + + private + + attr_reader :resource + + def article_image + return resource.social_image if resource.social_image.present? + return resource.main_image if resource.main_image.present? + return resource.video_thumbnail_url if resource.video_thumbnail_url.present? + + path = "/article/#{resource.id}?bust=#{resource.comments_count}-#{resource.title}-#{resource.published}" + optimize_image(path) + end + + def optimize_image(path) + options = { + height: 400, + width: 800, + gravity: "north", + crop: "fill", + type: "url2png", + flags: nil, + quality: nil, + fetch_format: nil + } + + Images::Optimizer.call("https://dev.to/social_previews#{path}", options) + end + end +end diff --git a/app/view_objects/articles/social_image.rb b/app/view_objects/articles/social_image.rb index 2421c5b32..e26f2876f 100644 --- a/app/view_objects/articles/social_image.rb +++ b/app/view_objects/articles/social_image.rb @@ -29,7 +29,7 @@ module Articles cache_key = "article-social-img-#{article}-#{article.updated_at.rfc3339}-#{article.comments_count}" Rails.cache.fetch(cache_key, expires_in: 1.hour) do - src = GeneratedImage.new(article).social_image + src = Images::GenerateSocialImage.call(article) return src if src.start_with? "https://res.cloudinary.com/" Images::Optimizer.call(src, width: "1000", height: "500", crop: "imagga_scale") diff --git a/spec/helpers/social_image_helper_spec.rb b/spec/helpers/social_image_helper_spec.rb index be9d21a6b..4f823b1dd 100644 --- a/spec/helpers/social_image_helper_spec.rb +++ b/spec/helpers/social_image_helper_spec.rb @@ -24,7 +24,7 @@ describe SocialImageHelper do url = helper.user_social_image_url(user) - expect(url).to eq GeneratedImage.new(user).social_image + expect(url).to eq Images::GenerateSocialImage.call(user) end it "returns social preview path for newer decorated users" do @@ -56,7 +56,7 @@ describe SocialImageHelper do url = helper.article_social_image_url(article) - expect(url).to eq GeneratedImage.new(article).social_image + expect(url).to eq Images::GenerateSocialImage.call(article) end it "returns social preview path for newer decorated articles" do diff --git a/spec/labor/generated_image_spec.rb b/spec/services/images/generate_social_image_spec.rb similarity index 70% rename from spec/labor/generated_image_spec.rb rename to spec/services/images/generate_social_image_spec.rb index 2fb8aa87e..449d895e7 100644 --- a/spec/labor/generated_image_spec.rb +++ b/spec/services/images/generate_social_image_spec.rb @@ -1,25 +1,25 @@ require "rails_helper" -RSpec.describe GeneratedImage, type: :labor do +RSpec.describe Images::GenerateSocialImage, type: :labor do let(:user) { create(:user) } let(:article) { create(:article, user_id: user.id) } it "returns the social image url if there is a social image" do article.social_image = Faker::Avatar.image - expect(described_class.new(article).social_image).to eq(article.social_image) + expect(described_class.call(article)).to eq(article.social_image) end it "returns the main image if there is a main image" do article.main_image = Faker::Avatar.image article.social_image = nil - expect(described_class.new(article).social_image).to eq(article.main_image) + expect(described_class.call(article)).to eq(article.main_image) end it "returns article social image" do article.main_image = nil article.social_image = nil article.cached_tag_list = "discuss, hello, goodbye" - expect(described_class.new(article).social_image).to include( + expect(described_class.call(article)).to include( "article/#{article.id}", "image/url2png", "c_fill,g_north,h_400,w_800/", @@ -29,7 +29,7 @@ RSpec.describe GeneratedImage, type: :labor do it "creates various generated images of different title lengths" do [25, 49, 79, 99, 105].each do |n| article.assign_attributes(title: "0" * n, main_image: nil, cached_tag_list: "discuss, hello") - expect(described_class.new(article).social_image.include?(article.title)).to eq(true) + expect(described_class.call(article).include?(article.title)).to eq(true) end end end