From 665f16600103855dd115c806b8483c40c7620b03 Mon Sep 17 00:00:00 2001 From: basit3407 Date: Tue, 3 Jun 2025 10:43:46 +0500 Subject: [PATCH 1/3] fix: allow multi-verse tafsirs in verses API This commit fixes the issue where multi-verse tafsirs (such as ID 169) were not being returned by the /verses endpoint. Key change: - Remove the `one_verse` constraint from the verses presenter, allowing the endpoint to include tafsirs that span multiple verses. This change enables tafsir resources like Ibn Kathir (ID 169) to be properly included in API responses. --- app/presenters/verses_presenter.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/presenters/verses_presenter.rb b/app/presenters/verses_presenter.rb index c712903c..14aa815f 100644 --- a/app/presenters/verses_presenter.rb +++ b/app/presenters/verses_presenter.rb @@ -261,7 +261,6 @@ def fetch_tafsirs approved_tafsirs = ResourceContent .approved .tafsirs - .one_verse .allowed_to_share params[:tafsirs] = approved_tafsirs From b7f3f57de64d2eb799def53aa7aa6916ce1668fc Mon Sep 17 00:00:00 2001 From: basit3407 Date: Tue, 3 Jun 2025 12:07:51 +0500 Subject: [PATCH 2/3] feat(verses): enable support for multi-ayah tafsir via verse ID range join - Introduced support for multi-ayah tafsir loading in VerseFinder - Added load_tafsirs method to join tafsirs based on verse ID range (start_verse_id to end_verse_id) - Ensured single-ayah tafsir continues to work as expected - Maintains backward compatibility while enabling richer tafsir rendering across APIs like /v4/verses/by_key --- app/finders/verse_finder.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/finders/verse_finder.rb b/app/finders/verse_finder.rb index 14415309..6115a56a 100644 --- a/app/finders/verse_finder.rb +++ b/app/finders/verse_finder.rb @@ -28,6 +28,8 @@ def load_verses(language_code) load_translations load_words(language_code) load_audio + load_tafsirs # ← add this line + translations_order = params[:translations].present? ? ',translations.priority ASC' : '' @results.order("verses.verse_index ASC, words.position ASC, word_translations.priority ASC #{translations_order}".strip) @@ -84,6 +86,23 @@ def load_audio end end + # Load tafsirs that span the current verse (single-ayah OR multi-ayah) + def load_tafsirs + return unless params[:tafsirs].present? + + tafsir_ids = Array(params[:tafsirs]).map(&:to_i) + + @results = @results + .joins(<<~SQL) + LEFT JOIN tafsirs + ON tafsirs.start_verse_id <= verses.id + AND (tafsirs.end_verse_id IS NULL OR tafsirs.end_verse_id >= verses.id) + SQL + .where(tafsirs: { resource_content_id: tafsir_ids }) + .eager_load(:tafsirs) + end + + def set_offset if offset.present? @results = @results.offset(offset) From 244ce221ae77e0a4af5150fa957c20f4f0d4d340 Mon Sep 17 00:00:00 2001 From: Basit Minhas Date: Thu, 5 Jun 2025 08:50:46 +0500 Subject: [PATCH 3/3] Ensure recitation presenter eager loads translated names --- app/presenters/audio/recitation_presenter.rb | 4 ++-- spec/apis/v4/chapter_reciters_spec.rb | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 spec/apis/v4/chapter_reciters_spec.rb diff --git a/app/presenters/audio/recitation_presenter.rb b/app/presenters/audio/recitation_presenter.rb index c0fe3ba4..18d96d2a 100644 --- a/app/presenters/audio/recitation_presenter.rb +++ b/app/presenters/audio/recitation_presenter.rb @@ -9,8 +9,8 @@ class Audio::RecitationPresenter < BasePresenter def recitations relation = Audio::Recitation - .includes(:recitation_style, :qirat_type, reciter: :translated_name) - .eager_load(reciter: :translated_name) + .includes(:translated_name, :recitation_style, :qirat_type, reciter: :translated_name) + .eager_load(:translated_name, reciter: :translated_name) .order('priority ASC, language_priority DESC') eager_load_translated_name filter_recitations(relation) diff --git a/spec/apis/v4/chapter_reciters_spec.rb b/spec/apis/v4/chapter_reciters_spec.rb new file mode 100644 index 00000000..e9d7a632 --- /dev/null +++ b/spec/apis/v4/chapter_reciters_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe 'Chapter reciters endpoint', type: :api do + context 'when no recitations exist' do + it 'returns an empty list' do + get '/api/v4/resources/chapter_reciters', chapter_id: 1 + expect(last_response.status).to eq(200) + expect(Oj.load(last_response.body)['reciters']).to eq([]) + end + end +end