The code powering m.abunchtell.com https://m.abunchtell.com
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

69 行
1.9 KiB

  1. # frozen_string_literal: true
  2. class ActivityPub::RepliesController < Api::BaseController
  3. include SignatureAuthentication
  4. include Authorization
  5. include AccountOwnedConcern
  6. DESCENDANTS_LIMIT = 60
  7. before_action :set_status
  8. before_action :set_cache_headers
  9. before_action :set_replies
  10. def index
  11. render json: replies_collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json', skip_activities: true
  12. end
  13. private
  14. def set_status
  15. @status = @account.statuses.find(params[:status_id])
  16. authorize @status, :show?
  17. rescue Mastodon::NotPermittedError
  18. raise ActiveRecord::RecordNotFound
  19. end
  20. def set_replies
  21. @replies = page_params[:other_accounts] ? Status.where.not(account_id: @account.id) : @account.statuses
  22. @replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted])
  23. @replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
  24. end
  25. def replies_collection_presenter
  26. page = ActivityPub::CollectionPresenter.new(
  27. id: account_status_replies_url(@account, @status, page_params),
  28. type: :unordered,
  29. part_of: account_status_replies_url(@account, @status),
  30. next: next_page,
  31. items: @replies.map { |status| status.local ? status : status.id }
  32. )
  33. return page if page_requested?
  34. ActivityPub::CollectionPresenter.new(
  35. id: account_status_replies_url(@account, @status),
  36. type: :unordered,
  37. first: page
  38. )
  39. end
  40. def page_requested?
  41. params[:page] == 'true'
  42. end
  43. def next_page
  44. account_status_replies_url(
  45. @account,
  46. @status,
  47. page: true,
  48. min_id: @replies&.last&.id,
  49. other_accounts: !(@replies&.last&.account_id == @account.id && @replies.size == DESCENDANTS_LIMIT)
  50. )
  51. end
  52. def page_params
  53. params_slice(:other_accounts, :min_id).merge(page: true)
  54. end
  55. end