Refactor API and route functions to be asynchronous

- Updated all route handler functions in the API to be asynchronous by adding 'async' keyword.
- This change enhances performance and allows for better handling of concurrent requests.
- Adjusted related documentation comments to reflect the changes in function signatures.
This commit is contained in:
2025-11-30 02:41:53 -05:00
parent 6a5414a1c8
commit fb4e970567
7 changed files with 133 additions and 133 deletions
+34 -34
View File
@@ -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",
+1 -1
View File
@@ -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)
+9 -9
View File
@@ -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"
+78 -78
View File
@@ -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,
+4 -4
View File
@@ -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)
+2 -2
View File
@@ -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()
+5 -5
View File
@@ -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