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

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, #touch_employee_last_seen

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?, #skip_layout_for_turbo_frame?, #stamp_impersonation_context, #tab_frame_breakout_request?, #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, #registration_lead_type, #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 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?

Instance Method Details

#copy_to_destinationvoid

This method returns an undefined value.

POST /amazon_a_plus_contents/:id/copy_to_destination — copies A+
content to another marketplace/locale via Edi::Amazon::Orchestrator.



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 130

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

#createvoid

This method returns an undefined value.

POST /catalog_items/:catalog_item_id/amazon_a_plus_contents — creates
an A+ content record.



51
52
53
54
55
56
57
58
59
60
61
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 51

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

#destroyvoid

This method returns an undefined value.

DELETE /amazon_a_plus_contents/:id — destroys an A+ content record.



79
80
81
82
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 79

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

#editvoid

This method returns an undefined value.

GET /amazon_a_plus_contents/:id/edit — edit form for an existing A+
content record.



42
43
44
45
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 42

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

#indexvoid

This method returns an undefined value.

GET /catalog_items/:catalog_item_id/amazon_a_plus_contents — a catalog
item's A+ content records.



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

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

#load_localesvoid

This method returns an undefined value.

GET /amazon_a_plus_contents/load_locales — available locales for a
marketplace, as JSON options for the locale picker.



180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 180

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

#newvoid

This method returns an undefined value.

GET /catalog_items/:catalog_item_id/amazon_a_plus_contents/new — blank
A+ content form.



32
33
34
35
36
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 32

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_contentvoid

This method returns an undefined value.

POST /catalog_items/:catalog_item_id/amazon_a_plus_contents/pull_content
— pulls A+ content from Amazon for every available locale via
Edi::Amazon::Orchestrator.



89
90
91
92
93
94
95
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
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 89

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

#showvoid

This method returns an undefined value.

GET /amazon_a_plus_contents/:id — a single A+ content record.



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

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

#updatevoid

This method returns an undefined value.

PATCH/PUT /amazon_a_plus_contents/:id — updates an A+ content record.



66
67
68
69
70
71
72
73
74
# File 'app/controllers/crm/amazon_a_plus_contents_controller.rb', line 66

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