app/controllers/open_conference_ware/user_favorites_controller.rb
module OpenConferenceWare
class UserFavoritesController < ApplicationController
# Don't assign @event for "modify" action, it doesn't need it and will be slowed by it.
skip_before_filter :assign_events, only: :modify
skip_before_filter :assign_current_event_without_redirecting, only: :modify
before_filter :assert_user
before_filter :authentication_required, only: :modify
before_filter :assert_record_ownership, only: :modify
# GET /favorites
# GET /favorites.xml
# GET /favorites.json
def index
@user_favorites = Defer {
view_cache_key = "favorites,user_#{@user.id}.#{request.format},join_#{params[:join]}"
Rails.cache.fetch(view_cache_key) {
# The :join argument is sent by the AJAX UI to fetch a terse list of
# proposal_ids so it can display stars next to favorited proposals.
if params[:join] == "1"
UserFavorite.proposal_ids_for(@user)
else
@user.favorites.populated
end
}
}
respond_to do |format|
format.html # index.html.erb
format.xml { render xml: Undefer(@user_favorites) }
format.json { render json: Undefer(@user_favorites) }
format.ics {
return redirect_to user_favorites_path(@user) unless schedule_visible?
render text: Proposal.to_icalendar(
@user_favorites.scheduled,
title: "#{@user.label.possessiveize} favorites",
url_helper: lambda {|item| session_url(item)})
}
end
end
# PUT /favorites/1.xml
# PUT /favorites/1.json
def modify
unless params[:proposal_id].blank? || params[:mode].blank? || !['add','remove'].include?(params[:mode])
@user_favorite = \
case params[:mode]
when 'add'
UserFavorite.add(@user.id, params[:proposal_id])
when 'remove'
UserFavorite.remove(@user.id, params[:proposal_id])
end
respond_to do |format|
format.xml { head :ok }
format.json { render json: @user_favorite }
end
else
errors = {error: 'Malformed request.'}
respond_to do |format|
format.xml { render xml: errors, status: :unprocessable_entity }
format.json { render json: errors, status: :unprocessable_entity }
end
end
end
end
end