Noosfero/noosfero

View on GitHub
plugins/fb_app/controllers/public/fb_app_plugin_page_tab_controller.rb

Summary

Maintainability
B
6 hrs
Test Coverage
class FbAppPluginPageTabController < FbAppPluginController
  no_design_blocks

  before_action :change_theme
  before_action :disable_cache

  include ProductsPlugin::CatalogHelper

  helper ProductsPlugin::ProductsHelper
  helper FbAppPlugin::DisplayHelper

  def index
    return unless load_page_tabs

    if params[:tabs_added]
      @page_tabs = FbAppPlugin::PageTab.create_from_tabs_added params[:tabs_added]
      @page_tab = @page_tabs.first
      redirect_to @page_tab.facebook_url
    elsif @signed_request || @page_id
      if @page_tab.present?
        if product_id = params[:product_id]
          @product = environment.products.find product_id
          @profile = @product.profile
          @inputs = @product.inputs
          @allowed_user = false
          load_catalog

          render action: "product"
        elsif @page_tab.config_type.in? [:profile, :own_profile]
          @profile = @page_tab.value

          load_catalog
          render action: "catalog" unless performed?
        else
          # fake profile for catalog controller
          @profile = environment.enterprise_default_template
          @profile.shopping_cart_settings.enabled = true

          base_query = @page_tab.value
          params[:base_query] = base_query
          params[:scope] = "all"

          load_catalog
          render action: "catalog" unless performed?
        end
      else
        render action: "first_load"
      end
    else
      # render template
      render action: "index"
    end
  end

  def search_autocomplete
    load_page_tabs
    load_search_autocomplete
    respond_to do |format|
      format.json { render "catalog/search_autocomplete" }
    end
  end

  def admin
    return redirect_to "/plugin/fb_app/myprofile_config" if params[:page_id].blank? && params[:signed_request].blank?
    return unless load_page_tabs

    if request.put? && @page_id.present?
      create_page_tabs if @page_tab.nil?

      @page_tab.update! params[:page_tab]

      respond_to do |format|
        format.js { render action: "admin" }
      end
    end
  end

  def destroy
    @page_tab = FbAppPlugin::PageTab.find params[:id]
    return render_access_denied unless user.present? && (user.is_admin?(environment) || user.is_admin?(@page_tab.profile))

    @page_tab.destroy
    render nothing: true
  end

  def uninstall
    render text: params.to_yaml
  end

  def enterprise_search
    scope = environment.enterprises.enabled.accessible_to(user)
    @query = params[:query]
    @profiles = scope.limit(10).order("name ASC")
                     .where(["name ILIKE ? OR name ILIKE ? OR identifier LIKE ?", "#{@query}%", "% #{@query}%", "#{@query}%"])
    render partial: "open_graph_plugin/myprofile/profile_search", locals: { profiles: @profiles }
  end

  # unfortunetely, this needs to be public
  def profile
    @profile
  end

  protected

    def default_url_options
      { profile: @profile.identifier } if @profile
    end

    def load_page_tabs
      @signed_requests = read_param params[:signed_request]
      if @signed_requests.present?
        @datas = []
        @page_ids = @signed_requests.map do |signed_request|
          @data = FbAppPlugin::Auth.parse_signed_request signed_request
          @datas << @data
          page_id = @data[:page][:id] rescue nil
          if page_id.blank?
            render_not_found
            return false
          end
          page_id
        end
      else
        @page_ids = read_param params[:page_id]
      end

      @page_tabs = FbAppPlugin::PageTab.where page_id: @page_ids

      @signed_request = @signed_requests.first
      @page_id = @page_ids.first
      @page_tab = @page_tabs.first
      @new_request = @page_tab.blank?

      true
    end

    def create_page_tabs
      @page_tabs = FbAppPlugin::PageTab.create_from_page_ids @page_ids
      @page_tab ||= @page_tabs.first
    end

    def change_theme
      # move to config
      unless theme_responsive?
        @current_theme = "ees"
        @theme_responsive = true
      end
      @without_pure_chat = true
    end

    def get_layout
      return nil if (request.format == :js) || request.xhr?

      return "application-responsive"
    end

    def disable_cache
      @disable_cache_theme_navigation = true
    end

    def load_catalog(options = {})
      @use_show_more = true
      catalog_load_index options
    end

    def read_param(param)
      if param.is_a? Hash
        param.values
      else
        Array(param).select { |p| p.present? }
      end
    end
end