1
0
Fork 0
forked from OpenNeo/impress

Add basic item JSON response (with trade values + counts)

This commit is contained in:
Emi Matchu 2026-01-04 13:55:33 -08:00
parent aa45ea17b3
commit 4e00f5d1af
3 changed files with 43 additions and 6 deletions

View file

@ -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?

View file

@ -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

View file

@ -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)