1
+ const express = require ( 'express' ) ;
2
+ const cors = require ( 'cors' ) ;
3
+ const fs = require ( 'fs' ) ;
4
+ const path = require ( 'path' ) ;
5
+
6
+ const app = express ( ) ;
7
+ app . use ( cors ( ) ) ;
8
+ app . use ( express . static ( __dirname ) ) ;
9
+
10
+ // Load the Book of Mormon data
11
+ const bokData = JSON . parse ( fs . readFileSync ( path . join ( __dirname , 'bok.json' ) , 'utf8' ) ) ;
12
+
13
+ // Helper function to get a random verse from the entire book
14
+ function getRandomVerse ( ) {
15
+ const books = bokData . books ;
16
+ const randomBook = books [ Math . floor ( Math . random ( ) * books . length ) ] ;
17
+ const randomChapter = randomBook . chapters [ Math . floor ( Math . random ( ) * randomBook . chapters . length ) ] ;
18
+ const randomVerse = randomChapter . verses [ Math . floor ( Math . random ( ) * randomChapter . verses . length ) ] ;
19
+ return randomVerse ;
20
+ }
21
+
22
+ // Helper function to get today's verse (changes daily)
23
+ function getDailyVerse ( ) {
24
+ const startDate = new Date ( '2024-01-01' ) . getTime ( ) ;
25
+ const today = new Date ( ) . getTime ( ) ;
26
+ const daysSinceStart = Math . floor ( ( today - startDate ) / ( 1000 * 60 * 60 * 24 ) ) ;
27
+
28
+ let totalVerses = [ ] ;
29
+ bokData . books . forEach ( book => {
30
+ book . chapters . forEach ( chapter => {
31
+ totalVerses = totalVerses . concat ( chapter . verses ) ;
32
+ } ) ;
33
+ } ) ;
34
+
35
+ const verseIndex = daysSinceStart % totalVerses . length ;
36
+ return totalVerses [ verseIndex ] ;
37
+ }
38
+
39
+ // Get daily verse
40
+ app . get ( '/daily' , ( req , res ) => {
41
+ try {
42
+ const verse = getDailyVerse ( ) ;
43
+ res . json ( verse ) ;
44
+ } catch ( error ) {
45
+ res . status ( 500 ) . json ( { error : 'Error getting daily verse' } ) ;
46
+ }
47
+ } ) ;
48
+
49
+ // Get random verse
50
+ app . get ( '/random' , ( req , res ) => {
51
+ try {
52
+ const verse = getRandomVerse ( ) ;
53
+ res . json ( verse ) ;
54
+ } catch ( error ) {
55
+ res . status ( 500 ) . json ( { error : 'Error getting random verse' } ) ;
56
+ }
57
+ } ) ;
58
+
59
+ // Get specific verse by path
60
+ app . get ( '/:book/:chapter/:verse' , ( req , res ) => {
61
+ try {
62
+ const { book, chapter, verse } = req . params ;
63
+
64
+ // Handle special cases like "nephi2" -> "2 Nephi"
65
+ let bookName = book . toLowerCase ( ) ;
66
+ if ( bookName . includes ( 'nephi' ) ) {
67
+ if ( bookName === 'nephi2' || bookName === '2nephi' ) {
68
+ bookName = '2 Nephi' ;
69
+ } else if ( bookName === 'nephi3' || bookName === '3nephi' ) {
70
+ bookName = '3 Nephi' ;
71
+ } else if ( bookName === 'nephi4' || bookName === '4nephi' ) {
72
+ bookName = '4 Nephi' ;
73
+ } else {
74
+ bookName = '1 Nephi' ;
75
+ }
76
+ }
77
+
78
+ const foundBook = bokData . books . find ( b =>
79
+ b . book . toLowerCase ( ) === bookName ||
80
+ b . book . toLowerCase ( ) . replace ( / \s + / g, '' ) === bookName
81
+ ) ;
82
+
83
+ if ( ! foundBook ) {
84
+ return res . status ( 404 ) . json ( { error : 'Book not found' } ) ;
85
+ }
86
+
87
+ const foundChapter = foundBook . chapters . find ( c => c . chapter === parseInt ( chapter ) ) ;
88
+ if ( ! foundChapter ) {
89
+ return res . status ( 404 ) . json ( { error : 'Chapter not found' } ) ;
90
+ }
91
+
92
+ const foundVerse = foundChapter . verses . find ( v => v . verse === parseInt ( verse ) ) ;
93
+ if ( ! foundVerse ) {
94
+ return res . status ( 404 ) . json ( { error : 'Verse not found' } ) ;
95
+ }
96
+
97
+ res . json ( foundVerse ) ;
98
+ } catch ( error ) {
99
+ res . status ( 500 ) . json ( { error : 'Error getting verse' } ) ;
100
+ }
101
+ } ) ;
102
+
103
+ // Get all available books
104
+ app . get ( '/books' , ( req , res ) => {
105
+ try {
106
+ const books = bokData . books . map ( book => ( {
107
+ name : book . book ,
108
+ chapters : book . chapters . length
109
+ } ) ) ;
110
+ res . json ( books ) ;
111
+ } catch ( error ) {
112
+ res . status ( 500 ) . json ( { error : 'Error getting books' } ) ;
113
+ }
114
+ } ) ;
115
+
116
+ const PORT = process . env . PORT || 3000 ;
117
+ app . listen ( PORT , ( ) => {
118
+ console . log ( `Server is running on port ${ PORT } ` ) ;
119
+ } ) ;
0 commit comments