Class: Crm::AmazonAPlusContentsController

Inherits:
CrmController show all
Defined in:
app/controllers/crm/amazon_a_plus_contents_controller.rb

Overview

Controller: amazon a plus contents.

Constant Summary

Constants included from Controllers::ReferenceFindable

Controllers::ReferenceFindable::ID_EMBEDDED_PATTERNS

Constants included from Controllers::AnalyticsEvents

Controllers::AnalyticsEvents::MAX_QUEUED_EVENTS, Controllers::AnalyticsEvents::SESSION_KEY

Constants included from Controllers::ErrorRendering

Controllers::ErrorRendering::NON_CONTENT_PATH_PREFIXES

Constants included from Www::SeoHelper

Www::SeoHelper::AWARDS, Www::SeoHelper::CA_ADDRESS, Www::SeoHelper::CA_BUSINESS_HOURS, Www::SeoHelper::CA_CONTACT_POINT, Www::SeoHelper::CA_CURRENCIES, Www::SeoHelper::CA_DESCRIPTION, Www::SeoHelper::CA_FOUNDING_DATE, Www::SeoHelper::CA_GLOBAL_LOCATION_NUMBER, Www::SeoHelper::CA_LEGAL_NAME, Www::SeoHelper::CA_LOCAL_BUSINESS, Www::SeoHelper::CA_ONLINE_STORE, Www::SeoHelper::CA_RETURN_POLICY, Www::SeoHelper::CA_SALES_DEPARTMENT, Www::SeoHelper::CA_SERVICE_AREA, Www::SeoHelper::CA_URL, Www::SeoHelper::CA_VAT_ID, Www::SeoHelper::CA_WAREHOUSE_DEPARTMENT, Www::SeoHelper::CA_WAREHOUSE_HOURS, Www::SeoHelper::COMPANY_EMAIL, Www::SeoHelper::COMPANY_LOGO, Www::SeoHelper::COMPANY_NAME, Www::SeoHelper::COMPANY_SLOGAN, Www::SeoHelper::EXPERTISE, Www::SeoHelper::FAX_NUMBER, Www::SeoHelper::GS1_COMPANY_PREFIX, Www::SeoHelper::ISO6523_CODE, Www::SeoHelper::PAYMENT_METHODS, Www::SeoHelper::PHONE_NUMBER, Www::SeoHelper::PRIMARY_NAICS, Www::SeoHelper::REFUND_TYPE, Www::SeoHelper::RETURN_FEES, Www::SeoHelper::RETURN_METHOD, Www::SeoHelper::RETURN_POLICY_CATEGORY, Www::SeoHelper::SECONDARY_NAICS, Www::SeoHelper::SOCIAL_PROFILES, Www::SeoHelper::US_ADDRESS, Www::SeoHelper::US_BUSINESS_HOURS, Www::SeoHelper::US_CONTACT_POINT, Www::SeoHelper::US_CURRENCIES, Www::SeoHelper::US_DESCRIPTION, Www::SeoHelper::US_FOUNDING_DATE, Www::SeoHelper::US_GLOBAL_LOCATION_NUMBER, Www::SeoHelper::US_IMAGE, Www::SeoHelper::US_LEGAL_NAME, Www::SeoHelper::US_LOCAL_BUSINESS, Www::SeoHelper::US_ONLINE_STORE, Www::SeoHelper::US_RETURN_POLICY, Www::SeoHelper::US_SALES_DEPARTMENT, Www::SeoHelper::US_SERVICE_AREA, Www::SeoHelper::US_TAX_ID, Www::SeoHelper::US_URL, Www::SeoHelper::US_WAREHOUSE_DEPARTMENT, Www::SeoHelper::US_WAREHOUSE_HOURS

Constants included from IconHelper

IconHelper::CUSTOM_ICON_MAP, IconHelper::CUSTOM_SVG_DIR, IconHelper::DEFAULT_FAMILY

Instance Method Summary collapse

Methods inherited from CrmController

#access_denied, #context_id, #context_object, #crm_home_path, #current_ability, #default_url_options, #download_temp, #get_tempfile_path_for_download, #init_status_job_collector, #initialize_crm_lazy_chunks, #persist_enqueued_status_jobs, #record_not_found, #redirect_to_job_or_fallback, #render_edit_action, #set_context, #set_download_path, #stash_file_for_temp_download, #sync_admin_presence_cookie

Methods inherited from ApplicationController

#account_impersonated?, #add_to_flash, #after_sign_in_path_for, #bypass_forgery_protection?, #chat_enabled?, #cloudflare_cleared?, #default_catalog, #default_url_options, #enable_turbo_frames, #find_publication, #fix_invalid_accept_header, #init_js_utils, #is_globals_call?, #layout_by_resource, #locale_store, #redirect_to, #require_employee_for_crm, #set_base_host, #set_real_ip, #set_report_errors_for, #should_render_layout?, #stamp_impersonation_context, #warmlyyours_canada_ip?, #warmlyyours_ip?, #y

Methods included from Controllers::ReturnPathHandling

#check_for_return_path, #redirect_to_return_path_or_default

Methods included from Controllers::AnalyticsEvents

