Sha256: 1e354a162968663c92b1499c7e0aabbe84b87b7893082028e4e2f11b68dd4225

Contents?: true

Size: 1.56 KB

Versions: 25

Compression:

Stored size: 1.56 KB

Contents

# frozen_string_literal: true

module Maglev
  # Clone a page in all the locales.
  # The service also makes sure that
  # the path of the cloned page will be unique.
  class ClonePage
    include Injectable

    argument :page

    def call
      return nil unless page.persisted?

      create_page!
    end

    protected

    def create_page!
      Maglev::Page.new(cloned_attributes).tap do |cloned_page|
        cloned_page.disable_spawn_redirection
        clone_paths(cloned_page)
        cloned_page.save!
      end
    end

    private

    def cloned_attributes
      {
        title_translations: clone_title,
        seo_title_translations: page.seo_title_translations,
        meta_description_translations: page.meta_description_translations,
        og_title_translations: page.og_title_translations,
        og_description_translations: page.og_description_translations,
        og_image_url_translations: page.og_image_url_translations,
        sections_translations: page.sections_translations
      }
    end

    def clone_title
      page.title_translations.transform_values do |title|
        ::I18n.t('activerecord.attributes.maglev/page.cloned_title', title: title)
      end
    end

    def clone_paths(cloned_page)
      code = generate_clone_code(4)
      page.path_hash.each do |locale, path|
        Maglev::I18n.with_locale(locale) do
          cloned_page.path = "#{path}-#{code}"
        end
      end
    end

    def generate_clone_code(number)
      charset = Array('A'..'Z') + Array('a'..'z')
      Array.new(number) { charset.sample }.join
    end
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
maglevcms-1.8.0 app/services/maglev/clone_page.rb
maglevcms-1.7.3 app/services/maglev/clone_page.rb
maglevcms-1.7.2 app/services/maglev/clone_page.rb
maglevcms-1.7.1 app/services/maglev/clone_page.rb
maglevcms-1.7.0 app/services/maglev/clone_page.rb
maglevcms-1.6.1 app/services/maglev/clone_page.rb
maglevcms-1.6.0 app/services/maglev/clone_page.rb
maglevcms-1.5.1 app/services/maglev/clone_page.rb
maglevcms-1.4.0 app/services/maglev/clone_page.rb
maglevcms-1.3.0 app/services/maglev/clone_page.rb
maglevcms-1.2.2 app/services/maglev/clone_page.rb
maglevcms-1.2.1 app/services/maglev/clone_page.rb
maglevcms-1.2.0 app/services/maglev/clone_page.rb
maglevcms-1.1.7 app/services/maglev/clone_page.rb
maglevcms-1.1.6 app/services/maglev/clone_page.rb
maglevcms-1.1.5 app/services/maglev/clone_page.rb
maglevcms-1.1.4 app/services/maglev/clone_page.rb
maglevcms-1.1.3 app/services/maglev/clone_page.rb
maglevcms-1.1.2 app/services/maglev/clone_page.rb
maglevcms-1.1.1 app/services/maglev/clone_page.rb