From 7b0c55e15a17a64280cb9921d0c6c2658fdd4c3e Mon Sep 17 00:00:00 2001 From: Matt-Yorkley <9029026+Matt-Yorkley@users.noreply.github.com> Date: Tue, 15 Oct 2019 20:22:57 +0100 Subject: [PATCH] Ensure producer properties are included in properties results --- .../controllers/products_controller.js.coffee | 2 +- .../api/order_cycles_controller.rb | 31 +++++++++++++------ .../api/order_cycles_controller_spec.rb | 19 +++++++++++- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee index 7d76d10a72..684109f7e4 100644 --- a/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee +++ b/app/assets/javascripts/darkswarm/controllers/products_controller.js.coffee @@ -57,7 +57,7 @@ Darkswarm.controller "ProductsCtrl", ($scope, $filter, $rootScope, Products, Ord page: page || $scope.page, per_page: $scope.per_page, 'q[name_or_meta_keywords_or_supplier_name_cont]': $scope.query, - 'q[properties_id_in_any][]': $scope.activeProperties, + 'q[properties_id_or_supplier_properties_id_in_any][]': $scope.activeProperties, 'q[primary_taxon_id_in_any][]': $scope.activeTaxons } diff --git a/app/controllers/api/order_cycles_controller.rb b/app/controllers/api/order_cycles_controller.rb index b29b7b9431..e0088d43f4 100644 --- a/app/controllers/api/order_cycles_controller.rb +++ b/app/controllers/api/order_cycles_controller.rb @@ -21,25 +21,38 @@ module Api def taxons taxons = Spree::Taxon. joins(:products). - where(spree_products: { id: distributed_products(distributor, order_cycle, customer) }). + where(spree_products: { id: distributed_products }). select('DISTINCT spree_taxons.*') render json: ActiveModel::ArraySerializer.new(taxons, each_serializer: Api::TaxonSerializer) end def properties - properties = Spree::Property. - joins(:products). - where(spree_products: { id: distributed_products(distributor, order_cycle, customer) }). - select('DISTINCT spree_properties.*') - render json: ActiveModel::ArraySerializer.new( - properties, each_serializer: Api::PropertySerializer + product_properties | producer_properties, each_serializer: Api::PropertySerializer ) end private + def product_properties + Spree::Property. + joins(:products). + where(spree_products: { id: distributed_products }). + select('DISTINCT spree_properties.*') + end + + def producer_properties + producers = Enterprise. + joins(:supplied_products). + where(spree_products: { id: distributed_products }) + + Spree::Property. + joins(:producer_properties). + where(producer_properties: { producer_id: producers }). + select('DISTINCT spree_properties.*') + end + def search_params permitted_search_params = params.slice :q, :page, :per_page @@ -52,7 +65,7 @@ module Api def permitted_ransack_params [:name_or_meta_keywords_or_supplier_name_cont, - :properties_id_in_any, + :properties_id_or_supplier_properties_id_in_any, :primary_taxon_id_in_any] end @@ -68,7 +81,7 @@ module Api @current_api_user.andand.customer_of(distributor) || nil end - def distributed_products(distributor, order_cycle, customer) + def distributed_products OrderCycleDistributedProducts.new(distributor, order_cycle, customer).products_relation end end diff --git a/spec/controllers/api/order_cycles_controller_spec.rb b/spec/controllers/api/order_cycles_controller_spec.rb index fd090200d3..1cf346277d 100644 --- a/spec/controllers/api/order_cycles_controller_spec.rb +++ b/spec/controllers/api/order_cycles_controller_spec.rb @@ -63,7 +63,7 @@ module Api context "with property filters" do it "filters by product property" do api_get :products, id: order_cycle.id, distributor: distributor.id, - q: { properties_id_in_any: [property1.id, property2.id] } + q: { properties_id_or_supplier_properties_id_in_any: [property1.id, property2.id] } expect(product_ids).to include product1.id, product2.id expect(product_ids).to_not include product3.id @@ -168,6 +168,23 @@ module Api expect(json_response.length).to be 2 expect(properties).to include property1.presentation, property2.presentation end + + context "with producer properties" do + let!(:property4) { create(:property) } + let!(:producer_property) { + create(:producer_property, producer_id: product1.supplier.id, property: property4) + } + + it "loads producer properties for distributed products in the order cycle" do + api_get :properties, id: order_cycle.id, distributor: distributor.id + + properties = json_response.map{ |property| property['name'] } + + expect(json_response.length).to be 3 + expect(properties).to include property1.presentation, property2.presentation, + producer_property.property.presentation + end + end end private