Skip to content

Commit a300865

Browse files
authored
Expose scripture parsing to GQL query as an adhoc util (#3174)
1 parent c2ee9d6 commit a300865

File tree

5 files changed

+74
-3
lines changed

5 files changed

+74
-3
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { ObjectType } from '@nestjs/graphql';
2+
import { Range, Verse } from '@seedcompany/scripture';
3+
4+
@ObjectType()
5+
export class ScriptureCollection {
6+
verses: ReadonlyArray<Range<Verse>>;
7+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import {
2+
Args,
3+
Float,
4+
Int,
5+
Parent,
6+
Query,
7+
ResolveField,
8+
Resolver,
9+
} from '@nestjs/graphql';
10+
import { labelOfVerseRanges, parseScripture } from '@seedcompany/scripture';
11+
import { ScriptureRange } from './dto';
12+
import { ScriptureCollection } from './dto/scripture-collection.dto';
13+
import { getTotalVerseEquivalents } from './verse-equivalents';
14+
15+
@Resolver(ScriptureCollection)
16+
export class ScriptureCollectionResolver {
17+
@Query(() => ScriptureCollection)
18+
parseScripture(
19+
@Args({ name: 'text', type: () => [String] }) text: readonly string[],
20+
): ScriptureCollection {
21+
const verses = text.flatMap(parseScripture);
22+
return { verses };
23+
}
24+
25+
@ResolveField(() => [ScriptureRange])
26+
ranges(@Parent() { verses }: ScriptureCollection): readonly ScriptureRange[] {
27+
return verses.map((v) => ScriptureRange.fromVerses(v));
28+
}
29+
30+
@ResolveField(() => String)
31+
label(@Parent() { verses }: ScriptureCollection): string {
32+
return labelOfVerseRanges(verses);
33+
}
34+
35+
@ResolveField(() => Int, {
36+
description: 'The total number of verses in this scripture collection',
37+
})
38+
totalVerses(@Parent() { verses }: ScriptureCollection): number {
39+
return ScriptureRange.totalVerses(...verses);
40+
}
41+
42+
@ResolveField(() => Float, {
43+
description:
44+
'The total number of verse equivalents in this scripture collection',
45+
})
46+
totalVerseEquivalents(@Parent() { verses }: ScriptureCollection): number {
47+
return getTotalVerseEquivalents(...verses);
48+
}
49+
}

src/components/scripture/scripture-range.resolver.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { Int, Parent, ResolveField, Resolver } from '@nestjs/graphql';
1+
import { Float, Int, Parent, ResolveField, Resolver } from '@nestjs/graphql';
22
import { labelOfVerseRange } from '@seedcompany/scripture';
33
import { stripIndent } from 'common-tags';
44
import { ScriptureRange } from './dto';
5+
import { getTotalVerseEquivalents } from './verse-equivalents';
56

67
@Resolver(ScriptureRange)
78
export class ScriptureRangeResolver {
@@ -32,4 +33,11 @@ export class ScriptureRangeResolver {
3233
const verseRange = ScriptureRange.fromReferences(range);
3334
return verseRange.end - verseRange.start + 1;
3435
}
36+
@ResolveField(() => Float, {
37+
description:
38+
'The total number of verse equivalents in this scripture range',
39+
})
40+
totalVerseEquivalents(@Parent() range: ScriptureRange): number {
41+
return getTotalVerseEquivalents(range);
42+
}
3543
}

src/components/scripture/scripture.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { Module } from '@nestjs/common';
2+
import { ScriptureCollectionResolver } from './scripture-collection.resolver';
23
import { ScriptureRangeResolver } from './scripture-range.resolver';
34
import { ScriptureReferenceRepository } from './scripture-reference.repository';
45
import { ScriptureReferenceResolver } from './scripture-reference.resolver';
56
import { ScriptureReferenceService } from './scripture-reference.service';
67

78
@Module({
89
providers: [
10+
ScriptureCollectionResolver,
911
ScriptureReferenceResolver,
1012
ScriptureRangeResolver,
1113
ScriptureReferenceService,

src/components/scripture/verse-equivalents.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1-
import { Book, mergeVerseRanges, Verse } from '@seedcompany/scripture';
1+
import {
2+
Book,
3+
mergeVerseRanges,
4+
Verse,
5+
VerseLike,
6+
} from '@seedcompany/scripture';
27
import { sum } from 'lodash';
38
import { Range } from '~/common';
49
import { difficultyFactorOfBook } from './book-difficulty-factor';
510
import { ScriptureRange, UnspecifiedScripturePortion } from './dto';
611

712
export const getTotalVerseEquivalents = (
8-
...refs: readonly ScriptureRange[]
13+
...refs: ReadonlyArray<Range<VerseLike>>
914
) => {
1015
const verses = mergeVerseRanges(refs)
1116
.flatMap((range) => [...splitRangeByBook(range)])

0 commit comments

Comments
 (0)