diff --git a/src/lib.rs b/src/lib.rs index 7ed69e6..b512299 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ pub mod app; mod common; mod components; mod pages; -mod utils; +pub mod utils; #[cfg(feature = "hydrate")] #[wasm_bindgen::prelude::wasm_bindgen] diff --git a/src/main.rs b/src/main.rs index 1d9b6f6..2900ec5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,7 +6,12 @@ async fn main() { use leptos::prelude::*; use leptos_axum::{LeptosRoutes, generate_route_list}; use scholarships_rs::app::*; + use scholarships_rs::utils::server::create_dynamo_client; + use std::sync::Arc; + let dynamo_client = create_dynamo_client().await; + let shared_client = Arc::new(dynamo_client); + let conf = get_configuration(None).unwrap(); let addr = conf.leptos_options.site_addr; let leptos_options = conf.leptos_options; @@ -14,10 +19,20 @@ async fn main() { let routes = generate_route_list(App); let app = Router::new() - .leptos_routes(&leptos_options, routes, { - let leptos_options = leptos_options.clone(); - move || shell(leptos_options.clone()) - }) + .leptos_routes_with_context( + &leptos_options, + routes, + { + let shared_client = Arc::clone(&shared_client); + move || { + provide_context(Arc::clone(&shared_client)); + } + }, + { + let leptos_options = leptos_options.clone(); + move || shell(leptos_options.clone()) + } + ) .fallback(leptos_axum::file_and_error_handler(shell)) .with_state(leptos_options); diff --git a/src/pages/api/dates.rs b/src/pages/api/dates.rs new file mode 100644 index 0000000..12d5cdf --- /dev/null +++ b/src/pages/api/dates.rs @@ -0,0 +1,75 @@ +use std::collections::HashMap; +use leptos::logging::log; +use leptos::prelude::*; +use crate::common::DateInfo; + +#[cfg(feature = "ssr")] +static DATES_TABLE: &str = "leptos-dates"; + +#[cfg(feature = "ssr")] +use aws_sdk_dynamodb::{ + types::{WriteRequest, PutRequest}, + Client as DynamoClient +}; + +#[cfg(feature = "ssr")] +use std::sync::Arc; + +#[server] +pub async fn create_dates(dates: Vec) -> Result<(), ServerFnError> { + // Serialize and put dates into the database. + let client = expect_context::>(); + + log!("Creating dates: {:?}", dates); + + let requests = dates + .into_iter() + .map(|date| { + let item = serde_dynamo::to_item(&date) + .unwrap_or_default(); + + let put_request = PutRequest::builder() + .set_item(Some(item)) + .build() + .expect("Couldn't build request, item is not present"); + + WriteRequest::builder().put_request(put_request).build() + }) + .collect::>(); + + let mut request_map = HashMap::new(); + request_map.insert(DATES_TABLE.to_string(), requests); + + client + .batch_write_item() + .set_request_items(Some(request_map)) + .send() + .await + .map(|_| ()) + .map_err(ServerFnError::from) +} + +#[server] +pub async fn get_important_dates() -> Result, ServerFnError> { + let client = expect_context::>(); + + client + .scan() + .table_name(DATES_TABLE) + .send() + .await + .map(|output| { + if let Some(items) = output.items { + items + .into_iter() + .filter_map(|item| { + serde_dynamo::from_item::<_, DateInfo>(item) + .ok() + }) + .collect::>() + } else { + Vec::new() + } + }) + .map_err(ServerFnError::from) +}