diff --git a/app/assets/javascripts/admin/order_cycles/services/exchange_product.js.coffee b/app/assets/javascripts/admin/order_cycles/services/exchange_product.js.coffee index dfc8adeca5..056db9ee46 100644 --- a/app/assets/javascripts/admin/order_cycles/services/exchange_product.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/exchange_product.js.coffee @@ -11,5 +11,5 @@ angular.module('admin.orderCycles').factory('ExchangeProduct', ($resource) -> index: (params={}, callback=null) -> ExchangeProductResource.index params, (data) => @loaded = true - (callback || angular.noop)(data) + (callback || angular.noop)(data.products) }) diff --git a/app/controllers/api/exchange_products_controller.rb b/app/controllers/api/exchange_products_controller.rb index c87fb95c26..01070a6c9a 100644 --- a/app/controllers/api/exchange_products_controller.rb +++ b/app/controllers/api/exchange_products_controller.rb @@ -1,6 +1,9 @@ # This controller lists products that can be added to an exchange module Api class ExchangeProductsController < Api::BaseController + DEFAULT_PAGE = 1 + DEFAULT_PER_PAGE = 100 + skip_authorization_check only: [:index] # If exchange_id is present in the URL: @@ -17,20 +20,17 @@ module Api load_data_from_other_params end - render_products + render_paginated_products products end private - def render_products - products = ExchangeProductsRenderer. + def products + ExchangeProductsRenderer. new(@order_cycle, spree_current_user). - exchange_products(@incoming, @enterprise) - - render json: products, - each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, - order_cycle: @order_cycle, - status: :ok + exchange_products(@incoming, @enterprise). + page(params[:page] || DEFAULT_PAGE). + per(params[:per_page] || DEFAULT_PER_PAGE) end def load_data_from_exchange @@ -51,5 +51,27 @@ module Api end @incoming = params[:incoming] end + + def render_paginated_products(products) + serializer = ActiveModel::ArraySerializer.new( + products, + each_serializer: Api::Admin::ForOrderCycle::SuppliedProductSerializer, + order_cycle: @order_cycle + ) + + render text: { + products: serializer, + pagination: pagination_data(products) + }.to_json + end + + def pagination_data(results) + { + results: results.total_count, + pages: results.num_pages, + page: (params[:page] || DEFAULT_PAGE).to_i, + per_page: (params[:per_page] || DEFAULT_PER_PAGE).to_i + } + end end end diff --git a/spec/controllers/api/exchange_products_controller_spec.rb b/spec/controllers/api/exchange_products_controller_spec.rb index 93fcf670f4..86aa27dd73 100644 --- a/spec/controllers/api/exchange_products_controller_spec.rb +++ b/spec/controllers/api/exchange_products_controller_spec.rb @@ -17,7 +17,7 @@ module Api exchange = order_cycle.exchanges.incoming.first spree_get :index, exchange_id: exchange.id - expect(json_response.first["supplier_name"]).to eq exchange.variants.first.product.supplier.name + expect(json_response["products"].first["supplier_name"]).to eq exchange.variants.first.product.supplier.name end end @@ -27,8 +27,8 @@ module Api spree_get :index, exchange_id: exchange.id suppliers = [exchange.variants[0].product.supplier.name, exchange.variants[1].product.supplier.name] - expect(suppliers).to include json_response.first["supplier_name"] - expect(suppliers).to include json_response.second["supplier_name"] + expect(suppliers).to include json_response["products"].first["supplier_name"] + expect(suppliers).to include json_response["products"].second["supplier_name"] end end end