Skip to content

Commit 4c1459d

Browse files
authored
Merge pull request #44 from basit3407/feature/verses-by-range-endpoint
feat(api): add support for verses/by_range endpoint
2 parents 0b7b296 + 086f58a commit 4c1459d

4 files changed

Lines changed: 85 additions & 0 deletions

File tree

‎packages/api/mocks/handlers.ts‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,27 @@ export const handlers = [
4545
},
4646
),
4747

48+
http.get(
49+
"https://apis.quran.foundation/content/api/v4/verses/by_range",
50+
({ request }) => {
51+
return HttpResponse.json({
52+
verses: [
53+
{
54+
id: 1,
55+
verse_number: 1,
56+
page_number: 1,
57+
verse_key: "1:1",
58+
juz_number: 1,
59+
hizb_number: 1,
60+
rub_number: 1,
61+
sajdah_type: null,
62+
sajdah_number: null,
63+
},
64+
],
65+
});
66+
},
67+
),
68+
4869
http.get(
4970
"https://apis.quran.foundation/content/api/v4/chapters",
5071
({ request }) => {

‎packages/api/src/sdk/verses.ts‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,38 @@ export class QuranVerses {
6262
return verse;
6363
}
6464

65+
/**
66+
* Get verses by range.
67+
* @param {VerseKey} from start verse key (e.g., "1:1")
68+
* @param {VerseKey} to end verse key (e.g., "1:7")
69+
* @param {GetVerseOptions} options
70+
* @example
71+
* client.verses.findByRange('1:1', '1:7')
72+
*/
73+
async findByRange(
74+
from: VerseKey,
75+
to: VerseKey,
76+
options?: GetVerseOptions,
77+
): Promise<Verse[]> {
78+
// We could validate keys here, but the API will also valid it.
79+
// simpler to just pass through for now, or use isValidVerseKey if desired.
80+
if (!isValidVerseKey(from) || !isValidVerseKey(to)) {
81+
throw new Error("Invalid verse key");
82+
}
83+
84+
const { verses } = await this.fetcher.fetch<{ verses: Verse[] }>(
85+
"/content/api/v4/verses/by_range",
86+
{
87+
words: false, // verses-specific default
88+
...options,
89+
from,
90+
to,
91+
},
92+
);
93+
94+
return verses;
95+
}
96+
6597
/**
6698
* Get verses by chapter.
6799
* @param {ChapterId} id chapter id, minimum 1, maximum 114

‎packages/api/src/types/api/Tafsir.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,11 @@ export interface Tafsir {
44
text?: string;
55
resourceName?: string;
66
languageName?: string;
7+
slug?: string;
8+
languageId?: number;
9+
groupVerseKeyFrom?: string;
10+
groupVerseKeyTo?: string;
11+
groupTafsirId?: number;
12+
startVerseId?: number;
13+
endVerseId?: number;
714
}

‎packages/api/test/verses.test.ts‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,31 @@ describe("Verses API", () => {
6060
});
6161
});
6262

63+
describe("findByRange()", () => {
64+
it("should return verses for valid range", async () => {
65+
const response = await testClient.verses.findByRange(
66+
VALID_VERSE_KEY,
67+
VALID_VERSE_KEY,
68+
);
69+
expect(response).toBeInstanceOf(Array);
70+
expect(response).toBeDefined();
71+
});
72+
73+
it("should throw error when 'from' key is invalid", async () => {
74+
await expect(
75+
// @ts-expect-error - testing invalid verse key
76+
testClient.verses.findByRange(INVALID_VERSE_KEY, VALID_VERSE_KEY),
77+
).rejects.toThrowError();
78+
});
79+
80+
it("should throw error when 'to' key is invalid", async () => {
81+
await expect(
82+
// @ts-expect-error - testing invalid verse key
83+
testClient.verses.findByRange(VALID_VERSE_KEY, INVALID_VERSE_KEY),
84+
).rejects.toThrowError();
85+
});
86+
});
87+
6388
describe("findByPage()", () => {
6489
it("should return an array of verses for valid page", async () => {
6590
const response = await testClient.verses.findByPage(VALID_PAGE_NUMBER);

0 commit comments

Comments
 (0)