church-api/src/services/bible_verses.rs
Benjamin Slingo 6bee94c311 Apply DRY/KISS: Replace db wrapper layer with shared SQL functions
- Create sql:: module with raw SQL queries (no business logic)
- Services now call sql:: functions + handle conversion logic only
- Eliminate SQL duplication across V1/V2 service methods
- Remove redundant db:: wrapper functions for bulletins, bible_verses, schedule
- Clean Handler → Service → Shared SQL → DB architecture
- Maintain API compatibility, zero downtime
2025-08-29 09:02:05 -04:00

65 lines
2.3 KiB
Rust

use sqlx::PgPool;
use crate::{
sql::bible_verses as sql,
models::{BibleVerse, BibleVerseV2},
error::Result,
utils::converters::{convert_bible_verses_to_v1, convert_bible_verse_to_v1, convert_bible_verses_to_v2, convert_bible_verse_to_v2},
};
/// Bible verse business logic service
/// Contains all bible verse-related business logic, keeping handlers thin and focused on HTTP concerns
pub struct BibleVerseService;
impl BibleVerseService {
/// Get random bible verse with V1 format (EST timezone)
pub async fn get_random_v1(pool: &PgPool) -> Result<Option<BibleVerse>> {
let verse = sql::get_random(pool).await?;
match verse {
Some(v) => {
let converted = convert_bible_verse_to_v1(v)?;
Ok(Some(converted))
},
None => Ok(None),
}
}
/// List all active bible verses with V1 format (EST timezone)
pub async fn list_v1(pool: &PgPool) -> Result<Vec<BibleVerse>> {
let verses = sql::list_active(pool).await?;
convert_bible_verses_to_v1(verses)
}
/// Search bible verses with V1 format (EST timezone)
pub async fn search_v1(pool: &PgPool, query: &str) -> Result<Vec<BibleVerse>> {
let verses = sql::search(pool, query, 100).await?;
convert_bible_verses_to_v1(verses)
}
// V2 API methods (UTC timezone as per shared converter)
/// Get random bible verse with V2 format (UTC timestamps)
pub async fn get_random_v2(pool: &PgPool) -> Result<Option<BibleVerseV2>> {
let verse = sql::get_random(pool).await?;
match verse {
Some(v) => {
let converted = convert_bible_verse_to_v2(v)?;
Ok(Some(converted))
},
None => Ok(None),
}
}
/// List all active bible verses with V2 format (UTC timestamps)
pub async fn list_v2(pool: &PgPool) -> Result<Vec<BibleVerseV2>> {
let verses = sql::list_active(pool).await?;
convert_bible_verses_to_v2(verses)
}
/// Search bible verses with V2 format (UTC timestamps)
pub async fn search_v2(pool: &PgPool, query: &str) -> Result<Vec<BibleVerseV2>> {
let verses = sql::search(pool, query, 100).await?;
convert_bible_verses_to_v2(verses)
}
}