From 7c71311eefa0429558925170a6c055413e4a1b20 Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 24 Feb 2020 22:28:08 -0600 Subject: [PATCH] Add /favorites.json endpoint. --- app/controllers/favorites_controller.rb | 5 ++++- app/models/favorite.rb | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/controllers/favorites_controller.rb b/app/controllers/favorites_controller.rb index 06f79f6e2..e5338baa3 100644 --- a/app/controllers/favorites_controller.rb +++ b/app/controllers/favorites_controller.rb @@ -5,7 +5,10 @@ class FavoritesController < ApplicationController rescue_with Favorite::Error, status: 422 def index - if params[:user_id].present? + if !request.format.html? + @favorites = Favorite.visible(CurrentUser.user).paginated_search(params) + respond_with(@favorites) + elsif params[:user_id].present? user = User.find(params[:user_id]) redirect_to posts_path(tags: "ordfav:#{user.name}", format: request.format.symbol) elsif CurrentUser.is_member? diff --git a/app/models/favorite.rb b/app/models/favorite.rb index 2f5c1622a..dd09740d4 100644 --- a/app/models/favorite.rb +++ b/app/models/favorite.rb @@ -3,7 +3,28 @@ class Favorite < ApplicationRecord belongs_to :post belongs_to :user + scope :for_user, ->(user_id) {where("user_id % 100 = #{user_id.to_i % 100} and user_id = #{user_id.to_i}")} + scope :public_favorites, -> { where(user: User.bit_prefs_match(:enable_private_favorites, false)) } + + def self.visible(user) + user.is_admin? ? all : for_user(user.id).or(public_favorites) + end + + def self.search(params) + q = super + q = q.search_attributes(params, :post) + + if params[:user_id].present? + q = q.for_user(params[:user_id]) + end + + q.order(post_id: :desc) + end + + def self.available_includes + [:post, :user] + end def self.add(post:, user:) Favorite.transaction do