api/app/controllers/spree/api/v2/storefront/wishlists_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Spree
  module Api
    module V2
      module Storefront
        class WishlistsController < ::Spree::Api::V2::ResourceController
          before_action :require_spree_current_user, except: [:show]
          before_action :ensure_valid_quantity, only: [:add_item, :set_item_quantity]

          def show
            spree_authorize! :show, resource
            super
          end

          def create
            spree_authorize! :create, Spree::Wishlist

            @wishlist = spree_current_user.wishlists.new(wishlist_attributes)

            ensure_current_store(@wishlist)

            @wishlist.save

            if @wishlist.persisted?
              render_serialized_payload(201) { serialize_resource(@wishlist) }
            else
              render_error_payload(@wishlist.errors.full_messages.to_sentence)
            end
          end

          def update
            authorize! :update, resource

            resource.update wishlist_attributes

            if resource.errors.empty?
              render_serialized_payload { serialize_resource(resource) }
            else
              render_error_payload(resource.errors.full_messages.to_sentence)
            end
          end

          def destroy
            authorize! :destroy, resource

            if resource.destroy
              head 204
            else
              render_error_payload(I18n.t('spree.api.v2.wishlist.errors.the_wishlist_could_not_be_destroyed'))
            end
          end

          def default
            spree_authorize! :create, Spree::Wishlist

            @default_wishlist = spree_current_user.default_wishlist_for_store(current_store)

            render_serialized_payload { serialize_resource(@default_wishlist) }
          end

          def add_item
            spree_authorize! :create, Spree::WishedItem

            if resource.wished_items.present? && resource.wished_items.detect { |wv| wv.variant_id.to_s == params[:variant_id].to_s }.present?
              @wished_item = resource.wished_items.detect { |wi| wi.variant_id.to_s == params[:variant_id].to_s }
              @wished_item.quantity = params[:quantity]
            else
              @wished_item = Spree::WishedItem.new(params.permit(:quantity, :variant_id))
              @wished_item.wishlist = resource
              @wished_item.save
            end

            resource.reload

            if @wished_item.persisted?
              render_serialized_payload { serialize_wished_item(@wished_item) }
            else
              render_error_payload(resource.errors.full_messages.to_sentence)
            end
          end

          def set_item_quantity
            spree_authorize! :update, wished_item

            wished_item.update(params.permit(:quantity))

            if wished_item.errors.empty?
              render_serialized_payload { serialize_wished_item(wished_item) }
            else
              render_error_payload(resource.errors.full_messages.to_sentence)
            end
          end

          def remove_item
            spree_authorize! :destroy, wished_item

            if wished_item.destroy
              render_serialized_payload { serialize_wished_item(wished_item) }
            else
              render_error_payload(resource.errors.full_messages.to_sentence)
            end
          end

          private

          def scope(skip_cancancan: true)
            if action_name == 'show'
              super
            else
              super.where(user: spree_current_user)
            end
          end

          def resource
            @resource ||= scope.find_by(token: params[:id])
          end

          def model_class
            Spree::Wishlist
          end

          def resource_serializer
            ::Spree::V2::Storefront::WishlistSerializer
          end

          def collection_serializer
            resource_serializer
          end

          def wishlist_attributes
            params.require(:wishlist).permit(permitted_wishlist_attributes)
          end

          def wished_item_attributes
            params.permit(permitted_wished_item_attributes)
          end

          def wished_item
            @wished_item ||= resource.wished_items.find(params[:item_id])
          end

          def serialize_wished_item(wished_item)
            ::Spree::V2::Storefront::WishedItemSerializer.new(
              wished_item,
              params: serializer_params,
              include: resource_includes,
              fields: sparse_fields
            ).serializable_hash
          end

          def serializer_params
            super.merge(is_variant_included: params[:is_variant_included])
          end

          def render_error_item_quantity
            render json: { error: I18n.t('spree.api.v2.wishlist.wrong_quantity') }, status: 422
          end

          def ensure_valid_quantity
            return render_error_item_quantity if params[:quantity].present? && params[:quantity].to_i <= 0

            params[:quantity] = if params[:quantity].present?
                                  params[:quantity].to_i
                                else
                                  1
                                end
          end
        end
      end
    end
  end
end