#consume_queued_analytics_events, #track_event

Methods included from Controllers::DeviceDetection

#device_detector, #is_ie?

Methods included from Controllers::SubdomainDetection

#is_crm_request?, #is_www_request?, #json_request?

Methods included from Controllers::TurboSafeRedirect

#redirect_to

Methods included from Controllers::TrackingDetection

#bot_request?, #gdpr_country?, #gdpr_country_data, #prevent_bots, #set_tracking_cookie, #track_visitor?

Methods included from Controllers::AcceleratedFileSending

#send_file_accelerated, #send_upload_accelerated

Methods included from Controllers::ErrorRendering

#excp_string, #mail_to_for_error_reporting, #render_400, #render_404, #render_406, #render_410, #render_500, #render_invalid_authenticity_token, #render_ip_spoof_error, #render_unpermitted_parameters, #safe_referer_or_fallback

Methods included from Controllers::TurnstileVerification

#load_turnstile_script_tag, #turnstile_lazy_widget, #turnstile_script_tag, #turnstile_widget, #validate_turnstile!

Methods included from Controllers::CloudflareCaching

edge_cached, #edge_cached_action?, #reset_cloudflare_cache, #set_cloudflare_cache, #skip_edge_cache!, #skip_session

Methods included from Controllers::Webpackable

#preload_webpack_fonts, #webpack_css_include, #webpack_css_url, #webpack_js_include, #wpd_is_running?

Methods included from Controllers::Localizable

#cloudflare_country_locale, #determine_request_locale, #geocoder_locale, #guest_user_locale_check, #locale_optional_www_auth_path?, #param_locale, #set_locale, #set_request_locale, #skip_localization?, #warmlyyours_ip_locale

Methods included from Controllers::Authenticable

#access_denied, #authenticate_account, #authenticate_account!, #authenticate_account_from_login_token!, #check_is_a_manager, #check_is_a_sales_manager, #check_is_an_admin, #check_is_an_employee, #check_party, #clear_mismatched_guest_user, #create_guest_user, #credentials?, #current_or_guest_user, #current_or_guest_user_id_read_only, #current_user, #devise_mapping, #fully_logged_in?, #generate_bot_id, #guest_user, #identifiable?, #init_current_user, #initialize_guest, #load_context_user, #logging_in, #resource, #resource_name, #restrict_access_for_non_employees, #scrubbed_request_path, #user_object, #warn_on_session_guest_id_leak

Methods included from ApplicationHelper

#better_number_to_currency, #check_force_logout, #check_or_cross, #check_or_times, #embedded_tab_frame_id, #error_messages, #general_disclaimer_on_product_installation_and_local_codes, #gridjs_from_html_table, #gridjs_table, #is_wy_ip, #line_break, #parent_layout, #pass_or_fail, #render_error_messages_list, #render_video_card, #resolved_auth_form_turbo_frame, #return_path_or, #safe_css_color, #set_return_path_if_present, #set_section_if_present, #tab_frame_id, #to_underscore, #track_page?, #turbo_section_wrapper, #turbo_tabs_request?, #url_on_same_domain_as_request, #widget_index_daily_focus_index_path, #working_hours?, #yes_or_no, #yes_or_no_highlighted, #yes_or_no_with_check_or_cross, #youtube_video

Methods included from UppyUploaderHelper

#file_uploader, #image_uploader, #large_file_uploader_s3, #lead_sketch_uploader, #rma_image_uploader, #rma_image_uploader_s3, #uppy_uploader, #video_uploader

Methods included from Www::ImagesHelper

#image_asset_tag, #image_asset_url

Methods included from Www::SeoHelper

#add_page_schema, #add_webpage_schema, #canada?, #company_social_links, #ensure_context_json, #json_ld_script_tag, #local_business_schema, #online_store_id, #online_store_schema, #page_main_entity, #page_main_entity_json, #render_auto_collection_page_schema, #render_collection_page_schema, #render_local_business_schema, #render_online_store_schema, #render_page_schemas, #render_page_video_schemas, #render_webpage_schema, #render_webpage_schema_with_collections, #usa?

Methods included from UrlsHelper

#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?

Methods included from IconHelper

#account_nav_icon, #fa_icon, #star_rating_html

Instance Method Details

#copy_to_destinationObject



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 96

