mirror of
https://github.com/mastodon/mastodon.git
synced 2024-12-22 18:45:41 +01:00
Refactor JSON templates to be generated with ActiveModelSerializers instead of Rabl (#4090)
This commit is contained in:
parent
2d6128672f
commit
8b2cad5637
80 changed files with 425 additions and 301 deletions
1
Gemfile
1
Gemfile
|
@ -18,6 +18,7 @@ gem 'aws-sdk', '~> 2.9'
|
||||||
gem 'paperclip', '~> 5.1'
|
gem 'paperclip', '~> 5.1'
|
||||||
gem 'paperclip-av-transcoder', '~> 0.6'
|
gem 'paperclip-av-transcoder', '~> 0.6'
|
||||||
|
|
||||||
|
gem 'active_model_serializers', '~> 0.10'
|
||||||
gem 'addressable', '~> 2.5'
|
gem 'addressable', '~> 2.5'
|
||||||
gem 'bootsnap'
|
gem 'bootsnap'
|
||||||
gem 'browser'
|
gem 'browser'
|
||||||
|
|
|
@ -24,6 +24,11 @@ GEM
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
||||||
|
active_model_serializers (0.10.6)
|
||||||
|
actionpack (>= 4.1, < 6)
|
||||||
|
activemodel (>= 4.1, < 6)
|
||||||
|
case_transform (>= 0.2)
|
||||||
|
jsonapi-renderer (>= 0.1.1.beta1, < 0.2)
|
||||||
active_record_query_trace (1.5.4)
|
active_record_query_trace (1.5.4)
|
||||||
activejob (5.1.2)
|
activejob (5.1.2)
|
||||||
activesupport (= 5.1.2)
|
activesupport (= 5.1.2)
|
||||||
|
@ -101,6 +106,8 @@ GEM
|
||||||
rack (>= 1.0.0)
|
rack (>= 1.0.0)
|
||||||
rack-test (>= 0.5.4)
|
rack-test (>= 0.5.4)
|
||||||
xpath (~> 2.0)
|
xpath (~> 2.0)
|
||||||
|
case_transform (0.2)
|
||||||
|
activesupport
|
||||||
chunky_png (1.3.8)
|
chunky_png (1.3.8)
|
||||||
cld3 (3.1.3)
|
cld3 (3.1.3)
|
||||||
ffi (>= 1.1.0, < 1.10.0)
|
ffi (>= 1.1.0, < 1.10.0)
|
||||||
|
@ -200,6 +207,7 @@ GEM
|
||||||
terminal-table (>= 1.5.1)
|
terminal-table (>= 1.5.1)
|
||||||
jmespath (1.3.1)
|
jmespath (1.3.1)
|
||||||
json (2.1.0)
|
json (2.1.0)
|
||||||
|
jsonapi-renderer (0.1.2)
|
||||||
kaminari (1.0.1)
|
kaminari (1.0.1)
|
||||||
activesupport (>= 4.1.0)
|
activesupport (>= 4.1.0)
|
||||||
kaminari-actionview (= 1.0.1)
|
kaminari-actionview (= 1.0.1)
|
||||||
|
@ -476,6 +484,7 @@ PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
active_model_serializers (~> 0.10)
|
||||||
active_record_query_trace (~> 1.5)
|
active_record_query_trace (~> 1.5)
|
||||||
addressable (~> 2.5)
|
addressable (~> 2.5)
|
||||||
annotate (~> 2.7)
|
annotate (~> 2.7)
|
||||||
|
|
|
@ -6,13 +6,13 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@account = current_account
|
@account = current_account
|
||||||
render 'api/v1/accounts/show'
|
render json: @account, serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
current_account.update!(account_params)
|
current_account.update!(account_params)
|
||||||
@account = current_account
|
@account = current_account
|
||||||
render 'api/v1/accounts/show'
|
render json: @account, serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -9,7 +9,7 @@ class Api::V1::Accounts::FollowerAccountsController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = load_accounts
|
@accounts = load_accounts
|
||||||
render 'api/v1/accounts/index'
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -9,7 +9,7 @@ class Api::V1::Accounts::FollowingAccountsController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = load_accounts
|
@accounts = load_accounts
|
||||||
render 'api/v1/accounts/index'
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -8,16 +8,15 @@ class Api::V1::Accounts::RelationshipsController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = Account.where(id: account_ids).select('id')
|
@accounts = Account.where(id: account_ids).select('id')
|
||||||
@following = Account.following_map(account_ids, current_user.account_id)
|
render json: @accounts, each_serializer: REST::RelationshipSerializer, relationships: relationships
|
||||||
@followed_by = Account.followed_by_map(account_ids, current_user.account_id)
|
|
||||||
@blocking = Account.blocking_map(account_ids, current_user.account_id)
|
|
||||||
@muting = Account.muting_map(account_ids, current_user.account_id)
|
|
||||||
@requested = Account.requested_map(account_ids, current_user.account_id)
|
|
||||||
@domain_blocking = Account.domain_blocking_map(account_ids, current_user.account_id)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def relationships
|
||||||
|
AccountRelationshipsPresenter.new(@accounts, current_user.account_id)
|
||||||
|
end
|
||||||
|
|
||||||
def account_ids
|
def account_ids
|
||||||
@_account_ids ||= Array(params[:id]).map(&:to_i)
|
@_account_ids ||= Array(params[:id]).map(&:to_i)
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,8 +8,7 @@ class Api::V1::Accounts::SearchController < Api::BaseController
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@accounts = account_search
|
@accounts = account_search
|
||||||
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
render 'api/v1/accounts/index'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -9,6 +9,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@statuses = load_statuses
|
@statuses = load_statuses
|
||||||
|
render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -18,9 +19,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_account_statuses.tap do |statuses|
|
cached_account_statuses
|
||||||
set_maps(statuses)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_account_statuses
|
def cached_account_statuses
|
||||||
|
|
|
@ -8,49 +8,38 @@ class Api::V1::AccountsController < Api::BaseController
|
||||||
|
|
||||||
respond_to :json
|
respond_to :json
|
||||||
|
|
||||||
def show; end
|
def show
|
||||||
|
render json: @account, serializer: REST::AccountSerializer
|
||||||
|
end
|
||||||
|
|
||||||
def follow
|
def follow
|
||||||
FollowService.new.call(current_user.account, @account.acct)
|
FollowService.new.call(current_user.account, @account.acct)
|
||||||
set_relationship
|
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
|
||||||
render :relationship
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def block
|
def block
|
||||||
BlockService.new.call(current_user.account, @account)
|
BlockService.new.call(current_user.account, @account)
|
||||||
|
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
|
||||||
@following = { @account.id => false }
|
|
||||||
@followed_by = { @account.id => false }
|
|
||||||
@blocking = { @account.id => true }
|
|
||||||
@requested = { @account.id => false }
|
|
||||||
@muting = { @account.id => current_account.muting?(@account.id) }
|
|
||||||
@domain_blocking = { @account.id => current_account.domain_blocking?(@account.domain) }
|
|
||||||
|
|
||||||
render :relationship
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def mute
|
def mute
|
||||||
MuteService.new.call(current_user.account, @account)
|
MuteService.new.call(current_user.account, @account)
|
||||||
set_relationship
|
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
|
||||||
render :relationship
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def unfollow
|
def unfollow
|
||||||
UnfollowService.new.call(current_user.account, @account)
|
UnfollowService.new.call(current_user.account, @account)
|
||||||
set_relationship
|
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
|
||||||
render :relationship
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def unblock
|
def unblock
|
||||||
UnblockService.new.call(current_user.account, @account)
|
UnblockService.new.call(current_user.account, @account)
|
||||||
set_relationship
|
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
|
||||||
render :relationship
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def unmute
|
def unmute
|
||||||
UnmuteService.new.call(current_user.account, @account)
|
UnmuteService.new.call(current_user.account, @account)
|
||||||
set_relationship
|
render json: @account, serializer: REST::RelationshipSerializer, relationships: relationships
|
||||||
render :relationship
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -59,12 +48,7 @@ class Api::V1::AccountsController < Api::BaseController
|
||||||
@account = Account.find(params[:id])
|
@account = Account.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_relationship
|
def relationships
|
||||||
@following = Account.following_map([@account.id], current_user.account_id)
|
AccountRelationshipsPresenter.new([@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)
|
|
||||||
@muting = Account.muting_map([@account.id], current_user.account_id)
|
|
||||||
@requested = Account.requested_map([@account.id], current_user.account_id)
|
|
||||||
@domain_blocking = Account.domain_blocking_map([@account.id], current_user.account_id)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,6 +5,7 @@ class Api::V1::AppsController < Api::BaseController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@app = Doorkeeper::Application.create!(application_options)
|
@app = Doorkeeper::Application.create!(application_options)
|
||||||
|
render json: @app, serializer: REST::ApplicationSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -9,6 +9,7 @@ class Api::V1::BlocksController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = load_accounts
|
@accounts = load_accounts
|
||||||
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -9,14 +9,13 @@ class Api::V1::FavouritesController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@statuses = load_statuses
|
@statuses = load_statuses
|
||||||
|
render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_favourites.tap do |statuses|
|
cached_favourites
|
||||||
set_maps(statuses)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_favourites
|
def cached_favourites
|
||||||
|
|
|
@ -7,6 +7,7 @@ class Api::V1::FollowRequestsController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = load_accounts
|
@accounts = load_accounts
|
||||||
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def authorize
|
def authorize
|
||||||
|
|
|
@ -10,7 +10,7 @@ class Api::V1::FollowsController < Api::BaseController
|
||||||
raise ActiveRecord::RecordNotFound if follow_params[:uri].blank?
|
raise ActiveRecord::RecordNotFound if follow_params[:uri].blank?
|
||||||
|
|
||||||
@account = FollowService.new.call(current_user.account, target_uri).try(:target_account)
|
@account = FollowService.new.call(current_user.account, target_uri).try(:target_account)
|
||||||
render :show
|
render json: @account, serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -3,5 +3,7 @@
|
||||||
class Api::V1::InstancesController < Api::BaseController
|
class Api::V1::InstancesController < Api::BaseController
|
||||||
respond_to :json
|
respond_to :json
|
||||||
|
|
||||||
def show; end
|
def show
|
||||||
|
render json: {}, serializer: REST::InstanceSerializer
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,6 +11,7 @@ class Api::V1::MediaController < Api::BaseController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@media = current_account.media_attachments.create!(file: media_params[:file])
|
@media = current_account.media_attachments.create!(file: media_params[:file])
|
||||||
|
render json: @media, serializer: REST::MediaAttachmentSerializer
|
||||||
rescue Paperclip::Errors::NotIdentifiedByImageMagickError
|
rescue Paperclip::Errors::NotIdentifiedByImageMagickError
|
||||||
render json: file_type_error, status: 422
|
render json: file_type_error, status: 422
|
||||||
rescue Paperclip::Error
|
rescue Paperclip::Error
|
||||||
|
|
|
@ -9,6 +9,7 @@ class Api::V1::MutesController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = load_accounts
|
@accounts = load_accounts
|
||||||
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -11,11 +11,12 @@ class Api::V1::NotificationsController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@notifications = load_notifications
|
@notifications = load_notifications
|
||||||
set_maps_for_notification_target_statuses
|
render json: @notifications, each_serializer: REST::NotificationSerializer, relationships: StatusRelationshipsPresenter.new(target_statuses_from_notifications, current_user&.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@notification = current_account.notifications.find(params[:id])
|
@notification = current_account.notifications.find(params[:id])
|
||||||
|
render json: @notification, serializer: REST::NotificationSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear
|
def clear
|
||||||
|
@ -46,10 +47,6 @@ class Api::V1::NotificationsController < Api::BaseController
|
||||||
current_account.notifications.browserable(exclude_types)
|
current_account.notifications.browserable(exclude_types)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_maps_for_notification_target_statuses
|
|
||||||
set_maps target_statuses_from_notifications
|
|
||||||
end
|
|
||||||
|
|
||||||
def target_statuses_from_notifications
|
def target_statuses_from_notifications
|
||||||
@notifications.reject { |notification| notification.target_status.nil? }.map(&:target_status)
|
@notifications.reject { |notification| notification.target_status.nil? }.map(&:target_status)
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,6 +9,7 @@ class Api::V1::ReportsController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@reports = current_account.reports
|
@reports = current_account.reports
|
||||||
|
render json: @reports, each_serializer: REST::ReportSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
@ -20,7 +21,7 @@ class Api::V1::ReportsController < Api::BaseController
|
||||||
|
|
||||||
User.admins.includes(:account).each { |u| AdminMailer.new_report(u.account, @report).deliver_later }
|
User.admins.includes(:account).each { |u| AdminMailer.new_report(u.account, @report).deliver_later }
|
||||||
|
|
||||||
render :show
|
render json: @report, serializer: REST::ReportSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -6,7 +6,8 @@ class Api::V1::SearchController < Api::BaseController
|
||||||
respond_to :json
|
respond_to :json
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@search = OpenStruct.new(search_results)
|
@search = Search.new(search_results)
|
||||||
|
render json: @search, serializer: REST::SearchSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -11,7 +11,7 @@ class Api::V1::Statuses::FavouritedByAccountsController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = load_accounts
|
@accounts = load_accounts
|
||||||
render 'api/v1/statuses/accounts'
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -10,7 +10,7 @@ class Api::V1::Statuses::FavouritesController < Api::BaseController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@status = favourited_status
|
@status = favourited_status
|
||||||
render 'api/v1/statuses/show'
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
@ -19,7 +19,7 @@ class Api::V1::Statuses::FavouritesController < Api::BaseController
|
||||||
|
|
||||||
UnfavouriteWorker.perform_async(current_user.account_id, @status.id)
|
UnfavouriteWorker.perform_async(current_user.account_id, @status.id)
|
||||||
|
|
||||||
render 'api/v1/statuses/show'
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -14,14 +14,14 @@ class Api::V1::Statuses::MutesController < Api::BaseController
|
||||||
current_account.mute_conversation!(@conversation)
|
current_account.mute_conversation!(@conversation)
|
||||||
@mutes_map = { @conversation.id => true }
|
@mutes_map = { @conversation.id => true }
|
||||||
|
|
||||||
render 'api/v1/statuses/show'
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
current_account.unmute_conversation!(@conversation)
|
current_account.unmute_conversation!(@conversation)
|
||||||
@mutes_map = { @conversation.id => false }
|
@mutes_map = { @conversation.id => false }
|
||||||
|
|
||||||
render 'api/v1/statuses/show'
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -11,7 +11,7 @@ class Api::V1::Statuses::RebloggedByAccountsController < Api::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@accounts = load_accounts
|
@accounts = load_accounts
|
||||||
render 'api/v1/statuses/accounts'
|
render json: @accounts, each_serializer: REST::AccountSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -10,7 +10,7 @@ class Api::V1::Statuses::ReblogsController < Api::BaseController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@status = ReblogService.new.call(current_user.account, status_for_reblog)
|
@status = ReblogService.new.call(current_user.account, status_for_reblog)
|
||||||
render 'api/v1/statuses/show'
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
@ -20,7 +20,7 @@ class Api::V1::Statuses::ReblogsController < Api::BaseController
|
||||||
authorize status_for_destroy, :unreblog?
|
authorize status_for_destroy, :unreblog?
|
||||||
RemovalWorker.perform_async(status_for_destroy.id)
|
RemovalWorker.perform_async(status_for_destroy.id)
|
||||||
|
|
||||||
render 'api/v1/statuses/show'
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -13,6 +13,7 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
def show
|
def show
|
||||||
cached = Rails.cache.read(@status.cache_key)
|
cached = Rails.cache.read(@status.cache_key)
|
||||||
@status = cached unless cached.nil?
|
@status = cached unless cached.nil?
|
||||||
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def context
|
def context
|
||||||
|
@ -21,15 +22,20 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
loaded_ancestors = cache_collection(ancestors_results, Status)
|
loaded_ancestors = cache_collection(ancestors_results, Status)
|
||||||
loaded_descendants = cache_collection(descendants_results, Status)
|
loaded_descendants = cache_collection(descendants_results, Status)
|
||||||
|
|
||||||
@context = OpenStruct.new(ancestors: loaded_ancestors, descendants: loaded_descendants)
|
@context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants)
|
||||||
statuses = [@status] + @context[:ancestors] + @context[:descendants]
|
statuses = [@status] + @context.ancestors + @context.descendants
|
||||||
|
|
||||||
set_maps(statuses)
|
render json: @context, serializer: REST::ContextSerializer, relationships: StatusRelationshipsPresenter.new(statuses, current_user&.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def card
|
def card
|
||||||
@card = PreviewCard.find_by(status: @status)
|
@card = PreviewCard.find_by(status: @status)
|
||||||
render_empty if @card.nil?
|
|
||||||
|
if @card.nil?
|
||||||
|
render_empty
|
||||||
|
else
|
||||||
|
render json: @card, serializer: REST::PreviewCardSerializer
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
@ -43,7 +49,7 @@ class Api::V1::StatusesController < Api::BaseController
|
||||||
application: doorkeeper_token.application,
|
application: doorkeeper_token.application,
|
||||||
idempotency: request.headers['Idempotency-Key'])
|
idempotency: request.headers['Idempotency-Key'])
|
||||||
|
|
||||||
render :show
|
render json: @status, serializer: REST::StatusSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
|
|
@ -9,15 +9,13 @@ class Api::V1::Timelines::HomeController < Api::BaseController
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@statuses = load_statuses
|
@statuses = load_statuses
|
||||||
render 'api/v1/timelines/show'
|
render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_home_statuses.tap do |statuses|
|
cached_home_statuses
|
||||||
set_maps(statuses)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_home_statuses
|
def cached_home_statuses
|
||||||
|
|
|
@ -7,15 +7,13 @@ class Api::V1::Timelines::PublicController < Api::BaseController
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@statuses = load_statuses
|
@statuses = load_statuses
|
||||||
render 'api/v1/timelines/show'
|
render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_public_statuses.tap do |statuses|
|
cached_public_statuses
|
||||||
set_maps(statuses)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_public_statuses
|
def cached_public_statuses
|
||||||
|
|
|
@ -8,7 +8,7 @@ class Api::V1::Timelines::TagController < Api::BaseController
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@statuses = load_statuses
|
@statuses = load_statuses
|
||||||
render 'api/v1/timelines/show'
|
render json: @statuses, each_serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -18,9 +18,7 @@ class Api::V1::Timelines::TagController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_statuses
|
def load_statuses
|
||||||
cached_tagged_statuses.tap do |statuses|
|
cached_tagged_statuses
|
||||||
set_maps(statuses)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def cached_tagged_statuses
|
def cached_tagged_statuses
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class InlineRablScope
|
|
||||||
include RoutingHelper
|
|
||||||
|
|
||||||
def initialize(account)
|
|
||||||
@account = account
|
|
||||||
end
|
|
||||||
|
|
||||||
def current_user
|
|
||||||
@account.try(:user)
|
|
||||||
end
|
|
||||||
|
|
||||||
def current_account
|
|
||||||
@account
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,13 +1,33 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class InlineRenderer
|
class InlineRenderer
|
||||||
def self.render(status, current_account, template)
|
def initialize(object, current_account, template)
|
||||||
Rabl::Renderer.new(
|
@object = object
|
||||||
template,
|
@current_account = current_account
|
||||||
status,
|
@template = template
|
||||||
view_path: 'app/views',
|
end
|
||||||
format: :json,
|
|
||||||
scope: InlineRablScope.new(current_account)
|
def render
|
||||||
).render
|
case @template
|
||||||
|
when :status
|
||||||
|
serializer = REST::StatusSerializer
|
||||||
|
when :notification
|
||||||
|
serializer = REST::NotificationSerializer
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
serializable_resource = ActiveModelSerializers::SerializableResource.new(@object, serializer: serializer, scope: current_user, scope_name: :current_user)
|
||||||
|
serializable_resource.as_json
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.render(object, current_account, template)
|
||||||
|
new(object, current_account, template).render
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def current_user
|
||||||
|
@current_account&.user
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
5
app/models/context.rb
Normal file
5
app/models/context.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Context < ActiveModelSerializers::Model
|
||||||
|
attributes :ancestors, :descendants
|
||||||
|
end
|
5
app/models/search.rb
Normal file
5
app/models/search.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Search < ActiveModelSerializers::Model
|
||||||
|
attributes :accounts, :statuses, :hashtags
|
||||||
|
end
|
15
app/presenters/account_relationships_presenter.rb
Normal file
15
app/presenters/account_relationships_presenter.rb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AccountRelationshipsPresenter
|
||||||
|
attr_reader :following, :followed_by, :blocking,
|
||||||
|
:muting, :requested, :domain_blocking
|
||||||
|
|
||||||
|
def initialize(account_ids, current_account_id)
|
||||||
|
@following = Account.following_map(account_ids, current_account_id)
|
||||||
|
@followed_by = Account.followed_by_map(account_ids, current_account_id)
|
||||||
|
@blocking = Account.blocking_map(account_ids, current_account_id)
|
||||||
|
@muting = Account.muting_map(account_ids, current_account_id)
|
||||||
|
@requested = Account.requested_map(account_ids, current_account_id)
|
||||||
|
@domain_blocking = Account.domain_blocking_map(account_ids, current_account_id)
|
||||||
|
end
|
||||||
|
end
|
19
app/presenters/status_relationships_presenter.rb
Normal file
19
app/presenters/status_relationships_presenter.rb
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class StatusRelationshipsPresenter
|
||||||
|
attr_reader :reblogs_map, :favourites_map, :mutes_map
|
||||||
|
|
||||||
|
def initialize(statuses, current_account_id = nil)
|
||||||
|
if current_account_id.nil?
|
||||||
|
@reblogs_map = {}
|
||||||
|
@favourites_map = {}
|
||||||
|
@mutes_map = {}
|
||||||
|
else
|
||||||
|
status_ids = statuses.compact.flat_map { |s| [s.id, s.reblog_of_id] }.uniq
|
||||||
|
conversation_ids = statuses.compact.map(&:conversation_id).compact.uniq
|
||||||
|
@reblogs_map = Status.reblogs_map(status_ids, current_account_id)
|
||||||
|
@favourites_map = Status.favourites_map(status_ids, current_account_id)
|
||||||
|
@mutes_map = Status.mutes_map(conversation_ids, current_account_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
33
app/serializers/rest/account_serializer.rb
Normal file
33
app/serializers/rest/account_serializer.rb
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::AccountSerializer < ActiveModel::Serializer
|
||||||
|
include RoutingHelper
|
||||||
|
|
||||||
|
attributes :id, :username, :acct, :display_name, :locked, :created_at,
|
||||||
|
:note, :url, :avatar, :avatar_static, :header, :header_static,
|
||||||
|
:followers_count, :following_count, :statuses_count
|
||||||
|
|
||||||
|
def note
|
||||||
|
Formatter.instance.simplified_format(object)
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
TagManager.instance.url_for(object)
|
||||||
|
end
|
||||||
|
|
||||||
|
def avatar
|
||||||
|
full_asset_url(object.avatar_original_url)
|
||||||
|
end
|
||||||
|
|
||||||
|
def avatar_static
|
||||||
|
full_asset_url(object.avatar_static_url)
|
||||||
|
end
|
||||||
|
|
||||||
|
def header
|
||||||
|
full_asset_url(object.header_original_url)
|
||||||
|
end
|
||||||
|
|
||||||
|
def header_static
|
||||||
|
full_asset_url(object.header_static_url)
|
||||||
|
end
|
||||||
|
end
|
14
app/serializers/rest/application_serializer.rb
Normal file
14
app/serializers/rest/application_serializer.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::ApplicationSerializer < ActiveModel::Serializer
|
||||||
|
attributes :id, :name, :website, :redirect_uri,
|
||||||
|
:client_id, :client_secret
|
||||||
|
|
||||||
|
def client_id
|
||||||
|
object.uid
|
||||||
|
end
|
||||||
|
|
||||||
|
def client_secret
|
||||||
|
object.secret
|
||||||
|
end
|
||||||
|
end
|
6
app/serializers/rest/context_serializer.rb
Normal file
6
app/serializers/rest/context_serializer.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::ContextSerializer < ActiveModel::Serializer
|
||||||
|
has_many :ancestors, serializer: REST::StatusSerializer
|
||||||
|
has_many :descendants, serializer: REST::StatusSerializer
|
||||||
|
end
|
30
app/serializers/rest/instance_serializer.rb
Normal file
30
app/serializers/rest/instance_serializer.rb
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::InstanceSerializer < ActiveModel::Serializer
|
||||||
|
attributes :uri, :title, :description, :email,
|
||||||
|
:version, :urls
|
||||||
|
|
||||||
|
def uri
|
||||||
|
Rails.configuration.x.local_domain
|
||||||
|
end
|
||||||
|
|
||||||
|
def title
|
||||||
|
Setting.site_title
|
||||||
|
end
|
||||||
|
|
||||||
|
def description
|
||||||
|
Setting.site_description
|
||||||
|
end
|
||||||
|
|
||||||
|
def email
|
||||||
|
Setting.site_contact_email
|
||||||
|
end
|
||||||
|
|
||||||
|
def version
|
||||||
|
Mastodon::Version.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
def urls
|
||||||
|
{ streaming_api: Rails.configuration.x.streaming_api_base_url }
|
||||||
|
end
|
||||||
|
end
|
24
app/serializers/rest/media_attachment_serializer.rb
Normal file
24
app/serializers/rest/media_attachment_serializer.rb
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::MediaAttachmentSerializer < ActiveModel::Serializer
|
||||||
|
include RoutingHelper
|
||||||
|
|
||||||
|
attributes :id, :type, :url, :preview_url,
|
||||||
|
:remote_url, :text_url, :meta
|
||||||
|
|
||||||
|
def url
|
||||||
|
full_asset_url(object.file.url(:original))
|
||||||
|
end
|
||||||
|
|
||||||
|
def preview_url
|
||||||
|
full_asset_url(object.file.url(:small))
|
||||||
|
end
|
||||||
|
|
||||||
|
def text_url
|
||||||
|
medium_url(object.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def meta
|
||||||
|
object.file.meta
|
||||||
|
end
|
||||||
|
end
|
12
app/serializers/rest/notification_serializer.rb
Normal file
12
app/serializers/rest/notification_serializer.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::NotificationSerializer < ActiveModel::Serializer
|
||||||
|
attributes :id, :type, :created_at
|
||||||
|
|
||||||
|
belongs_to :from_account, key: :account, serializer: REST::AccountSerializer
|
||||||
|
belongs_to :status, if: :status_type?, serializer: REST::StatusSerializer
|
||||||
|
|
||||||
|
def status_type?
|
||||||
|
[:favourite, :reblog, :mention].include?(object.type)
|
||||||
|
end
|
||||||
|
end
|
14
app/serializers/rest/preview_card_serializer.rb
Normal file
14
app/serializers/rest/preview_card_serializer.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::PreviewCardSerializer < ActiveModel::Serializer
|
||||||
|
include RoutingHelper
|
||||||
|
|
||||||
|
attributes :url, :title, :description, :type,
|
||||||
|
:author_name, :author_url, :provider_name,
|
||||||
|
:provider_url, :html, :width, :height,
|
||||||
|
:image
|
||||||
|
|
||||||
|
def image
|
||||||
|
object.image? ? full_asset_url(object.image.url(:original)) : nil
|
||||||
|
end
|
||||||
|
end
|
30
app/serializers/rest/relationship_serializer.rb
Normal file
30
app/serializers/rest/relationship_serializer.rb
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::RelationshipSerializer < ActiveModel::Serializer
|
||||||
|
attributes :id, :following, :followed_by, :blocking,
|
||||||
|
:muting, :requested, :domain_blocking
|
||||||
|
|
||||||
|
def following
|
||||||
|
instance_options[:relationships].following[object.id] || false
|
||||||
|
end
|
||||||
|
|
||||||
|
def followed_by
|
||||||
|
instance_options[:relationships].followed_by[object.id] || false
|
||||||
|
end
|
||||||
|
|
||||||
|
def blocking
|
||||||
|
instance_options[:relationships].blocking[object.id] || false
|
||||||
|
end
|
||||||
|
|
||||||
|
def muting
|
||||||
|
instance_options[:relationships].muting[object.id] || false
|
||||||
|
end
|
||||||
|
|
||||||
|
def requested
|
||||||
|
instance_options[:relationships].requested[object.id] || false
|
||||||
|
end
|
||||||
|
|
||||||
|
def domain_blocking
|
||||||
|
instance_options[:relationships].domain_blocking[object.id] || false
|
||||||
|
end
|
||||||
|
end
|
5
app/serializers/rest/report_serializer.rb
Normal file
5
app/serializers/rest/report_serializer.rb
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::ReportSerializer < ActiveModel::Serializer
|
||||||
|
attributes :id, :action_taken
|
||||||
|
end
|
12
app/serializers/rest/search_serializer.rb
Normal file
12
app/serializers/rest/search_serializer.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::SearchSerializer < ActiveModel::Serializer
|
||||||
|
attributes :hashtags
|
||||||
|
|
||||||
|
has_many :accounts, serializer: REST::AccountSerializer
|
||||||
|
has_many :statuses, serializer: REST::StatusSerializer
|
||||||
|
|
||||||
|
def hashtags
|
||||||
|
object.hashtags.map(&:name)
|
||||||
|
end
|
||||||
|
end
|
93
app/serializers/rest/status_serializer.rb
Normal file
93
app/serializers/rest/status_serializer.rb
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class REST::StatusSerializer < ActiveModel::Serializer
|
||||||
|
attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
|
||||||
|
:sensitive, :spoiler_text, :visibility, :language,
|
||||||
|
:uri, :content, :url, :reblogs_count, :favourites_count
|
||||||
|
|
||||||
|
attribute :favourited, if: :current_user?
|
||||||
|
attribute :reblogged, if: :current_user?
|
||||||
|
attribute :muted, if: :current_user?
|
||||||
|
|
||||||
|
belongs_to :reblog, serializer: REST::StatusSerializer
|
||||||
|
belongs_to :application
|
||||||
|
belongs_to :account, serializer: REST::AccountSerializer
|
||||||
|
|
||||||
|
has_many :media_attachments, serializer: REST::MediaAttachmentSerializer
|
||||||
|
has_many :mentions
|
||||||
|
has_many :tags
|
||||||
|
|
||||||
|
def current_user?
|
||||||
|
!current_user.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
def uri
|
||||||
|
TagManager.instance.uri_for(object)
|
||||||
|
end
|
||||||
|
|
||||||
|
def content
|
||||||
|
Formatter.instance.format(object)
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
TagManager.instance.url_for(object)
|
||||||
|
end
|
||||||
|
|
||||||
|
def favourited
|
||||||
|
if instance_options && instance_options[:relationships]
|
||||||
|
instance_options[:relationships].favourites_map[object.id] || false
|
||||||
|
else
|
||||||
|
current_user.account.favourited?(object)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def reblogged
|
||||||
|
if instance_options && instance_options[:relationships]
|
||||||
|
instance_options[:relationships].reblogs_map[object.id] || false
|
||||||
|
else
|
||||||
|
current_user.account.reblogged?(object)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def muted
|
||||||
|
if instance_options && instance_options[:relationships]
|
||||||
|
instance_options[:relationships].mutes_map[object.conversation_id] || false
|
||||||
|
else
|
||||||
|
current_user.account.muting_conversation?(object.conversation)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ApplicationSerializer < ActiveModel::Serializer
|
||||||
|
attributes :name, :website
|
||||||
|
end
|
||||||
|
|
||||||
|
class MentionSerializer < ActiveModel::Serializer
|
||||||
|
attributes :id, :username, :url, :acct
|
||||||
|
|
||||||
|
def id
|
||||||
|
object.account_id
|
||||||
|
end
|
||||||
|
|
||||||
|
def username
|
||||||
|
object.account_username
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
TagManager.instance.url_for(object.account)
|
||||||
|
end
|
||||||
|
|
||||||
|
def acct
|
||||||
|
object.account_acct
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TagSerializer < ActiveModel::Serializer
|
||||||
|
include RoutingHelper
|
||||||
|
|
||||||
|
attributes :name, :url
|
||||||
|
|
||||||
|
def url
|
||||||
|
tag_url(object)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -54,7 +54,7 @@ class FanOutOnWriteService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_anonymous_payload(status)
|
def render_anonymous_payload(status)
|
||||||
@payload = InlineRenderer.render(status, nil, 'api/v1/statuses/show')
|
@payload = InlineRenderer.render(status, nil, :status)
|
||||||
@payload = Oj.dump(event: :update, payload: @payload)
|
@payload = Oj.dump(event: :update, payload: @payload)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ class NotifyService < BaseService
|
||||||
def create_notification
|
def create_notification
|
||||||
@notification.save!
|
@notification.save!
|
||||||
return unless @notification.browserable?
|
return unless @notification.browserable?
|
||||||
Redis.current.publish("timeline:#{@recipient.id}", Oj.dump(event: :notification, payload: InlineRenderer.render(@notification, @recipient, 'api/v1/notifications/show')))
|
Redis.current.publish("timeline:#{@recipient.id}", Oj.dump(event: :notification, payload: InlineRenderer.render(@notification, @recipient, :notification)))
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_email
|
def send_email
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @accounts
|
|
||||||
extends 'api/v1/accounts/show'
|
|
|
@ -1,9 +0,0 @@
|
||||||
object @account
|
|
||||||
|
|
||||||
attribute :id
|
|
||||||
node(:following) { |account| @following[account.id] || false }
|
|
||||||
node(:followed_by) { |account| @followed_by[account.id] || false }
|
|
||||||
node(:blocking) { |account| @blocking[account.id] || false }
|
|
||||||
node(:muting) { |account| @muting[account.id] || false }
|
|
||||||
node(:requested) { |account| @requested[account.id] || false }
|
|
||||||
node(:domain_blocking) { |account| @domain_blocking[account.id] || false }
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @accounts
|
|
||||||
extends 'api/v1/accounts/relationship'
|
|
|
@ -1,12 +0,0 @@
|
||||||
object @account
|
|
||||||
|
|
||||||
attributes :id, :username, :acct, :display_name, :locked, :created_at
|
|
||||||
|
|
||||||
node(:note) { |account| Formatter.instance.simplified_format(account) }
|
|
||||||
node(:url) { |account| TagManager.instance.url_for(account) }
|
|
||||||
node(:avatar) { |account| full_asset_url(account.avatar_original_url) }
|
|
||||||
node(:avatar_static) { |account| full_asset_url(account.avatar_static_url) }
|
|
||||||
node(:header) { |account| full_asset_url(account.header_original_url) }
|
|
||||||
node(:header_static) { |account| full_asset_url(account.header_static_url) }
|
|
||||||
|
|
||||||
attributes :followers_count, :following_count, :statuses_count
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @statuses
|
|
||||||
extends 'api/v1/statuses/show'
|
|
|
@ -1,4 +0,0 @@
|
||||||
object @app
|
|
||||||
attributes :id, :redirect_uri
|
|
||||||
node(:client_id) { |app| app.uid }
|
|
||||||
node(:client_secret) { |app| app.secret }
|
|
|
@ -1,3 +0,0 @@
|
||||||
object @application
|
|
||||||
|
|
||||||
attributes :name, :website
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @accounts
|
|
||||||
extends 'api/v1/accounts/show'
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @statuses
|
|
||||||
extends 'api/v1/statuses/show'
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @accounts
|
|
||||||
extends 'api/v1/accounts/show'
|
|
|
@ -1,2 +0,0 @@
|
||||||
object @account
|
|
||||||
extends('api/v1/accounts/show')
|
|
|
@ -1,10 +0,0 @@
|
||||||
object false
|
|
||||||
|
|
||||||
node(:uri) { site_hostname }
|
|
||||||
node(:title) { Setting.site_title }
|
|
||||||
node(:description) { Setting.site_description }
|
|
||||||
node(:email) { Setting.site_contact_email }
|
|
||||||
node(:version) { Mastodon::Version.to_s }
|
|
||||||
node :urls do
|
|
||||||
{ :streaming_api => Rails.configuration.x.streaming_api_base_url }
|
|
||||||
end
|
|
|
@ -1,7 +0,0 @@
|
||||||
object @media
|
|
||||||
attribute :id, :type
|
|
||||||
|
|
||||||
node(:url) { |media| full_asset_url(media.file.url(:original)) }
|
|
||||||
node(:preview_url) { |media| full_asset_url(media.file.url(:small)) }
|
|
||||||
node(:text_url) { |media| medium_url(media) }
|
|
||||||
node(:meta) { |media| media.file.meta }
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @accounts
|
|
||||||
extends 'api/v1/accounts/show'
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @notifications
|
|
||||||
extends 'api/v1/notifications/show'
|
|
|
@ -1,11 +0,0 @@
|
||||||
object @notification
|
|
||||||
|
|
||||||
attributes :id, :type, :created_at
|
|
||||||
|
|
||||||
child from_account: :account do
|
|
||||||
extends 'api/v1/accounts/show'
|
|
||||||
end
|
|
||||||
|
|
||||||
node(:status, if: lambda { |n| [:favourite, :reblog, :mention].include?(n.type) }) do |n|
|
|
||||||
partial 'api/v1/statuses/show', object: n.target_status
|
|
||||||
end
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @reports
|
|
||||||
extends 'api/v1/reports/show'
|
|
|
@ -1,2 +0,0 @@
|
||||||
object @report
|
|
||||||
attributes :id, :action_taken
|
|
|
@ -1,13 +0,0 @@
|
||||||
object @search
|
|
||||||
|
|
||||||
child :accounts, object_root: false do
|
|
||||||
extends 'api/v1/accounts/show'
|
|
||||||
end
|
|
||||||
|
|
||||||
node(:hashtags) do |search|
|
|
||||||
search.hashtags.map(&:name)
|
|
||||||
end
|
|
||||||
|
|
||||||
child :statuses, object_root: false do
|
|
||||||
extends 'api/v1/statuses/show'
|
|
||||||
end
|
|
|
@ -1,6 +0,0 @@
|
||||||
attributes :id, :remote_url, :type
|
|
||||||
|
|
||||||
node(:url) { |media| full_asset_url(media.file.url(:original)) }
|
|
||||||
node(:preview_url) { |media| full_asset_url(media.file.url(:small)) }
|
|
||||||
node(:text_url) { |media| media.local? ? medium_url(media) : nil }
|
|
||||||
node(:meta) { |media| media.file.meta }
|
|
|
@ -1,4 +0,0 @@
|
||||||
node(:url) { |mention| TagManager.instance.url_for(mention.account) }
|
|
||||||
node(:acct) { |mention| mention.account_acct }
|
|
||||||
node(:id) { |mention| mention.account_id }
|
|
||||||
node(:username) { |mention| mention.account_username }
|
|
|
@ -1,29 +0,0 @@
|
||||||
attributes :id, :created_at, :in_reply_to_id,
|
|
||||||
:in_reply_to_account_id, :sensitive,
|
|
||||||
:spoiler_text, :visibility, :language
|
|
||||||
|
|
||||||
node(:uri) { |status| TagManager.instance.uri_for(status) }
|
|
||||||
node(:content) { |status| Formatter.instance.format(status) }
|
|
||||||
node(:url) { |status| TagManager.instance.url_for(status) }
|
|
||||||
node(:reblogs_count) { |status| defined?(@reblogs_counts_map) ? (@reblogs_counts_map[status.id] || 0) : status.reblogs_count }
|
|
||||||
node(:favourites_count) { |status| defined?(@favourites_counts_map) ? (@favourites_counts_map[status.id] || 0) : status.favourites_count }
|
|
||||||
|
|
||||||
child :application do
|
|
||||||
extends 'api/v1/apps/show'
|
|
||||||
end
|
|
||||||
|
|
||||||
child :account do
|
|
||||||
extends 'api/v1/accounts/show'
|
|
||||||
end
|
|
||||||
|
|
||||||
child :media_attachments, object_root: false do
|
|
||||||
extends 'api/v1/statuses/_media'
|
|
||||||
end
|
|
||||||
|
|
||||||
child :mentions, object_root: false do
|
|
||||||
extends 'api/v1/statuses/_mention'
|
|
||||||
end
|
|
||||||
|
|
||||||
child :tags, object_root: false do
|
|
||||||
extends 'api/v1/statuses/_tags'
|
|
||||||
end
|
|
|
@ -1,2 +0,0 @@
|
||||||
attribute :name
|
|
||||||
node(:url) { |tag| tag_url(tag) }
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @accounts
|
|
||||||
extends 'api/v1/accounts/show'
|
|
|
@ -1,7 +0,0 @@
|
||||||
object @card
|
|
||||||
|
|
||||||
attributes :url, :title, :description, :type,
|
|
||||||
:author_name, :author_url, :provider_name,
|
|
||||||
:provider_url, :html, :width, :height
|
|
||||||
|
|
||||||
node(:image) { |card| card.image? ? full_asset_url(card.image.url(:original)) : nil }
|
|
|
@ -1,9 +0,0 @@
|
||||||
object @context
|
|
||||||
|
|
||||||
node :ancestors do |context|
|
|
||||||
partial 'api/v1/statuses/index', object: context.ancestors
|
|
||||||
end
|
|
||||||
|
|
||||||
node :descendants do |context|
|
|
||||||
partial 'api/v1/statuses/index', object: context.descendants
|
|
||||||
end
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @statuses
|
|
||||||
extends('api/v1/statuses/show')
|
|
|
@ -1,15 +0,0 @@
|
||||||
object @status
|
|
||||||
|
|
||||||
extends 'api/v1/statuses/_show'
|
|
||||||
|
|
||||||
node(:favourited, if: proc { !current_account.nil? }) { |status| defined?(@favourites_map) ? @favourites_map[status.id] : current_account.favourited?(status) }
|
|
||||||
node(:reblogged, if: proc { !current_account.nil? }) { |status| defined?(@reblogs_map) ? @reblogs_map[status.id] : current_account.reblogged?(status) }
|
|
||||||
node(:muted, if: proc { !current_account.nil? }) { |status| defined?(@mutes_map) ? @mutes_map[status.conversation_id] : current_account.muting_conversation?(status.conversation) }
|
|
||||||
|
|
||||||
child reblog: :reblog do
|
|
||||||
extends 'api/v1/statuses/_show'
|
|
||||||
|
|
||||||
node(:favourited, if: proc { !current_account.nil? }) { |status| defined?(@favourites_map) ? @favourites_map[status.id] : current_account.favourited?(status) }
|
|
||||||
node(:reblogged, if: proc { !current_account.nil? }) { |status| defined?(@reblogs_map) ? @reblogs_map[status.id] : current_account.reblogged?(status) }
|
|
||||||
node(:muted, if: proc { !current_account.nil? }) { false }
|
|
||||||
end
|
|
|
@ -1,2 +0,0 @@
|
||||||
collection @statuses
|
|
||||||
extends('api/v1/statuses/show')
|
|
|
@ -24,8 +24,8 @@ end
|
||||||
|
|
||||||
node(:accounts) do
|
node(:accounts) do
|
||||||
store = {}
|
store = {}
|
||||||
store[current_account.id] = partial('api/v1/accounts/show', object: current_account)
|
store[current_account.id] = ActiveModelSerializers::SerializableResource.new(current_account, serializer: REST::AccountSerializer)
|
||||||
store[@admin.id] = partial('api/v1/accounts/show', object: @admin) unless @admin.nil?
|
store[@admin.id] = ActiveModelSerializers::SerializableResource.new(@admin, serializer: REST::AccountSerializer) unless @admin.nil?
|
||||||
store
|
store
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ class PushUpdateWorker
|
||||||
def perform(account_id, status_id)
|
def perform(account_id, status_id)
|
||||||
account = Account.find(account_id)
|
account = Account.find(account_id)
|
||||||
status = Status.find(status_id)
|
status = Status.find(status_id)
|
||||||
message = InlineRenderer.render(status, account, 'api/v1/statuses/show')
|
message = InlineRenderer.render(status, account, :status)
|
||||||
|
|
||||||
Redis.current.publish("timeline:#{account.id}", Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
|
Redis.current.publish("timeline:#{account.id}", Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require 'rails_helper'
|
|
||||||
|
|
||||||
describe InlineRablScope do
|
|
||||||
describe '#current_account' do
|
|
||||||
it 'returns the given account' do
|
|
||||||
account = Fabricate(:account)
|
|
||||||
expect(InlineRablScope.new(account).current_account).to eq account
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#current_user' do
|
|
||||||
it 'returns nil if the given account is nil' do
|
|
||||||
expect(InlineRablScope.new(nil).current_user).to eq nil
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns user of account if the given account is not nil' do
|
|
||||||
user = Fabricate(:user)
|
|
||||||
expect(InlineRablScope.new(user.account).current_user).to eq user
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
Reference in a new issue