2010-05-15 10:47:46 -07:00
|
|
|
class ItemsController < ApplicationController
|
2023-08-02 16:05:02 -07:00
|
|
|
before_action :set_query
|
2013-01-21 11:44:02 -08:00
|
|
|
rescue_from Item::Search::Error, :with => :search_error
|
2011-05-20 17:23:37 -07:00
|
|
|
|
2010-05-15 10:47:46 -07:00
|
|
|
def index
|
2014-02-26 21:55:14 -08:00
|
|
|
if @query
|
2010-05-15 10:47:46 -07:00
|
|
|
begin
|
2010-06-22 10:00:55 -07:00
|
|
|
if params[:per_page]
|
|
|
|
per_page = params[:per_page].to_i
|
|
|
|
per_page = 50 if per_page && per_page > 50
|
|
|
|
else
|
globalized search first draft
Confirmed features:
* Output (retrieval, sorting, etc.)
* Name (positive and negative, but new behavior)
* Flags (positive and negative)
Planned features:
* users:owns, user:wants
Known issues:
* Sets are broken
* Don't render properly
* Shouldn't actually be done as joined sets, anyway, since
we actually want (set1_zone1 OR set1_zone2) AND
(set2_zone1 OR set2_zone2), which will require breaking
it into multiple terms queries.
* Name has regressed: ignores phrases, doesn't require *all*
words. While we're breaking sets into multiple queries,
maybe we'll do something similar for name. In fact, we
really kinda have to if we're gonna keep sorting by name,
since "straw hat" returns all hats. Eww.
2013-01-18 21:23:37 -08:00
|
|
|
per_page = 30
|
2010-06-22 10:00:55 -07:00
|
|
|
end
|
2024-02-23 10:44:50 -08:00
|
|
|
|
2024-02-20 16:04:41 -08:00
|
|
|
@items = @query.results.paginate(
|
|
|
|
page: params[:page], per_page: per_page)
|
2011-07-12 22:21:48 -07:00
|
|
|
assign_closeted!
|
2024-02-23 10:44:50 -08:00
|
|
|
|
2010-06-22 10:00:55 -07:00
|
|
|
respond_to do |format|
|
use proxies for item html, too
Some lame benchmarking on my box, dev, cache classes, many items:
No proxies:
Fresh JSON: 175, 90, 90, 93, 82, 88, 158, 150, 85, 167 = 117.8
Cached JSON: (none)
Fresh HTML: 371, 327, 355, 328, 322, 346 = 341.5
Cached HTML: 173, 123, 175, 187, 171, 179 = 168
Proxies:
Fresh JSON: 175, 183, 269, 219, 195, 178 = 203.17
Cached JSON: 88, 70, 89, 162, 80, 77 = 94.3
Fresh HTML: 494, 381, 350, 334, 451, 372 = 397
Cached HTML: 176, 170, 104, 101, 111, 116 = 129.7
So, overhead is significant, but the gains when cached (and that should be
all the time, since we currently have 0 evictions) are definitely worth
it. Worth pushing, and probably putting some future effort into reducing
overhead.
On production (again, lame), items#index was consistently averaging
73-74ms when super healthy, and 82ms when pets#index was being louder
than usual. For reference is all. This will probably perform
significantly worse at first (in JSON, anyway, since HTML is already
mostly cached), so it might be worth briefly warming the cache after
pushing.
2013-06-26 23:39:04 -07:00
|
|
|
format.html {
|
2024-02-18 20:29:31 -08:00
|
|
|
@campaign = Fundraising::Campaign.current rescue nil
|
2023-07-22 18:13:11 -07:00
|
|
|
if @items.count == 1
|
2013-07-09 19:54:22 -07:00
|
|
|
redirect_to @items.first
|
|
|
|
else
|
|
|
|
render
|
|
|
|
end
|
use proxies for item html, too
Some lame benchmarking on my box, dev, cache classes, many items:
No proxies:
Fresh JSON: 175, 90, 90, 93, 82, 88, 158, 150, 85, 167 = 117.8
Cached JSON: (none)
Fresh HTML: 371, 327, 355, 328, 322, 346 = 341.5
Cached HTML: 173, 123, 175, 187, 171, 179 = 168
Proxies:
Fresh JSON: 175, 183, 269, 219, 195, 178 = 203.17
Cached JSON: 88, 70, 89, 162, 80, 77 = 94.3
Fresh HTML: 494, 381, 350, 334, 451, 372 = 397
Cached HTML: 176, 170, 104, 101, 111, 116 = 129.7
So, overhead is significant, but the gains when cached (and that should be
all the time, since we currently have 0 evictions) are definitely worth
it. Worth pushing, and probably putting some future effort into reducing
overhead.
On production (again, lame), items#index was consistently averaging
73-74ms when super healthy, and 82ms when pets#index was being louder
than usual. For reference is all. This will probably perform
significantly worse at first (in JSON, anyway, since HTML is already
mostly cached), so it might be worth briefly warming the cache after
pushing.
2013-06-26 23:39:04 -07:00
|
|
|
}
|
2013-06-26 23:01:12 -07:00
|
|
|
format.json {
|
2024-02-23 10:44:50 -08:00
|
|
|
render json: {
|
|
|
|
items: @items.as_json(
|
|
|
|
methods: [:nc?, :pb?, :owned?, :wanted?],
|
|
|
|
),
|
2024-02-25 12:06:20 -08:00
|
|
|
appearances: load_appearances.as_json(
|
|
|
|
include: {
|
|
|
|
swf_assets: {
|
|
|
|
only: [:id, :remote_id, :body_id],
|
|
|
|
include: {
|
|
|
|
zone: {
|
|
|
|
only: [:id, :depth, :label],
|
|
|
|
methods: [:is_commonly_used_by_items],
|
2024-02-25 14:46:27 -08:00
|
|
|
},
|
|
|
|
restricted_zones: {
|
|
|
|
only: [:id, :depth, :label],
|
|
|
|
methods: [:is_commonly_used_by_items],
|
|
|
|
},
|
2024-02-25 12:06:20 -08:00
|
|
|
},
|
|
|
|
methods: [:urls, :known_glitches],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
),
|
2024-02-23 10:44:50 -08:00
|
|
|
total_pages: @items.total_pages,
|
|
|
|
query: @query.to_s,
|
|
|
|
}
|
2013-06-26 23:01:12 -07:00
|
|
|
}
|
2010-06-22 10:00:55 -07:00
|
|
|
end
|
2010-05-15 10:47:46 -07:00
|
|
|
end
|
2010-10-10 19:18:42 -07:00
|
|
|
elsif params.has_key?(:ids) && params[:ids].is_a?(Array)
|
2023-08-02 11:41:19 -07:00
|
|
|
@items = Item.find(params[:ids])
|
2011-07-12 22:21:48 -07:00
|
|
|
assign_closeted!
|
2010-10-10 19:18:42 -07:00
|
|
|
respond_to do |format|
|
2013-06-26 23:01:12 -07:00
|
|
|
format.json { render json: @items }
|
2010-10-10 19:18:42 -07:00
|
|
|
end
|
2010-06-26 13:20:51 -07:00
|
|
|
else
|
|
|
|
respond_to do |format|
|
2011-08-04 07:01:44 -07:00
|
|
|
format.html {
|
2024-02-18 20:29:31 -08:00
|
|
|
@campaign = Fundraising::Campaign.current rescue nil
|
2024-02-20 16:04:41 -08:00
|
|
|
@newest_items = Item.newest.limit(18)
|
2011-08-04 07:01:44 -07:00
|
|
|
}
|
2010-06-26 13:20:51 -07:00
|
|
|
end
|
2010-05-15 10:47:46 -07:00
|
|
|
end
|
|
|
|
end
|
2011-05-20 17:23:37 -07:00
|
|
|
|
2010-05-15 17:46:41 -07:00
|
|
|
def show
|
|
|
|
@item = Item.find params[:id]
|
2011-07-30 21:19:28 -07:00
|
|
|
|
2011-08-02 17:01:48 -07:00
|
|
|
respond_to do |format|
|
|
|
|
format.html do
|
2024-01-21 04:49:06 -08:00
|
|
|
@trades = @item.closet_hangers.trading.user_is_active.to_trades
|
2024-01-19 01:39:25 -08:00
|
|
|
|
2024-01-21 00:39:20 -08:00
|
|
|
@contributors_with_counts = @item.contributors_with_counts
|
2011-08-02 17:01:48 -07:00
|
|
|
|
|
|
|
if user_signed_in?
|
2024-01-21 06:42:24 -08:00
|
|
|
@current_user_lists = current_user.closet_lists.alphabetical.
|
|
|
|
group_by_owned
|
|
|
|
@current_user_quantities = current_user.item_quantities_for(@item)
|
2011-08-02 17:01:48 -07:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
format.gif do
|
|
|
|
expires_in 1.month
|
|
|
|
redirect_to @item.thumbnail_url
|
2011-07-22 12:31:23 -07:00
|
|
|
end
|
2011-07-14 09:50:24 -07:00
|
|
|
end
|
2010-05-15 17:46:41 -07:00
|
|
|
end
|
2011-05-20 17:23:37 -07:00
|
|
|
|
2010-11-06 10:07:12 -07:00
|
|
|
def needed
|
|
|
|
if params[:color] && params[:species]
|
|
|
|
@pet_type = PetType.find_by_color_id_and_species_id(
|
|
|
|
params[:color],
|
|
|
|
params[:species]
|
|
|
|
)
|
|
|
|
end
|
2012-08-06 18:15:31 -07:00
|
|
|
|
2010-11-06 10:07:12 -07:00
|
|
|
unless @pet_type
|
|
|
|
raise ActiveRecord::RecordNotFound, 'Pet type not found'
|
|
|
|
end
|
2012-08-06 18:15:31 -07:00
|
|
|
|
2024-02-20 16:04:41 -08:00
|
|
|
@items = @pet_type.needed_items.order(:name)
|
2011-07-12 22:21:48 -07:00
|
|
|
assign_closeted!
|
2012-08-06 18:15:31 -07:00
|
|
|
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { @pet_name = params[:name] ; render :layout => 'application' }
|
|
|
|
format.json { render :json => @items }
|
|
|
|
end
|
2010-11-06 10:07:12 -07:00
|
|
|
end
|
2011-05-20 17:23:37 -07:00
|
|
|
|
2011-07-12 22:21:48 -07:00
|
|
|
protected
|
|
|
|
|
|
|
|
def assign_closeted!
|
|
|
|
current_user.assign_closeted_to_items!(@items) if user_signed_in?
|
|
|
|
end
|
2024-02-23 10:44:50 -08:00
|
|
|
|
|
|
|
def load_appearances
|
2024-02-25 14:46:27 -08:00
|
|
|
appearance_params = params[:with_appearances_for]
|
|
|
|
return {} if appearance_params.blank?
|
2024-02-27 14:32:54 -08:00
|
|
|
raise NotImplementedError if appearance_params[:alt_style_id].present?
|
2024-02-23 10:44:50 -08:00
|
|
|
|
2024-02-25 14:46:27 -08:00
|
|
|
pet_type = Item::Search::Query.load_pet_type_by_color_and_species(
|
|
|
|
appearance_params[:color_id], appearance_params[:species_id])
|
2024-02-25 12:06:20 -08:00
|
|
|
pet_type.appearances_for(@items.map(&:id), swf_asset_includes: [:zone])
|
2024-02-23 10:44:50 -08:00
|
|
|
end
|
2013-01-21 11:44:02 -08:00
|
|
|
|
|
|
|
def search_error(e)
|
|
|
|
@items = []
|
|
|
|
respond_to do |format|
|
|
|
|
format.html { flash.now[:alert] = e.message; render }
|
2013-06-26 23:01:12 -07:00
|
|
|
format.json { render :json => {error: e.message} }
|
2013-01-21 11:44:02 -08:00
|
|
|
end
|
|
|
|
end
|
2011-05-20 17:23:37 -07:00
|
|
|
|
2010-06-07 17:02:46 -07:00
|
|
|
def set_query
|
2014-02-26 21:55:14 -08:00
|
|
|
q = params[:q]
|
|
|
|
if q.is_a?(String)
|
2014-02-26 22:21:20 -08:00
|
|
|
begin
|
|
|
|
@query = Item::Search::Query.from_text(q, current_user)
|
|
|
|
rescue
|
|
|
|
# Set the query string for error handling messages, but let the error
|
|
|
|
# bubble up.
|
|
|
|
@query = params[:q]
|
|
|
|
raise
|
|
|
|
end
|
2024-02-23 10:44:50 -08:00
|
|
|
elsif q.is_a?(ActionController::Parameters)
|
2014-02-26 21:55:14 -08:00
|
|
|
@query = Item::Search::Query.from_params(q, current_user)
|
|
|
|
end
|
2010-06-07 17:02:46 -07:00
|
|
|
end
|
2010-05-15 10:47:46 -07:00
|
|
|
end
|