闭社主体 forked from https://github.com/tootsuite/mastodon
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.2 KiB

  1. # frozen_string_literal: true
  2. class AccountsController < ApplicationController
  3. include AccountControllerConcern
  4. include SignatureVerification
  5. def show
  6. respond_to do |format|
  7. format.html do
  8. @pinned_statuses = []
  9. if current_account && @account.blocking?(current_account)
  10. @statuses = []
  11. return
  12. end
  13. @pinned_statuses = cache_collection(@account.pinned_statuses.limit(1), Status) unless media_requested?
  14. @statuses = filtered_statuses.paginate_by_max_id(20, params[:max_id], params[:since_id])
  15. @statuses = cache_collection(@statuses, Status)
  16. @next_url = next_url unless @statuses.empty?
  17. end
  18. format.atom do
  19. @entries = @account.stream_entries.where(hidden: false).with_includes.paginate_by_max_id(20, params[:max_id], params[:since_id])
  20. render xml: OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.feed(@account, @entries.to_a))
  21. end
  22. format.json do
  23. render json: @account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
  24. end
  25. end
  26. end
  27. private
  28. def filtered_statuses
  29. default_statuses.tap do |statuses|
  30. statuses.merge!(only_media_scope) if media_requested?
  31. statuses.merge!(no_replies_scope) unless replies_requested?
  32. end
  33. end
  34. def default_statuses
  35. @account.statuses.where(visibility: [:public, :unlisted])
  36. end
  37. def only_media_scope
  38. Status.where(id: account_media_status_ids)
  39. end
  40. def account_media_status_ids
  41. @account.media_attachments.attached.reorder(nil).select(:status_id).distinct
  42. end
  43. def no_replies_scope
  44. Status.without_replies
  45. end
  46. def set_account
  47. @account = Account.find_local!(params[:username])
  48. end
  49. def next_url
  50. if media_requested?
  51. short_account_media_url(@account, max_id: @statuses.last.id)
  52. elsif replies_requested?
  53. short_account_with_replies_url(@account, max_id: @statuses.last.id)
  54. else
  55. short_account_url(@account, max_id: @statuses.last.id)
  56. end
  57. end
  58. def media_requested?
  59. request.path.ends_with?('/media')
  60. end
  61. def replies_requested?
  62. request.path.ends_with?('/with_replies')
  63. end
  64. end