openfoodfoundation/openfoodnetwork

View on GitHub
app/controllers/api/v0/enterprises_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Api
  module V0
    class EnterprisesController < Api::V0::BaseController
      include GeocodeEnterpriseAddress

      before_action :override_owner, only: [:create, :update]
      before_action :check_type, only: :update
      before_action :override_sells, only: [:create, :update]
      before_action :override_visible, only: [:create, :update]
      respond_to :json

      def create
        authorize! :create, Enterprise

        # params[:user_ids] breaks the enterprise creation
        # We remove them from params and save them after creating the enterprise
        user_ids = enterprise_params.delete(:user_ids)
        @enterprise = Enterprise.new(enterprise_params)
        if @enterprise.save
          geocode_address_if_use_geocoder
          @enterprise.user_ids = user_ids
          render json: @enterprise.id, status: :created
        else
          invalid_resource!(@enterprise)
        end
      end

      def update
        @enterprise = Enterprise.find_by(permalink: params[:id]) || Enterprise.find(params[:id])
        authorize! :update, @enterprise

        if @enterprise.update(enterprise_params)
          geocode_address_if_use_geocoder
          render json: @enterprise.id, status: :ok
        else
          invalid_resource!(@enterprise)
        end
      end

      def update_image
        @enterprise = Enterprise.find_by(permalink: params[:id]) || Enterprise.find(params[:id])
        authorize! :update, @enterprise

        if params[:logo] && @enterprise.update( logo: params[:logo] )
          render(html: @enterprise.logo_url(:medium), status: :ok)
        elsif params[:promo] && @enterprise.update!( promo_image: params[:promo] )
          render(html: @enterprise.promo_image_url(:medium), status: :ok)
        else
          invalid_resource!(@enterprise)
        end
      end

      private

      def override_owner
        enterprise_params[:owner_id] = current_api_user.id
      end

      def check_type
        enterprise_params.delete :type unless current_api_user.admin?
      end

      def override_sells
        has_hub = current_api_user.owned_enterprises.is_hub.any?
        new_enterprise_is_producer = !!enterprise_params[:is_primary_producer]

        enterprise_params[:sells] = if has_hub && !new_enterprise_is_producer
                                      'any'
                                    else
                                      'unspecified'
                                    end
      end

      def override_visible
        enterprise_params[:visible] = "only_through_links"
      end

      def enterprise_params
        @enterprise_params ||= PermittedAttributes::Enterprise.new(params).call.
          to_h.with_indifferent_access
      end
    end
  end
end