Table basics with some HTMX to allow data refresh

This commit is contained in:
2025-01-28 20:21:43 +01:00
parent acf7b5ab6b
commit 3c180625b2
8 changed files with 388 additions and 22 deletions

View File

@@ -17,6 +17,7 @@ use tower::{ServiceBuilder};
use tower_http::{
cors::{Any, CorsLayer},
trace::{TraceLayer, DefaultOnResponse},
services::ServeDir,
LatencyUnit
};
use tracing::{
@@ -96,7 +97,9 @@ async fn main() -> Result<()> {
.layer(tracelayer).layer(cors);
// Launch Web Server
let app = Router::new()
.nest_service("/assets", ServeDir::new("assets"))
.route("/", get(index))
.route("/feed/:id/", get(get_feed))
.layer(middlewares)
.with_state(context.clone());
// Run our app with hyper
@@ -104,32 +107,59 @@ async fn main() -> Result<()> {
.await.context(format!("Failed to bind Web Service on {}:{}", config.http_host, config.http_port))?;
info!("Listening on {}:{}", config.http_host, config.http_port);
axum::serve(listener, app).await.context("Failed to serve Web Service")?;
// let connection = &mut establish_connection();
// use self::schema::rss_feeds::dsl::*;
// let results = rss_feeds
// .limit(5)
// .select(RssFeed::as_select())
// .load(connection)
// .expect("Error loading posts");
//
// println!("Displaying {} posts", results.len());
// for rss_feed in results {
// println!("{}", rss_feed.name);
// println!("-----------\n");
// println!("{}", rss_feed.feed_url);
// }
Ok(())
}
#[derive(Template)]
#[template(path="feed.html")]
struct FeedTemplate {
feed: RssFeed
}
async fn get_feed(
State(ctx): State<AppContext>,
Path(feed_id): Path<i32>
) -> FeedTemplate {
let conn = ctx.pool.get().await.unwrap();
use self::schema::rss_feeds::dsl::*;
let result = conn.interact(move |conn| {
rss_feeds
.find(feed_id)
.select(RssFeed::as_select())
.first(conn)
.optional()
.expect("Error loading feeds")
}).await.unwrap();
if let Some(feed) = result {
FeedTemplate{ feed }
} else {
FeedTemplate{
feed: RssFeed{
id: -1,
name: "ERROR".to_string(),
feed_url: "ERROR".to_string(),
last_pub_date: Some("ERROR".to_string())
}
}
}
}
#[derive(Template)]
#[template(path = "index.html")]
struct HelloTemplate<'a> {
name: &'a str,
struct IndexTemplate {
feeds: Vec<RssFeed>,
}
async fn index(
State(ctx): State<AppContext>,
) -> HelloTemplate<'static> {
HelloTemplate { name: "world" }
) -> IndexTemplate {
let conn = ctx.pool.get().await.unwrap();
use self::schema::rss_feeds::dsl::*;
let result = conn.interact(|conn| {
rss_feeds
.select(RssFeed::as_select())
.load(conn)
.expect("Error loading feeds")
}).await.unwrap();
IndexTemplate { feeds: result }
}