80e02b90e4
Filters out hidden stream entries from Atom feed Blocks now generate hidden stream entries, can be used to federate blocks Private statuses cannot be reblogged (generates generic 422 error for now) POST /api/v1/statuses now takes visibility=(public|unlisted|private) param instead of unlisted boolean Statuses JSON now contains visibility=(public|unlisted|private) field
113 lines
3.9 KiB
Ruby
113 lines
3.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Api::V1::AccountsController < ApiController
|
|
before_action -> { doorkeeper_authorize! :read }, except: [:follow, :unfollow, :block, :unblock]
|
|
before_action -> { doorkeeper_authorize! :follow }, only: [:follow, :unfollow, :block, :unblock]
|
|
before_action :require_user!, except: [:show, :following, :followers, :statuses]
|
|
before_action :set_account, except: [:verify_credentials, :suggestions, :search]
|
|
|
|
respond_to :json
|
|
|
|
def show; end
|
|
|
|
def verify_credentials
|
|
@account = current_user.account
|
|
render action: :show
|
|
end
|
|
|
|
def following
|
|
results = Follow.where(account: @account).paginate_by_max_id(DEFAULT_ACCOUNTS_LIMIT, params[:max_id], params[:since_id])
|
|
accounts = Account.where(id: results.map(&:target_account_id)).map { |a| [a.id, a] }.to_h
|
|
@accounts = results.map { |f| accounts[f.target_account_id] }
|
|
|
|
set_account_counters_maps(@accounts)
|
|
|
|
next_path = following_api_v1_account_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT
|
|
prev_path = following_api_v1_account_url(since_id: results.first.id) unless results.empty?
|
|
|
|
set_pagination_headers(next_path, prev_path)
|
|
|
|
render action: :index
|
|
end
|
|
|
|
def followers
|
|
results = Follow.where(target_account: @account).paginate_by_max_id(DEFAULT_ACCOUNTS_LIMIT, params[:max_id], params[:since_id])
|
|
accounts = Account.where(id: results.map(&:account_id)).map { |a| [a.id, a] }.to_h
|
|
@accounts = results.map { |f| accounts[f.account_id] }
|
|
|
|
set_account_counters_maps(@accounts)
|
|
|
|
next_path = followers_api_v1_account_url(max_id: results.last.id) if results.size == DEFAULT_ACCOUNTS_LIMIT
|
|
prev_path = followers_api_v1_account_url(since_id: results.first.id) unless results.empty?
|
|
|
|
set_pagination_headers(next_path, prev_path)
|
|
|
|
render action: :index
|
|
end
|
|
|
|
def statuses
|
|
@statuses = @account.statuses.permitted_for(@account, current_account).paginate_by_max_id(DEFAULT_STATUSES_LIMIT, params[:max_id], params[:since_id])
|
|
@statuses = cache_collection(@statuses, Status)
|
|
|
|
set_maps(@statuses)
|
|
set_counters_maps(@statuses)
|
|
|
|
next_path = statuses_api_v1_account_url(max_id: @statuses.last.id) if @statuses.size == DEFAULT_STATUSES_LIMIT
|
|
prev_path = statuses_api_v1_account_url(since_id: @statuses.first.id) unless @statuses.empty?
|
|
|
|
set_pagination_headers(next_path, prev_path)
|
|
end
|
|
|
|
def follow
|
|
FollowService.new.call(current_user.account, @account.acct)
|
|
set_relationship
|
|
render action: :relationship
|
|
end
|
|
|
|
def block
|
|
BlockService.new.call(current_user.account, @account)
|
|
set_relationship
|
|
render action: :relationship
|
|
end
|
|
|
|
def unfollow
|
|
UnfollowService.new.call(current_user.account, @account)
|
|
set_relationship
|
|
render action: :relationship
|
|
end
|
|
|
|
def unblock
|
|
UnblockService.new.call(current_user.account, @account)
|
|
set_relationship
|
|
render action: :relationship
|
|
end
|
|
|
|
def relationships
|
|
ids = params[:id].is_a?(Enumerable) ? params[:id].map(&:to_i) : [params[:id].to_i]
|
|
@accounts = Account.where(id: ids).select('id')
|
|
@following = Account.following_map(ids, current_user.account_id)
|
|
@followed_by = Account.followed_by_map(ids, current_user.account_id)
|
|
@blocking = Account.blocking_map(ids, current_user.account_id)
|
|
end
|
|
|
|
def search
|
|
limit = params[:limit] ? [DEFAULT_ACCOUNTS_LIMIT, params[:limit].to_i].min : DEFAULT_ACCOUNTS_LIMIT
|
|
@accounts = SearchService.new.call(params[:q], limit, params[:resolve] == 'true')
|
|
|
|
set_account_counters_maps(@accounts)
|
|
|
|
render action: :index
|
|
end
|
|
|
|
private
|
|
|
|
def set_account
|
|
@account = Account.find(params[:id])
|
|
end
|
|
|
|
def set_relationship
|
|
@following = Account.following_map([@account.id], current_user.account_id)
|
|
@followed_by = Account.followed_by_map([@account.id], current_user.account_id)
|
|
@blocking = Account.blocking_map([@account.id], current_user.account_id)
|
|
end
|
|
end
|