diff --git a/kjvstudy_org/routes/api.py b/kjvstudy_org/routes/api.py index 041c23d..866b5aa 100644 --- a/kjvstudy_org/routes/api.py +++ b/kjvstudy_org/routes/api.py @@ -338,7 +338,7 @@ def init_templates(app_templates): @router.get("/") -def api_index(): +async def api_index(): """API index with links to documentation and available endpoints.""" return { "name": "KJV Study API", @@ -382,7 +382,7 @@ def api_index(): @router.get("/health") -def api_health_check(): +async def api_health_check(): """API health check endpoint for monitoring and status verification.""" return { "status": "healthy", @@ -392,7 +392,7 @@ def api_health_check(): @router.get("/search") -def search_api( +async def search_api( q: str = Query(..., description="Search query", example="faith"), limit: Optional[int] = Query(None, description="Max results", example=10) ): @@ -416,7 +416,7 @@ def search_api( @router.get("/universal-search") -def universal_search_api( +async def universal_search_api( q: str = Query(..., description="Search query", example="love"), limit: int = Query(5, description="Max results per category", example=5) ): @@ -612,7 +612,7 @@ def universal_search_api( summary="Get verse of the day", description="Returns a featured verse that changes daily" ) -def verse_of_the_day_api(): +async def verse_of_the_day_api(): """API endpoint for verse of the day.""" return get_daily_verse() @@ -667,7 +667,7 @@ def verse_of_the_day_api(): } } ) -def api_get_verse( +async def api_get_verse( book: str = Path(..., description="Book name (supports abbreviations)", example="John"), chapter: int = Path(..., description="Chapter number", example=3, ge=1), verse: int = Path(..., description="Verse number", example=16, ge=1), @@ -787,7 +787,7 @@ def api_get_verse( } } ) -def api_get_verse_range( +async def api_get_verse_range( book: str = Path(..., description="Book name (supports abbreviations)", example="Psalms"), chapter: int = Path(..., description="Chapter number", example=23, ge=1), start: int = Path(..., description="Starting verse number", example=1, ge=1), @@ -836,7 +836,7 @@ def api_get_verse_range( @router.get("/interlinear/{book}/{chapter}/{verse}") -def api_get_interlinear( +async def api_get_interlinear( book: str = Path(..., description="Book name", example="John"), chapter: int = Path(..., description="Chapter number", example=1), verse: int = Path(..., description="Verse number", example=1) @@ -884,7 +884,7 @@ def api_get_interlinear( @router.get("/books") -def api_get_books(): +async def api_get_books(): """Get list of all Bible books with metadata.""" books = bible.get_books() @@ -921,7 +921,7 @@ def api_get_books(): @router.get("/books/{book}") -def api_get_book(book: str = Path(..., description="Book name", example="Genesis")): +async def api_get_book(book: str = Path(..., description="Book name", example="Genesis")): """Get details about a specific book including introduction and study material.""" canonical_name = normalize_book_name(book) if canonical_name: @@ -1031,7 +1031,7 @@ async def api_book_pdf(book: str = Path(..., description="Book name", example="G @router.get("/books/{book}/chapters/{chapter}") -def api_get_chapter( +async def api_get_chapter( book: str = Path(..., description="Book name", example="Romans"), chapter: int = Path(..., description="Chapter number", example=8) ): @@ -1114,7 +1114,7 @@ async def api_chapter_pdf( @router.get("/books/{book}/text") -def api_get_book_text(book: str = Path(..., description="Book name", example="Philemon")): +async def api_get_book_text(book: str = Path(..., description="Book name", example="Philemon")): """Get all text content of a book.""" canonical_name = normalize_book_name(book) if canonical_name: @@ -1149,7 +1149,7 @@ def api_get_book_text(book: str = Path(..., description="Book name", example="Ph @router.get("/bible") -def api_get_bible(): +async def api_get_bible(): """Get the entire Bible text.""" books_data = {} for v in bible.iter_verses(): @@ -1186,7 +1186,7 @@ def api_get_bible(): @router.get("/cross-references/{book}/{chapter}/{verse}") -def api_get_cross_references( +async def api_get_cross_references( book: str = Path(..., description="Book name", example="John"), chapter: int = Path(..., description="Chapter number", example=3), verse: int = Path(..., description="Verse number", example=16) @@ -1212,7 +1212,7 @@ def api_get_cross_references( @router.get("/topics") -def api_get_topics(): +async def api_get_topics(): """Get list of all topics.""" topics = get_all_topics() @@ -1232,7 +1232,7 @@ def api_get_topics(): @router.get("/topics/{topic_name}") -def api_get_topic(topic_name: str = Path(..., description="Topic name", example="faith")): +async def api_get_topic(topic_name: str = Path(..., description="Topic name", example="faith")): """Get details about a specific topic.""" topic = get_topic(topic_name) if not topic: @@ -1247,7 +1247,7 @@ def api_get_topic(topic_name: str = Path(..., description="Topic name", example= @router.get("/reading-plans") -def api_get_reading_plans(): +async def api_get_reading_plans(): """Get list of all reading plans.""" plans = get_plan_summary() @@ -1258,7 +1258,7 @@ def api_get_reading_plans(): @router.get("/reading-plans/{plan_id}") -def api_get_reading_plan(plan_id: str = Path(..., description="Reading plan ID", example="chronological")): +async def api_get_reading_plan(plan_id: str = Path(..., description="Reading plan ID", example="chronological")): """Get details about a specific reading plan.""" plan = get_plan(plan_id) if not plan: @@ -1268,7 +1268,7 @@ def api_get_reading_plan(plan_id: str = Path(..., description="Reading plan ID", @router.get("/stories") -def api_get_stories(): +async def api_get_stories(): """Get list of all Bible stories organized by category.""" categories = get_categories() story_count = get_story_count() @@ -1306,7 +1306,7 @@ def api_get_stories(): @router.get("/stories/{slug}") -def api_get_story(slug: str = Path(..., description="Story slug", example="creation-of-the-world")): +async def api_get_story(slug: str = Path(..., description="Story slug", example="creation-of-the-world")): """Get a specific Bible story by slug.""" story = get_story_by_slug(slug) if not story: @@ -1411,7 +1411,7 @@ async def api_story_kids_pdf(slug: str = Path(..., description="Story slug")): summary="List all resource categories", description="Get a list of all biblical resource categories (locations, angels, prophets, etc.)" ) -def api_list_resource_categories(): +async def api_list_resource_categories(): """List all available resource categories.""" def format_title(key: str) -> str: """Convert snake_case to Title Case.""" @@ -1477,7 +1477,7 @@ def api_list_resource_categories(): } } ) -def api_get_resource_category( +async def api_get_resource_category( category: str = Path(..., description="Resource category name", example="biblical_locations") ): """Get all items in a specific resource category.""" @@ -1551,7 +1551,7 @@ def api_get_resource_category( } } ) -def api_get_resource_item( +async def api_get_resource_item( category: str = Path(..., description="Resource category name", example="biblical_locations"), slug: str = Path(..., description="Resource item slug", example="garden-of-eden") ): @@ -1708,7 +1708,7 @@ async def api_get_resource_item_pdf( summary="List all red letter verses", description="Get a list of all verses containing the words of Jesus Christ (red letter edition). Supports filtering by book and pagination." ) -def api_list_red_letter_verses( +async def api_list_red_letter_verses( book: Optional[str] = Query(None, description="Filter by book name", example="John"), limit: int = Query(50, description="Maximum number of verses to return", example=50, ge=1, le=500), offset: int = Query(0, description="Number of verses to skip", example=0, ge=0) @@ -1775,7 +1775,7 @@ def api_list_red_letter_verses( summary="Get red letter statistics", description="Get statistics about verses containing the words of Jesus Christ, including counts by book and full vs. partial verses." ) -def api_red_letter_stats(): +async def api_red_letter_stats(): """Get statistics about red letter verses in the Bible.""" red_letter_data = load_red_letter_verses() @@ -1815,7 +1815,7 @@ def api_red_letter_stats(): summary="Get a random verse", description="Returns a random Bible verse. Optionally filter by testament (ot/nt) or specific book." ) -def api_random_verse( +async def api_random_verse( testament: Optional[str] = Query(None, description="Filter by testament: 'ot' or 'nt'", example="nt"), book: Optional[str] = Query(None, description="Filter by book name", example="John") ): @@ -1884,7 +1884,7 @@ def api_random_verse( summary="Get verse commentary", description="Get AI-generated theological commentary for a specific verse, including analysis, historical context, and reflection questions." ) -def api_get_verse_commentary( +async def api_get_verse_commentary( book: str = Path(..., description="Book name", example="John"), chapter: int = Path(..., description="Chapter number", example=3), verse: int = Path(..., description="Verse number", example=16) @@ -1937,7 +1937,7 @@ def api_get_verse_commentary( summary="Get chapter commentary", description="Get a brief explanation of what a chapter contains and why it's significant." ) -def api_get_chapter_commentary( +async def api_get_chapter_commentary( book: str = Path(..., description="Book name", example="Genesis"), chapter: int = Path(..., description="Chapter number", example=1) ): @@ -1976,7 +1976,7 @@ def api_get_chapter_commentary( summary="Bulk verse lookup", description="Fetch multiple verses in a single request. Provide an array of verse references like ['John 3:16', 'Romans 8:28']." ) -def api_bulk_verse_lookup(request: BulkVerseRequest): +async def api_bulk_verse_lookup(request: BulkVerseRequest): """Look up multiple verses in a single request.""" from ..kjv import VerseReference @@ -2023,7 +2023,7 @@ def api_bulk_verse_lookup(request: BulkVerseRequest): summary="Get family tree statistics", description="Get comprehensive statistics about the biblical family tree from the GEDCOM genealogy data." ) -def api_family_tree_stats(): +async def api_family_tree_stats(): """Get statistics about the biblical family tree from GEDCOM data.""" from ..routes.family_tree import get_family_tree_data import re @@ -2204,7 +2204,7 @@ def api_family_tree_stats(): summary="List all biblical figures", description="Get a list of all people who have biographies in the family tree database." ) -def api_list_family_tree(): +async def api_list_family_tree(): """List all people with biographies.""" data = _load_biographies() biographies = data.get("biographies", {}) @@ -2223,7 +2223,7 @@ def api_list_family_tree(): summary="Get biography of biblical figure", description="Get detailed biography including summary, significance, and key life events for a specific biblical figure." ) -def api_get_biography( +async def api_get_biography( name: str = Path(..., description="Name of the person", example="Abraham") ): """Get biography of a specific person.""" @@ -2277,7 +2277,7 @@ def api_get_biography( 404: {"description": "Strong's number not found"} } ) -def api_get_strongs( +async def api_get_strongs( strongs_number: str = Path( ..., description="Strong's number (H1-H8674 for Hebrew, G1-G5624 for Greek)", @@ -2322,7 +2322,7 @@ def api_get_strongs( } } ) -def api_search_strongs( +async def api_search_strongs( q: str = Query(..., description="Search query", example="love"), language: str = Query( "both", diff --git a/kjvstudy_org/routes/commentary.py b/kjvstudy_org/routes/commentary.py index 3e2dd5b..d41b7a3 100644 --- a/kjvstudy_org/routes/commentary.py +++ b/kjvstudy_org/routes/commentary.py @@ -137,7 +137,7 @@ def get_verse_text(book, chapter, verse): @router.get("/commentary/{book}/{chapter}") -def commentary_redirect(book: str, chapter: int): +async def commentary_redirect(book: str, chapter: int): """Redirect old chapter commentary URLs to chapter page""" from fastapi.responses import RedirectResponse return RedirectResponse(url=f"/book/{book}/chapter/{chapter}", status_code=301) diff --git a/kjvstudy_org/routes/family_tree.py b/kjvstudy_org/routes/family_tree.py index ff4c447..214170f 100644 --- a/kjvstudy_org/routes/family_tree.py +++ b/kjvstudy_org/routes/family_tree.py @@ -370,7 +370,7 @@ def search_family_tree(query: str, limit: Optional[int] = None) -> List[Dict]: # ============================================================================ @router.get("/family-tree", response_class=HTMLResponse) -def family_tree_page(request: Request): +async def family_tree_page(request: Request): """Biblical family tree page using GEDCOM file.""" family_tree_data, generations = get_family_tree_data() @@ -404,7 +404,7 @@ def family_tree_page(request: Request): @router.get("/family-tree/generation/{gen_num}", response_class=HTMLResponse) -def family_tree_generation_page(request: Request, gen_num: int): +async def family_tree_generation_page(request: Request, gen_num: int): """Individual generation page.""" gedcom_path = get_static_dir() / "adameve.ged" @@ -455,7 +455,7 @@ def family_tree_generation_page(request: Request, gen_num: int): @router.get("/family-tree/person/{person_id}", response_class=HTMLResponse) -def family_tree_person_page(request: Request, person_id: str): +async def family_tree_person_page(request: Request, person_id: str): """Individual person page.""" from ..biblical_biographies import get_biography @@ -511,7 +511,7 @@ def family_tree_person_page(request: Request, person_id: str): @router.get("/family-tree/search", response_class=HTMLResponse) -def family_tree_search_page(request: Request, q: str = ""): +async def family_tree_search_page(request: Request, q: str = ""): """Search the family tree.""" gedcom_path = get_static_dir() / "adameve.ged" @@ -574,7 +574,7 @@ def family_tree_search_page(request: Request, q: str = ""): @router.get("/family-tree/interactive", response_class=HTMLResponse) -def family_tree_interactive_page(request: Request): +async def family_tree_interactive_page(request: Request): """Interactive D3.js-based family tree visualization.""" family_tree_data, generations = get_family_tree_data() @@ -601,7 +601,7 @@ def family_tree_interactive_page(request: Request): @router.get("/family-tree/lineage", response_class=HTMLResponse) -def family_tree_lineage_page(request: Request): +async def family_tree_lineage_page(request: Request): """Dedicated page for the Messianic lineage visualization.""" return templates.TemplateResponse( request, @@ -618,7 +618,7 @@ def family_tree_lineage_page(request: Request): @router.get("/family-tree/person/{person_id}/descendants", response_class=HTMLResponse) -def family_tree_descendants_page(request: Request, person_id: str): +async def family_tree_descendants_page(request: Request, person_id: str): """View all descendants of a person.""" family_tree_data, generations = get_family_tree_data() @@ -674,7 +674,7 @@ def family_tree_descendants_page(request: Request, person_id: str): @router.get("/family-tree/person/{person_id}/ancestors", response_class=HTMLResponse) -def family_tree_ancestors_page(request: Request, person_id: str): +async def family_tree_ancestors_page(request: Request, person_id: str): """View all ancestors of a person.""" family_tree_data, generations = get_family_tree_data() @@ -730,7 +730,7 @@ def family_tree_ancestors_page(request: Request, person_id: str): @router.get("/family-tree/lineage.svg") -def family_tree_lineage_svg(request: Request): +async def family_tree_lineage_svg(request: Request): """Generate SVG visualization of the Messianic lineage (Adam to Jesus).""" gedcom_path = get_static_dir() / "adameve.ged" diff --git a/kjvstudy_org/routes/resources.py b/kjvstudy_org/routes/resources.py index 282a4cf..3176c12 100644 --- a/kjvstudy_org/routes/resources.py +++ b/kjvstudy_org/routes/resources.py @@ -187,7 +187,7 @@ async def _resource_index_pdf_response(resource_data: dict, page_title: str, pag # BIBLICAL MAPS # ============================================================================ @router.get("/biblical-maps", response_class=HTMLResponse) -def biblical_maps_page(request: Request): +async def biblical_maps_page(request: Request): """Biblical maps page showing important biblical locations.""" return templates.TemplateResponse( request, @@ -208,7 +208,7 @@ def biblical_maps_page(request: Request): # BIBLICAL ANGELS # ============================================================================ @router.get("/biblical-angels", response_class=HTMLResponse) -def biblical_angels_page(request: Request): +async def biblical_angels_page(request: Request): """Biblical angels page exploring angels throughout Scripture.""" return templates.TemplateResponse( request, @@ -237,7 +237,7 @@ async def biblical_angels_page_pdf(): @router.get("/biblical-angels/{angel_slug}", response_class=HTMLResponse) -def angel_detail(request: Request, angel_slug: str): +async def angel_detail(request: Request, angel_slug: str): """Individual biblical angels detail page.""" return _resource_detail_response( request, @@ -265,7 +265,7 @@ async def angel_detail_pdf(angel_slug: str): # BIBLICAL PROPHETS # ============================================================================ @router.get("/biblical-prophets", response_class=HTMLResponse) -def biblical_prophets_page(request: Request): +async def biblical_prophets_page(request: Request): """Biblical prophets page exploring the prophetic ministry throughout Scripture.""" return templates.TemplateResponse( request, @@ -303,7 +303,7 @@ async def biblical_prophets_pdf(): @router.get("/biblical-prophets/{prophet_slug}", response_class=HTMLResponse) -def prophet_detail(request: Request, prophet_slug: str): +async def prophet_detail(request: Request, prophet_slug: str): """Individual biblical prophets detail page.""" return _resource_detail_response( request, @@ -331,7 +331,7 @@ async def prophet_detail_pdf(prophet_slug: str): # NAMES OF GOD # ============================================================================ @router.get("/names-of-god", response_class=HTMLResponse) -def names_of_god_page(request: Request): +async def names_of_god_page(request: Request): """Names of God page exploring divine names throughout Scripture.""" return templates.TemplateResponse( request, @@ -360,7 +360,7 @@ async def names_of_god_page_pdf(): @router.get("/names-of-god/{name_slug}", response_class=HTMLResponse) -def name_of_god_detail(request: Request, name_slug: str): +async def name_of_god_detail(request: Request, name_slug: str): """Individual name of God detail page.""" return _resource_detail_response( request, @@ -388,7 +388,7 @@ async def name_of_god_detail_pdf(name_slug: str): # PARABLES # ============================================================================ @router.get("/parables", response_class=HTMLResponse) -def parables_page(request: Request): +async def parables_page(request: Request): """Parables of Jesus page.""" return templates.TemplateResponse( request, @@ -426,7 +426,7 @@ async def parables_pdf(): @router.get("/parables/{parable_slug}", response_class=HTMLResponse) -def parable_detail(request: Request, parable_slug: str): +async def parable_detail(request: Request, parable_slug: str): """Individual parable detail page.""" return _resource_detail_response( request, @@ -454,7 +454,7 @@ async def parable_detail_pdf(parable_slug: str): # BIBLICAL COVENANTS # ============================================================================ @router.get("/biblical-covenants", response_class=HTMLResponse) -def biblical_covenants_page(request: Request): +async def biblical_covenants_page(request: Request): """Biblical covenants page.""" return templates.TemplateResponse( request, @@ -483,7 +483,7 @@ async def biblical_covenants_page_pdf(): @router.get("/biblical-covenants/{covenant_slug}", response_class=HTMLResponse) -def covenant_detail(request: Request, covenant_slug: str): +async def covenant_detail(request: Request, covenant_slug: str): """Individual covenant detail page.""" return _resource_detail_response( request, @@ -511,7 +511,7 @@ async def covenant_detail_pdf(covenant_slug: str): # THE TWELVE APOSTLES # ============================================================================ @router.get("/the-twelve-apostles", response_class=HTMLResponse) -def apostles_page(request: Request): +async def apostles_page(request: Request): """The Twelve Apostles page.""" return templates.TemplateResponse( request, @@ -549,7 +549,7 @@ async def apostles_page_pdf(): @router.get("/the-twelve-apostles/{apostle_slug}", response_class=HTMLResponse) -def apostle_detail(request: Request, apostle_slug: str): +async def apostle_detail(request: Request, apostle_slug: str): """Individual apostle detail page.""" return _resource_detail_response( request, @@ -577,7 +577,7 @@ async def apostle_detail_pdf(apostle_slug: str): # WOMEN OF THE BIBLE # ============================================================================ @router.get("/women-of-the-bible", response_class=HTMLResponse) -def women_of_the_bible_page(request: Request): +async def women_of_the_bible_page(request: Request): """Women of the Bible page.""" return templates.TemplateResponse( request, @@ -606,7 +606,7 @@ async def women_of_the_bible_page_pdf(): @router.get("/women-of-the-bible/{woman_slug}", response_class=HTMLResponse) -def woman_detail(request: Request, woman_slug: str): +async def woman_detail(request: Request, woman_slug: str): """Individual woman of the Bible detail page.""" return _resource_detail_response( request, @@ -634,7 +634,7 @@ async def woman_detail_pdf(woman_slug: str): # BIBLICAL FESTIVALS # ============================================================================ @router.get("/biblical-festivals", response_class=HTMLResponse) -def biblical_festivals_page(request: Request): +async def biblical_festivals_page(request: Request): """Biblical festivals page.""" return templates.TemplateResponse( request, @@ -663,7 +663,7 @@ async def biblical_festivals_page_pdf(): @router.get("/biblical-festivals/{festival_slug}", response_class=HTMLResponse) -def festival_detail(request: Request, festival_slug: str): +async def festival_detail(request: Request, festival_slug: str): """Individual biblical festival detail page.""" return _resource_detail_response( request, @@ -691,7 +691,7 @@ async def festival_detail_pdf(festival_slug: str): # FRUITS OF THE SPIRIT # ============================================================================ @router.get("/fruits-of-the-spirit", response_class=HTMLResponse) -def fruits_of_the_spirit_page(request: Request): +async def fruits_of_the_spirit_page(request: Request): """Fruits of the Spirit page.""" return templates.TemplateResponse( request, @@ -720,7 +720,7 @@ async def fruits_of_the_spirit_page_pdf(): @router.get("/fruits-of-the-spirit/{fruit_slug}", response_class=HTMLResponse) -def fruit_detail(request: Request, fruit_slug: str): +async def fruit_detail(request: Request, fruit_slug: str): """Individual fruit of the Spirit detail page.""" return _resource_detail_response( request, @@ -790,7 +790,7 @@ TETRAGRAMMATON_CONTENT = { @router.get("/tetragrammaton", response_class=HTMLResponse) -def tetragrammaton_page(request: Request): +async def tetragrammaton_page(request: Request): """The sacred Tetragrammaton - YHWH.""" return templates.TemplateResponse( request, @@ -831,7 +831,7 @@ async def tetragrammaton_pdf(): # MIRACLES OF JESUS # ============================================================================ @router.get("/miracles-of-jesus", response_class=HTMLResponse) -def miracles_page(request: Request): +async def miracles_page(request: Request): """Miracles of Jesus page.""" return templates.TemplateResponse( request, @@ -864,7 +864,7 @@ async def miracles_page_pdf(): @router.get("/miracles-of-jesus/{miracle_slug}", response_class=HTMLResponse) -def miracle_detail(request: Request, miracle_slug: str): +async def miracle_detail(request: Request, miracle_slug: str): """Individual miracle detail page.""" return _resource_detail_response( request, @@ -892,7 +892,7 @@ async def miracle_detail_pdf(miracle_slug: str): # PRAYERS OF THE BIBLE # ============================================================================ @router.get("/prayers-of-the-bible", response_class=HTMLResponse) -def prayers_page(request: Request): +async def prayers_page(request: Request): """Prayers of the Bible page.""" return templates.TemplateResponse( request, @@ -925,7 +925,7 @@ async def prayers_page_pdf(): @router.get("/prayers-of-the-bible/{prayer_slug}", response_class=HTMLResponse) -def prayer_detail(request: Request, prayer_slug: str): +async def prayer_detail(request: Request, prayer_slug: str): """Individual prayer detail page.""" return _resource_detail_response( request, @@ -953,7 +953,7 @@ async def prayer_detail_pdf(prayer_slug: str): # THE BEATITUDES # ============================================================================ @router.get("/beatitudes", response_class=HTMLResponse) -def beatitudes_page(request: Request): +async def beatitudes_page(request: Request): """The Beatitudes page.""" return templates.TemplateResponse( request, @@ -986,7 +986,7 @@ async def beatitudes_page_pdf(): @router.get("/beatitudes/{beatitude_slug}", response_class=HTMLResponse) -def beatitude_detail(request: Request, beatitude_slug: str): +async def beatitude_detail(request: Request, beatitude_slug: str): """Individual beatitude detail page.""" return _resource_detail_response( request, @@ -1014,7 +1014,7 @@ async def beatitude_detail_pdf(beatitude_slug: str): # THE TEN COMMANDMENTS # ============================================================================ @router.get("/ten-commandments", response_class=HTMLResponse) -def ten_commandments_page(request: Request): +async def ten_commandments_page(request: Request): """The Ten Commandments page.""" return templates.TemplateResponse( request, @@ -1047,7 +1047,7 @@ async def ten_commandments_page_pdf(): @router.get("/ten-commandments/{commandment_slug}", response_class=HTMLResponse) -def commandment_detail(request: Request, commandment_slug: str): +async def commandment_detail(request: Request, commandment_slug: str): """Individual commandment detail page.""" return _resource_detail_response( request, @@ -1075,7 +1075,7 @@ async def commandment_detail_pdf(commandment_slug: str): # THE ARMOR OF GOD # ============================================================================ @router.get("/armor-of-god", response_class=HTMLResponse) -def armor_of_god_page(request: Request): +async def armor_of_god_page(request: Request): """The Armor of God page.""" return templates.TemplateResponse( request, @@ -1108,7 +1108,7 @@ async def armor_of_god_page_pdf(): @router.get("/armor-of-god/{armor_slug}", response_class=HTMLResponse) -def armor_detail(request: Request, armor_slug: str): +async def armor_detail(request: Request, armor_slug: str): """Individual armor piece detail page.""" return _resource_detail_response( request, @@ -1136,7 +1136,7 @@ async def armor_detail_pdf(armor_slug: str): # I AM STATEMENTS OF JESUS # ============================================================================ @router.get("/i-am-statements", response_class=HTMLResponse) -def i_am_statements_page(request: Request): +async def i_am_statements_page(request: Request): """I Am Statements of Jesus page.""" return templates.TemplateResponse( request, @@ -1169,7 +1169,7 @@ async def i_am_statements_page_pdf(): @router.get("/i-am-statements/{statement_slug}", response_class=HTMLResponse) -def i_am_statement_detail(request: Request, statement_slug: str): +async def i_am_statement_detail(request: Request, statement_slug: str): """Individual I Am statement detail page.""" return _resource_detail_response( request, @@ -1197,7 +1197,7 @@ async def i_am_statement_detail_pdf(statement_slug: str): # THE TRINITY # ============================================================================ @router.get("/trinity", response_class=HTMLResponse) -def trinity_page(request: Request): +async def trinity_page(request: Request): """The Trinity - doctrine of God page.""" return templates.TemplateResponse( request, @@ -1230,7 +1230,7 @@ async def trinity_page_pdf(): @router.get("/trinity/{item_slug}", response_class=HTMLResponse) -def trinity_detail(request: Request, item_slug: str): +async def trinity_detail(request: Request, item_slug: str): """Individual Trinity topic detail page.""" return _resource_detail_response( request, @@ -1258,7 +1258,7 @@ async def trinity_detail_pdf(item_slug: str): # CHRISTOLOGY # ============================================================================ @router.get("/christology", response_class=HTMLResponse) -def christology_page(request: Request): +async def christology_page(request: Request): """Christology - the doctrine of Christ page.""" return templates.TemplateResponse( request, @@ -1291,7 +1291,7 @@ async def christology_page_pdf(): @router.get("/christology/{item_slug}", response_class=HTMLResponse) -def christology_detail(request: Request, item_slug: str): +async def christology_detail(request: Request, item_slug: str): """Individual Christology topic detail page.""" return _resource_detail_response( request, @@ -1319,7 +1319,7 @@ async def christology_detail_pdf(item_slug: str): # SOTERIOLOGY # ============================================================================ @router.get("/soteriology", response_class=HTMLResponse) -def soteriology_page(request: Request): +async def soteriology_page(request: Request): """Soteriology - the doctrine of salvation page.""" return templates.TemplateResponse( request, @@ -1352,7 +1352,7 @@ async def soteriology_page_pdf(): @router.get("/soteriology/{item_slug}", response_class=HTMLResponse) -def soteriology_detail(request: Request, item_slug: str): +async def soteriology_detail(request: Request, item_slug: str): """Individual Soteriology topic detail page.""" return _resource_detail_response( request, @@ -1380,7 +1380,7 @@ async def soteriology_detail_pdf(item_slug: str): # PNEUMATOLOGY # ============================================================================ @router.get("/pneumatology", response_class=HTMLResponse) -def pneumatology_page(request: Request): +async def pneumatology_page(request: Request): """Pneumatology - the doctrine of the Holy Spirit page.""" return templates.TemplateResponse( request, @@ -1413,7 +1413,7 @@ async def pneumatology_page_pdf(): @router.get("/pneumatology/{item_slug}", response_class=HTMLResponse) -def pneumatology_detail(request: Request, item_slug: str): +async def pneumatology_detail(request: Request, item_slug: str): """Individual Pneumatology topic detail page.""" return _resource_detail_response( request, @@ -1441,7 +1441,7 @@ async def pneumatology_detail_pdf(item_slug: str): # ESCHATOLOGY # ============================================================================ @router.get("/eschatology", response_class=HTMLResponse) -def eschatology_page(request: Request): +async def eschatology_page(request: Request): """Eschatology - the doctrine of last things page.""" return templates.TemplateResponse( request, @@ -1474,7 +1474,7 @@ async def eschatology_page_pdf(): @router.get("/eschatology/{item_slug}", response_class=HTMLResponse) -def eschatology_detail(request: Request, item_slug: str): +async def eschatology_detail(request: Request, item_slug: str): """Individual Eschatology topic detail page.""" return _resource_detail_response( request, @@ -1502,7 +1502,7 @@ async def eschatology_detail_pdf(item_slug: str): # ECCLESIOLOGY # ============================================================================ @router.get("/ecclesiology", response_class=HTMLResponse) -def ecclesiology_page(request: Request): +async def ecclesiology_page(request: Request): """Ecclesiology - the doctrine of the church page.""" return templates.TemplateResponse( request, @@ -1535,7 +1535,7 @@ async def ecclesiology_page_pdf(): @router.get("/ecclesiology/{item_slug}", response_class=HTMLResponse) -def ecclesiology_detail(request: Request, item_slug: str): +async def ecclesiology_detail(request: Request, item_slug: str): """Individual Ecclesiology topic detail page.""" return _resource_detail_response( request, @@ -1563,7 +1563,7 @@ async def ecclesiology_detail_pdf(item_slug: str): # TYPES AND SHADOWS OF CHRIST # ============================================================================ @router.get("/types-and-shadows", response_class=HTMLResponse) -def types_and_shadows_page(request: Request): +async def types_and_shadows_page(request: Request): """Types and Shadows of Christ page.""" return templates.TemplateResponse( request, @@ -1596,7 +1596,7 @@ async def types_and_shadows_page_pdf(): @router.get("/types-and-shadows/{item_slug}", response_class=HTMLResponse) -def types_and_shadows_detail(request: Request, item_slug: str): +async def types_and_shadows_detail(request: Request, item_slug: str): """Individual Types and Shadows topic detail page.""" return _resource_detail_response( request, @@ -1624,7 +1624,7 @@ async def types_and_shadows_detail_pdf(item_slug: str): # MESSIANIC PROPHECIES # ============================================================================ @router.get("/messianic-prophecies", response_class=HTMLResponse) -def messianic_prophecies_page(request: Request): +async def messianic_prophecies_page(request: Request): """Messianic Prophecies page.""" return templates.TemplateResponse( request, @@ -1657,7 +1657,7 @@ async def messianic_prophecies_page_pdf(): @router.get("/messianic-prophecies/{item_slug}", response_class=HTMLResponse) -def messianic_prophecies_detail(request: Request, item_slug: str): +async def messianic_prophecies_detail(request: Request, item_slug: str): """Individual Messianic Prophecy topic detail page.""" return _resource_detail_response( request, @@ -1685,7 +1685,7 @@ async def messianic_prophecies_detail_pdf(item_slug: str): # THE BLOOD IN SCRIPTURE # ============================================================================ @router.get("/blood-in-scripture", response_class=HTMLResponse) -def blood_in_scripture_page(request: Request): +async def blood_in_scripture_page(request: Request): """The Blood in Scripture page.""" return templates.TemplateResponse( request, @@ -1718,7 +1718,7 @@ async def blood_in_scripture_page_pdf(): @router.get("/blood-in-scripture/{item_slug}", response_class=HTMLResponse) -def blood_in_scripture_detail(request: Request, item_slug: str): +async def blood_in_scripture_detail(request: Request, item_slug: str): """Individual Blood in Scripture topic detail page.""" return _resource_detail_response( request, @@ -1746,7 +1746,7 @@ async def blood_in_scripture_detail_pdf(item_slug: str): # THE KINGDOM OF GOD # ============================================================================ @router.get("/kingdom-of-god", response_class=HTMLResponse) -def kingdom_of_god_page(request: Request): +async def kingdom_of_god_page(request: Request): """The Kingdom of God page.""" return templates.TemplateResponse( request, @@ -1779,7 +1779,7 @@ async def kingdom_of_god_page_pdf(): @router.get("/kingdom-of-god/{item_slug}", response_class=HTMLResponse) -def kingdom_of_god_detail(request: Request, item_slug: str): +async def kingdom_of_god_detail(request: Request, item_slug: str): """Individual Kingdom of God topic detail page.""" return _resource_detail_response( request, @@ -1807,7 +1807,7 @@ async def kingdom_of_god_detail_pdf(item_slug: str): # NAMES AND TITLES OF CHRIST # ============================================================================ @router.get("/names-of-christ", response_class=HTMLResponse) -def names_of_christ_page(request: Request): +async def names_of_christ_page(request: Request): """Names and Titles of Christ page.""" return templates.TemplateResponse( request, @@ -1840,7 +1840,7 @@ async def names_of_christ_page_pdf(): @router.get("/names-of-christ/{item_slug}", response_class=HTMLResponse) -def names_of_christ_detail(request: Request, item_slug: str): +async def names_of_christ_detail(request: Request, item_slug: str): """Individual Names of Christ topic detail page.""" return _resource_detail_response( request, @@ -1868,7 +1868,7 @@ async def names_of_christ_detail_pdf(item_slug: str): # SPIRITS AND DEMONS # ============================================================================ @router.get("/spirits-and-demons", response_class=HTMLResponse) -def spirits_and_demons_page(request: Request): +async def spirits_and_demons_page(request: Request): """Spirits and Demons - biblical demonology page.""" return templates.TemplateResponse( request, @@ -1901,7 +1901,7 @@ async def spirits_and_demons_page_pdf(): @router.get("/spirits-and-demons/{item_slug}", response_class=HTMLResponse) -def spirits_and_demons_detail(request: Request, item_slug: str): +async def spirits_and_demons_detail(request: Request, item_slug: str): """Individual Spirits and Demons topic detail page.""" return _resource_detail_response( request, @@ -1929,7 +1929,7 @@ async def spirits_and_demons_detail_pdf(item_slug: str): # PERSONIFICATIONS IN SCRIPTURE # ============================================================================ @router.get("/personifications", response_class=HTMLResponse) -def personifications_page(request: Request): +async def personifications_page(request: Request): """Personifications in Scripture - abstract concepts given human form.""" return templates.TemplateResponse( request, @@ -1962,7 +1962,7 @@ async def personifications_page_pdf(): @router.get("/personifications/{item_slug}", response_class=HTMLResponse) -def personifications_detail(request: Request, item_slug: str): +async def personifications_detail(request: Request, item_slug: str): """Individual Personification topic detail page.""" return _resource_detail_response( request, @@ -1990,7 +1990,7 @@ async def personifications_detail_pdf(item_slug: str): # BIBLIOLOGY - THE DOCTRINE OF SCRIPTURE # ============================================================================ @router.get("/bibliology", response_class=HTMLResponse) -def bibliology_page(request: Request): +async def bibliology_page(request: Request): """Bibliology - The Doctrine of Scripture.""" return templates.TemplateResponse( request, @@ -2023,7 +2023,7 @@ async def bibliology_page_pdf(): @router.get("/bibliology/{item_slug}", response_class=HTMLResponse) -def bibliology_detail(request: Request, item_slug: str): +async def bibliology_detail(request: Request, item_slug: str): """Individual Bibliology topic detail page.""" return _resource_detail_response( request, @@ -2051,7 +2051,7 @@ async def bibliology_detail_pdf(item_slug: str): # THEOLOGY PROPER - THE ATTRIBUTES OF GOD # ============================================================================ @router.get("/theology-proper", response_class=HTMLResponse) -def theology_proper_page(request: Request): +async def theology_proper_page(request: Request): """Theology Proper - The Attributes of God.""" return templates.TemplateResponse( request, @@ -2084,7 +2084,7 @@ async def theology_proper_page_pdf(): @router.get("/theology-proper/{item_slug}", response_class=HTMLResponse) -def theology_proper_detail(request: Request, item_slug: str): +async def theology_proper_detail(request: Request, item_slug: str): """Individual Theology Proper topic detail page.""" return _resource_detail_response( request, @@ -2112,7 +2112,7 @@ async def theology_proper_detail_pdf(item_slug: str): # ANTHROPOLOGY - THE DOCTRINE OF MAN # ============================================================================ @router.get("/anthropology", response_class=HTMLResponse) -def anthropology_page(request: Request): +async def anthropology_page(request: Request): """Anthropology - The Doctrine of Man.""" return templates.TemplateResponse( request, @@ -2145,7 +2145,7 @@ async def anthropology_page_pdf(): @router.get("/anthropology/{item_slug}", response_class=HTMLResponse) -def anthropology_detail(request: Request, item_slug: str): +async def anthropology_detail(request: Request, item_slug: str): """Individual Anthropology topic detail page.""" return _resource_detail_response( request, @@ -2173,7 +2173,7 @@ async def anthropology_detail_pdf(item_slug: str): # HAMARTIOLOGY - THE DOCTRINE OF SIN # ============================================================================ @router.get("/hamartiology", response_class=HTMLResponse) -def hamartiology_page(request: Request): +async def hamartiology_page(request: Request): """Hamartiology - The Doctrine of Sin.""" return templates.TemplateResponse( request, @@ -2206,7 +2206,7 @@ async def hamartiology_page_pdf(): @router.get("/hamartiology/{item_slug}", response_class=HTMLResponse) -def hamartiology_detail(request: Request, item_slug: str): +async def hamartiology_detail(request: Request, item_slug: str): """Individual Hamartiology topic detail page.""" return _resource_detail_response( request, @@ -2234,7 +2234,7 @@ async def hamartiology_detail_pdf(item_slug: str): # PROVIDENCE - DIVINE PROVIDENCE # ============================================================================ @router.get("/providence", response_class=HTMLResponse) -def providence_page(request: Request): +async def providence_page(request: Request): """Providence - Divine Providence.""" return templates.TemplateResponse( request, @@ -2267,7 +2267,7 @@ async def providence_page_pdf(): @router.get("/providence/{item_slug}", response_class=HTMLResponse) -def providence_detail(request: Request, item_slug: str): +async def providence_detail(request: Request, item_slug: str): """Individual Providence topic detail page.""" return _resource_detail_response( request, @@ -2295,7 +2295,7 @@ async def providence_detail_pdf(item_slug: str): # GRACE - THE DOCTRINE OF GRACE # ============================================================================ @router.get("/grace", response_class=HTMLResponse) -def grace_page(request: Request): +async def grace_page(request: Request): """Grace - The Doctrine of Grace.""" return templates.TemplateResponse( request, @@ -2328,7 +2328,7 @@ async def grace_page_pdf(): @router.get("/grace/{item_slug}", response_class=HTMLResponse) -def grace_detail(request: Request, item_slug: str): +async def grace_detail(request: Request, item_slug: str): """Individual Grace topic detail page.""" return _resource_detail_response( request, @@ -2356,7 +2356,7 @@ async def grace_detail_pdf(item_slug: str): # JUSTIFICATION - THE DOCTRINE OF JUSTIFICATION # ============================================================================ @router.get("/justification", response_class=HTMLResponse) -def justification_page(request: Request): +async def justification_page(request: Request): """Justification - The Doctrine of Justification.""" return templates.TemplateResponse( request, @@ -2389,7 +2389,7 @@ async def justification_page_pdf(): @router.get("/justification/{item_slug}", response_class=HTMLResponse) -def justification_detail(request: Request, item_slug: str): +async def justification_detail(request: Request, item_slug: str): """Individual Justification topic detail page.""" return _resource_detail_response( request, @@ -2417,7 +2417,7 @@ async def justification_detail_pdf(item_slug: str): # SANCTIFICATION - THE DOCTRINE OF SANCTIFICATION # ============================================================================ @router.get("/sanctification", response_class=HTMLResponse) -def sanctification_page(request: Request): +async def sanctification_page(request: Request): """Sanctification - The Doctrine of Sanctification.""" return templates.TemplateResponse( request, @@ -2450,7 +2450,7 @@ async def sanctification_page_pdf(): @router.get("/sanctification/{item_slug}", response_class=HTMLResponse) -def sanctification_detail(request: Request, item_slug: str): +async def sanctification_detail(request: Request, item_slug: str): """Individual Sanctification topic detail page.""" return _resource_detail_response( request, @@ -2478,7 +2478,7 @@ async def sanctification_detail_pdf(item_slug: str): # LAW AND GOSPEL # ============================================================================ @router.get("/law-and-gospel", response_class=HTMLResponse) -def law_and_gospel_page(request: Request): +async def law_and_gospel_page(request: Request): """Law and Gospel - The Doctrine of Law and Gospel.""" return templates.TemplateResponse( request, @@ -2511,7 +2511,7 @@ async def law_and_gospel_page_pdf(): @router.get("/law-and-gospel/{item_slug}", response_class=HTMLResponse) -def law_and_gospel_detail(request: Request, item_slug: str): +async def law_and_gospel_detail(request: Request, item_slug: str): """Individual Law and Gospel topic detail page.""" return _resource_detail_response( request, @@ -2539,7 +2539,7 @@ async def law_and_gospel_detail_pdf(item_slug: str): # WORSHIP - THE DOCTRINE OF WORSHIP # ============================================================================ @router.get("/worship", response_class=HTMLResponse) -def worship_page(request: Request): +async def worship_page(request: Request): """Worship - The Doctrine of Worship.""" return templates.TemplateResponse( request, @@ -2572,7 +2572,7 @@ async def worship_page_pdf(): @router.get("/worship/{item_slug}", response_class=HTMLResponse) -def worship_detail(request: Request, item_slug: str): +async def worship_detail(request: Request, item_slug: str): """Individual Worship topic detail page.""" return _resource_detail_response( request, diff --git a/kjvstudy_org/routes/stories.py b/kjvstudy_org/routes/stories.py index e06d1ca..0f22a53 100644 --- a/kjvstudy_org/routes/stories.py +++ b/kjvstudy_org/routes/stories.py @@ -31,7 +31,7 @@ def get_books(): @router.get("/stories", response_class=HTMLResponse) -def stories_index(request: Request): +async def stories_index(request: Request): """Bible stories index page - shows all categories and stories.""" books = get_books() categories = get_categories() @@ -55,7 +55,7 @@ def stories_index(request: Request): @router.get("/stories/kids", response_class=HTMLResponse) -def stories_kids_index(request: Request): +async def stories_kids_index(request: Request): """Bible stories index page for kids - shows all categories and kid-friendly stories.""" books = get_books() categories = get_categories() @@ -141,7 +141,7 @@ async def story_kids_pdf(request: Request, slug: str): @router.get("/stories/{slug}", response_class=HTMLResponse) -def story_detail(request: Request, slug: str): +async def story_detail(request: Request, slug: str): """Individual story page (adult version).""" books = get_books() story = get_story_by_slug(slug) @@ -181,7 +181,7 @@ def story_detail(request: Request, slug: str): @router.get("/stories/{slug}/kids", response_class=HTMLResponse) -def story_kids(request: Request, slug: str): +async def story_kids(request: Request, slug: str): """Individual story page (kids version).""" books = get_books() story = get_story_by_slug(slug) diff --git a/kjvstudy_org/routes/study_guides.py b/kjvstudy_org/routes/study_guides.py index 42dc749..261afc4 100644 --- a/kjvstudy_org/routes/study_guides.py +++ b/kjvstudy_org/routes/study_guides.py @@ -126,7 +126,7 @@ def _attach_verse_texts(guide: dict): @router.get("/study-guides", response_class=HTMLResponse) -def study_guides_page(request: Request): +async def study_guides_page(request: Request): """Study guides main page""" books = get_books() @@ -154,7 +154,7 @@ def study_guides_page(request: Request): ) @router.get("/study-guides/{slug}", response_class=HTMLResponse) -def study_guide_detail(request: Request, slug: str): +async def study_guide_detail(request: Request, slug: str): """Individual study guide page""" books = get_books() diff --git a/kjvstudy_org/routes/utility.py b/kjvstudy_org/routes/utility.py index 95a11cd..1ecfba4 100644 --- a/kjvstudy_org/routes/utility.py +++ b/kjvstudy_org/routes/utility.py @@ -38,13 +38,13 @@ STUDY_GUIDE_SLUGS = _slugs["study_guides"] @router.get("/health") -def health_check(): +async def health_check(): """Health check endpoint for monitoring""" return {"status": "healthy", "service": "kjv-study"} @router.get("/robots.txt", response_class=Response) -def robots_txt(): +async def robots_txt(): """Generate robots.txt for search engine crawlers""" robots_content = """User-agent: * Allow: / @@ -60,7 +60,7 @@ Crawl-delay: 1 @router.get("/sitemap.xml", response_class=Response) -def sitemap_index(): +async def sitemap_index(): """Sitemap index - references main sitemap and static verse sitemap""" base_url = "https://kjvstudy.org" current_date = datetime.now().strftime("%Y-%m-%d") @@ -81,7 +81,7 @@ def sitemap_index(): @router.get("/sitemap-verses.xml") -def sitemap_verses(): +async def sitemap_verses(): """Serve static verse sitemap (31,102 verses, generated once)""" # Check if file exists if not _VERSE_SITEMAP_PATH.exists(): @@ -102,7 +102,7 @@ def sitemap_verses(): @router.get("/sitemap-main.xml", response_class=Response) -def sitemap_main(): +async def sitemap_main(): """Generate main sitemap with all dynamic URLs (cached daily)""" global _sitemap_cache, _sitemap_cache_date