2025-09-06 15:05:58 -04:00
|
|
|
// Remember that Server functions parameters must not be references.
|
|
|
|
|
// They are coming from potentially other computers.
|
|
|
|
|
|
|
|
|
|
#[cfg(feature = "server")]
|
2025-09-02 14:00:19 -04:00
|
|
|
use std::sync::Arc;
|
2025-09-06 15:05:58 -04:00
|
|
|
|
|
|
|
|
use dioxus::prelude::*;
|
|
|
|
|
|
|
|
|
|
#[cfg(feature = "server")]
|
|
|
|
|
use tokio::sync::OnceCell;
|
|
|
|
|
|
|
|
|
|
use tavern::{Adventurer, Lore, Tale};
|
|
|
|
|
|
|
|
|
|
#[cfg(feature = "server")]
|
|
|
|
|
use tavern::Database;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[cfg(feature = "server")]
|
|
|
|
|
static BLOG_DATABASE: OnceCell<Arc<Database>> = OnceCell::const_new();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[cfg(feature = "server")]
|
|
|
|
|
async fn get_database_instance() -> &'static Arc<Database>
|
|
|
|
|
{
|
|
|
|
|
BLOG_DATABASE.get_or_init(|| async {
|
|
|
|
|
let db = Database::open("tavern.db")
|
|
|
|
|
.await
|
|
|
|
|
.expect("Failed to open database");
|
|
|
|
|
Arc::new(db)
|
|
|
|
|
}).await
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-09-02 14:00:19 -04:00
|
|
|
|
|
|
|
|
#[server]
|
2025-09-06 15:05:58 -04:00
|
|
|
pub async fn get_blog_list(categories: Vec<String>) -> Result<Vec<Lore>, ServerFnError>
|
|
|
|
|
{
|
|
|
|
|
let db = get_database_instance().await;
|
2025-09-02 14:00:19 -04:00
|
|
|
|
2025-09-06 15:05:58 -04:00
|
|
|
let summaries = db.get_tales_summary(&categories).await
|
|
|
|
|
.map_err(|e| ServerFnError::new(e))?;
|
2025-09-02 14:00:19 -04:00
|
|
|
|
|
|
|
|
Ok(summaries)
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-06 15:05:58 -04:00
|
|
|
|
2025-09-02 14:00:19 -04:00
|
|
|
#[server]
|
2025-09-06 15:05:58 -04:00
|
|
|
pub async fn get_blog_post(slug: String) -> Result<Tale, ServerFnError>
|
|
|
|
|
{
|
|
|
|
|
let db = get_database_instance().await;
|
2025-09-02 14:00:19 -04:00
|
|
|
|
|
|
|
|
let tale = db.get_tale_by_slug(&slug).await
|
2025-09-06 15:05:58 -04:00
|
|
|
.map_err(|e| ServerFnError::new(e))?;
|
|
|
|
|
|
|
|
|
|
tale.ok_or(ServerFnError::new(format!("Post {} not found", slug)))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[server]
|
|
|
|
|
pub async fn get_author(handle: String) -> Result<Adventurer, ServerFnError>
|
|
|
|
|
{
|
|
|
|
|
let db = get_database_instance().await;
|
|
|
|
|
|
|
|
|
|
let author = db.get_adventurer(&handle).await
|
|
|
|
|
.map_err(|e| ServerFnError::new(e))?;
|
2025-09-02 14:00:19 -04:00
|
|
|
|
2025-09-06 15:05:58 -04:00
|
|
|
author.ok_or(ServerFnError::new(format!("Author {} not found.", handle)))
|
2025-09-02 14:00:19 -04:00
|
|
|
}
|