api/app/controllers/spree/api/v2/storefront/wishlists_controller.rb
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