diff --git a/app/controllers/item_trades_controller.rb b/app/controllers/item_trades_controller.rb index 8a31cda4..75ba7172 100644 --- a/app/controllers/item_trades_controller.rb +++ b/app/controllers/item_trades_controller.rb @@ -3,9 +3,12 @@ class ItemTradesController < ApplicationController @item = Item.find params[:item_id] @type = type_from_params - @item_trades = @item.closet_hangers.trading.includes(:user, :list). - user_is_active.order('users.last_trade_activity_at DESC'). - to_trades(current_user, request.remote_ip) + @item_trades = @item.visible_trades( + scope: ClosetHanger.includes(:user, :list). + order('users.last_trade_activity_at DESC'), + user: current_user, + remote_ip: request.remote_ip + ) @trades = @item_trades[@type] if user_signed_in? diff --git a/app/controllers/items_controller.rb b/app/controllers/items_controller.rb index 18fbb19e..54a82672 100644 --- a/app/controllers/items_controller.rb +++ b/app/controllers/items_controller.rb @@ -80,8 +80,10 @@ class ItemsController < ApplicationController respond_to do |format| format.html do - @trades = @item.closet_hangers.trading.user_is_active. - to_trades(current_user, request.remote_ip) + @trades = @item.visible_trades( + user: current_user, + remote_ip: request.remote_ip + ) @contributors_with_counts = @item.contributors_with_counts @@ -107,6 +109,15 @@ class ItemsController < ApplicationController includes(:species).merge(Species.alphabetical) end + format.json do + render json: @item.as_json( + include_trade_counts: true, + include_nc_trade_value: true, + current_user: current_user, + remote_ip: request.remote_ip + ) + end + format.gif do expires_in 1.month redirect_to @item.thumbnail_url, allow_other_host: true diff --git a/app/models/item.rb b/app/models/item.rb index fef2ece7..45516ba6 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -444,11 +444,34 @@ class Item < ApplicationRecord created_at || Time.new(2010) end + # Returns the visible trades for this item, filtered by user visibility. + # Accepts an optional scope to add additional query constraints (e.g., includes, order). + def visible_trades(scope: nil, user: nil, remote_ip: nil) + base = closet_hangers.trading.user_is_active + base = base.merge(scope) if scope + base.to_trades(user, remote_ip) + end + def as_json(options={}) - super({ + result = super({ only: [:id, :name, :description, :thumbnail_url, :rarity_index], methods: [:zones_restrict], }.merge(options)) + + if options[:include_trade_counts] + trades = visible_trades( + user: options[:current_user], + remote_ip: options[:remote_ip] + ) + result['num_trades_offering'] = trades[:offering].size + result['num_trades_seeking'] = trades[:seeking].size + end + + if options[:include_nc_trade_value] + result['nc_trade_value'] = nc_trade_value + end + + result end def compatible_body_ids(use_cached: true)