def copy_to_destination
  target_marketplace_id = params[:target_marketplace_id]
  target_locale = params[:target_locale]

  return redirect_to amazon_a_plus_content_path(@a_plus_content), alert: 'Target marketplace and locale are required.' unless target_marketplace_id.present? && target_locale.present?

  begin
    # Use EDI workflow to copy A+ content
    Rails.logger.info "Starting copy process for A+ content ID: #{@a_plus_content.id}"
    Rails.logger.info "Target marketplace: #{target_marketplace_id}, Target locale: #{target_locale}"

    orchestrator = Edi::Amazon::Orchestrator.new(:amazon_seller_central_us)

    processor = orchestrator.a_plus_content_processor
    result = processor.copy_content_to_destination(
      @a_plus_content,
      target_marketplace_id: target_marketplace_id,
      target_locale: target_locale
    )

    Rails.logger.info "Copy process result: #{result}"

    if result
      flash[:notice] = 'A+ content copy process initiated successfully.'
      redirect_to amazon_a_plus_content_path(@a_plus_content)
    else
      # Get detailed error messages from the processor
      error_messages = processor.error_messages
      if error_messages.any?
        detailed_error = error_messages.join("\n")
        session[:a_plus_content_error] = "Copy failed:\n#{detailed_error}"
      else
        session[:a_plus_content_error] = 'Failed to copy A+ content. Please check the logs for details.'
      end
      redirect_to amazon_a_plus_content_path(@a_plus_content)
    end
  rescue StandardError => e
    Rails.logger.error "Error in copy_to_destination: #{e.message}"
    Rails.logger.error e.backtrace.join("\n")

    # Store error in session to ensure it persists across redirect
    session[:a_plus_content_error] = "Copy failed: #{e.message}"
    redirect_to amazon_a_plus_content_path(@a_plus_content)
  end
end

#createObject



32
33
34
35
36
37
38
39
40
41
42
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 32

def create
  @a_plus_content = AmazonAPlusContent.new(a_plus_content_params)
  @a_plus_content.catalog_item = @catalog_item

  if @a_plus_content.save
    redirect_to amazon_a_plus_content_path(@a_plus_content), notice: 'A+ content was successfully created.'
  else
    @available_marketplaces = AmazonMarketplace.order(:name)
    render :new, status: :unprocessable_content
  end
end

#destroyObject



54
55
56
57
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 54

def destroy
  @a_plus_content.destroy
  redirect_to catalog_item_amazon_a_plus_contents_path(@catalog_item), notice: 'A+ content was successfully deleted.'
end

#editObject



27
28
29
30
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 27

def edit
  @available_marketplaces = AmazonMarketplace.order(:name)
  @available_locales = AmazonAPlusContent.available_locales_for_marketplace(@a_plus_content.marketplace_id)
end

#indexObject



10
11
12
13
14
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 10

def index
  @a_plus_contents = AmazonAPlusContent.where(catalog_item: @catalog_item)
                                       .includes(:amazon_marketplace)
                                       .order(:locale, :created_at)
end

#load_localesObject



142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 142

def load_locales
  marketplace_id = params[:marketplace_id]
  return render json: { error: 'Marketplace ID is required' }, status: :bad_request if marketplace_id.blank?

  locales = AmazonAPlusContent.available_locales_for_marketplace(marketplace_id)
  locale_options = locales.map do |locale|
    {
      value: locale,
      text: "#{AmazonAPlusContent.amazon_to_our_locale(locale)} (#{locale})"
    }
  end

  render json: { locales: locale_options }
end

#newObject



21
22
23
24
25
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 21

def new
  @catalog_item = CatalogItem.find(params[:catalog_item_id])
  @a_plus_content = AmazonAPlusContent.new(catalog_item: @catalog_item)
  @available_marketplaces = AmazonMarketplace.order(:name)
end

#pull_contentObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 59

def pull_content
  marketplace_id = @catalog_item.amazon_marketplace&.marketplace_identifier
  return redirect_to catalog_item_amazon_a_plus_contents_path(@catalog_item), alert: 'No marketplace found for this catalog item.' unless marketplace_id

  # Get available locales for this marketplace
  available_locales = AmazonAPlusContent.available_locales_for_marketplace(marketplace_id)

  pulled_count = 0
  available_locales.each do |locale|
    # Use EDI workflow to fetch and process A+ content
    orchestrator = Edi::Amazon::Orchestrator.new(:amazon_seller_central_us)

    # Retrieve A+ content data
    ecl = orchestrator.a_plus_content_retriever.process(
      asin: @catalog_item.amazon_asin,
      locale: locale,
      file_info: {
        asin: @catalog_item.amazon_asin,
        catalog_item_id: @catalog_item.id,
        locale: locale
      }
    )

    next unless ecl

    # Process the retrieved data
    pulled_count += 1 if orchestrator.a_plus_content_processor.process(ecl, catalog_item: @catalog_item, locale: locale)
  end

  if pulled_count > 0
    redirect_to catalog_item_amazon_a_plus_contents_path(@catalog_item),
    notice: "Successfully pulled A+ content for #{pulled_count} record(s)."
  else
    redirect_to catalog_item_amazon_a_plus_contents_path(@catalog_item), alert: 'No A+ content found for this ASIN.'
  end
end

#showObject



16
17
18
19
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 16

def show
  @available_marketplaces = AmazonMarketplace.order(:name)
  @available_locales = AmazonAPlusContent.available_locales_for_marketplace(@a_plus_content.marketplace_id)
end

#updateObject



44
45
46
47
48
49
50
51
52
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 44

def update
  if @a_plus_content.update(a_plus_content_params)
    redirect_to amazon_a_plus_content_path(@a_plus_content), notice: 'A+ content was successfully updated.'
  else
    @available_marketplaces = AmazonMarketplace.order(:name)
    @available_locales = AmazonAPlusContent.available_locales_for_marketplace(@a_plus_content.marketplace_id)
    render :edit, status: :unprocessable_content
  end
end