mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
72 lines
1.8 KiB
Ruby
72 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ProductScopeQuery
|
|
def initialize(user, params)
|
|
@user = user
|
|
@params = params
|
|
end
|
|
|
|
def bulk_products
|
|
product_query = OpenFoodNetwork::Permissions.
|
|
new(@user).
|
|
editable_products.
|
|
merge(product_scope)
|
|
|
|
if @params[:import_date].present?
|
|
product_query = product_query.
|
|
imported_on(@params[:import_date]).
|
|
group_by_products_id
|
|
end
|
|
|
|
product_query.
|
|
ransack(query_params_with_defaults).
|
|
result(distinct: true)
|
|
end
|
|
|
|
def find_product
|
|
product_scope.find(@params[:id])
|
|
end
|
|
|
|
def find_product_to_be_cloned
|
|
product_scope.find(@params[:product_id])
|
|
end
|
|
|
|
def products_for_producers
|
|
producer_ids = OpenFoodNetwork::Permissions.new(@user).
|
|
variant_override_producers.by_name.select('enterprises.id')
|
|
|
|
# Use `order("enterprises.name")` instead of `by_producer scope`, the scope adds a join
|
|
# on variants which messes our query
|
|
Spree::Product.where(nil).
|
|
merge(product_scope).
|
|
includes(variants: [:product, :default_price, :stock_items, :supplier]).
|
|
where(variants: { supplier_id: producer_ids }).
|
|
order("enterprises.name, spree_products.name").
|
|
ransack(@params[:q]).result(distinct: true)
|
|
end
|
|
|
|
def product_scope
|
|
if @user.admin? || @user.enterprises.present?
|
|
scope = Spree::Product
|
|
if @params[:show_deleted]
|
|
scope = scope.with_deleted
|
|
end
|
|
else
|
|
scope = Spree::Product.active
|
|
end
|
|
|
|
scope.includes(product_query_includes)
|
|
end
|
|
|
|
def product_query_includes
|
|
[
|
|
image: { attachment_attachment: :blob },
|
|
variants: [:default_price, :stock_items, :variant_overrides]
|
|
]
|
|
end
|
|
|
|
def query_params_with_defaults
|
|
(@params[:q] || {}).reverse_merge(s: 'created_at desc')
|
|
end
|
|
end
|