~cytrogen/masto-fe

ec59166844b04ec416bdbc2612fd8a4364f9dd67 — Claire 2 years ago bca649b
Fix ArgumentError when loading newer Private Mentions (#25399)

M app/controllers/api/v1/conversations_controller.rb => app/controllers/api/v1/conversations_controller.rb +1 -1
@@ 45,7 45,7 @@ class Api::V1::ConversationsController < Api::BaseController
                           },
                         ]
                       )
                       .to_a_paginated_by_id(limit_param(LIMIT), **params_slice(:max_id, :since_id, :min_id))
                       .to_a_paginated_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
  end

  def insert_pagination_headers

M app/models/account_conversation.rb => app/models/account_conversation.rb +9 -10
@@ 43,22 43,21 @@ class AccountConversation < ApplicationRecord
  end

  class << self
    def to_a_paginated_by_id(limit, min_id: nil, max_id: nil, since_id: nil, preload_participants: true)
    def to_a_paginated_by_id(limit, options = {})
      array = begin
        if min_id
          paginate_by_min_id(limit, min_id, max_id).reverse
        if options[:min_id]
          paginate_by_min_id(limit, options[:min_id], options[:max_id]).reverse
        else
          paginate_by_max_id(limit, max_id, since_id).to_a
          paginate_by_max_id(limit, options[:max_id], options[:since_id]).to_a
        end
      end

      if preload_participants
        participant_ids = array.flat_map(&:participant_account_ids)
        accounts_by_id = Account.where(id: participant_ids).index_by(&:id)
      # Preload participants
      participant_ids = array.flat_map(&:participant_account_ids)
      accounts_by_id = Account.where(id: participant_ids).index_by(&:id)

        array.each do |conversation|
          conversation.participant_accounts = conversation.participant_account_ids.filter_map { |id| accounts_by_id[id] }
        end
      array.each do |conversation|
        conversation.participant_accounts = conversation.participant_account_ids.filter_map { |id| accounts_by_id[id] }
      end

      array

M spec/controllers/api/v1/conversations_controller_spec.rb => spec/controllers/api/v1/conversations_controller_spec.rb +18 -0
@@ 35,5 35,23 @@ RSpec.describe Api::V1::ConversationsController do
      json = body_as_json
      expect(json.size).to eq 1
    end

    context 'with since_id' do
      context 'when requesting old posts' do
        it 'returns conversations' do
          get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.ago, with_random: false) }
          json = body_as_json
          expect(json.size).to eq 1
        end
      end

      context 'when requesting posts in the future' do
        it 'returns no conversation' do
          get :index, params: { since_id: Mastodon::Snowflake.id_at(1.hour.from_now, with_random: false) }
          json = body_as_json
          expect(json.size).to eq 0
        end
      end
    end
  end
end