Bookmarks behave like favourites, except they aren't shared with other users and do not have an associated counter.master
parent
33c2bbdda7
commit
50eb8f1f61
@ -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 |
Loading…
Reference in new issue