Bookmarks behave like favourites, except they aren't shared with other users and do not have an associated counter.closed-social-glitch-2
@ -0,0 +1,71 @@ | |||
# frozen_string_literal: true | |||
class Api::V1::BookmarksController < Api::BaseController | |||
before_action -> { doorkeeper_authorize! :read } | |||
before_action :require_user! | |||
after_action :insert_pagination_headers | |||
respond_to :json | |||
def index | |||
@statuses = load_statuses | |||
render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id) | |||
end | |||
private | |||
def load_statuses | |||
cached_bookmarks | |||
end | |||
def cached_bookmarks | |||
cache_collection( | |||
Status.reorder(nil).joins(:bookmarks).merge(results), | |||
Status | |||
) | |||
end | |||
def results | |||
@_results ||= account_bookmarks.paginate_by_max_id( | |||
limit_param(DEFAULT_STATUSES_LIMIT), | |||
params[:max_id], | |||
params[:since_id] | |||
) | |||
end | |||
def account_bookmarks | |||
current_account.bookmarks | |||
end | |||
def insert_pagination_headers | |||
set_pagination_headers(next_path, prev_path) | |||
end | |||
def next_path | |||
if records_continue? | |||
api_v1_bookmarks_url pagination_params(max_id: pagination_max_id) | |||
end | |||
end | |||
def prev_path | |||
unless results.empty? | |||
api_v1_bookmarks_url pagination_params(since_id: pagination_since_id) | |||
end | |||
end | |||
def pagination_max_id | |||
results.last.id | |||
end | |||
def pagination_since_id | |||
results.first.id | |||
end | |||
def records_continue? | |||
results.size == limit_param(DEFAULT_STATUSES_LIMIT) | |||
end | |||
def pagination_params(core_params) | |||
params.slice(:limit).permit(:limit).merge(core_params) | |||
end | |||
end |
@ -0,0 +1,39 @@ | |||
# frozen_string_literal: true | |||
class Api::V1::Statuses::BookmarksController < Api::BaseController | |||
include Authorization | |||
before_action -> { doorkeeper_authorize! :write } | |||
before_action :require_user! | |||
respond_to :json | |||
def create | |||
@status = bookmarked_status | |||
render json: @status, serializer: REST::StatusSerializer | |||
end | |||
def destroy | |||
@status = requested_status | |||
@bookmarks_map = { @status.id => false } | |||
bookmark = Bookmark.find_by!(account: current_user.account, status: @status) | |||
bookmark.destroy! | |||
render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_user&.account_id, bookmarks_map: @bookmarks_map) | |||
end | |||
private | |||
def bookmarked_status | |||
authorize_with current_user.account, requested_status, :show? | |||
bookmark = Bookmark.find_or_create_by!(account: current_user.account, status: requested_status) | |||
bookmark.status.reload | |||
end | |||
def requested_status | |||
Status.find(params[:status_id]) | |||
end | |||
end |
@ -0,0 +1,26 @@ | |||
# frozen_string_literal: true | |||
# == Schema Information | |||
# | |||
# Table name: bookmarks | |||
# | |||
# id :integer not null, primary key | |||
# created_at :datetime not null | |||
# updated_at :datetime not null | |||
# account_id :integer not null | |||
# status_id :integer not null | |||
# | |||
class Bookmark < ApplicationRecord | |||
include Paginable | |||
update_index('statuses#status', :status) if Chewy.enabled? | |||
belongs_to :account, inverse_of: :bookmarks | |||
belongs_to :status, inverse_of: :bookmarks | |||
validates :status_id, uniqueness: { scope: :account_id } | |||
before_validation do | |||
self.status = status.reblog if status&.reblog? | |||
end | |||
end |
@ -0,0 +1,14 @@ | |||
class CreateBookmarks < ActiveRecord::Migration[5.1] | |||
def change | |||
create_table :bookmarks do |t| | |||
t.references :account, null: false | |||
t.references :status, null: false | |||
t.timestamps | |||
end | |||
add_foreign_key :bookmarks, :accounts, column: :account_id, on_delete: :cascade | |||
add_foreign_key :bookmarks, :statuses, column: :status_id, on_delete: :cascade | |||
add_index :bookmarks, [:account_id, :status_id], unique: true | |||
end | |||
end |