use askama::Template; use askama_axum::{IntoResponse, Response}; use axum::{ extract::State, response::{Html, Json, Redirect}, Extension, }; use http::StatusCode; use sqlx::SqlitePool; use crate::{ middlewares::is_authorized, user::{get_user_roles_display, UserData}, }; struct HtmlTemplate(T); impl IntoResponse for HtmlTemplate where T: Template, { fn into_response(self) -> Response { match self.0.render() { Ok(html) => Html(html).into_response(), Err(err) => ( StatusCode::INTERNAL_SERVER_ERROR, format!("Failed to render template. Error: {}", err), ) .into_response(), } } } #[derive(Template)] #[template(path = "cottagecalendar.html")] struct CottageCalendarTemplate { logged_in: bool, user: UserData, user_roles: Vec, } pub async fn cottagecalendar( Extension(user_data): Extension>, State(db_pool): State, ) -> impl IntoResponse { // Is the user logged in? let logged_in = user_data.is_some(); if logged_in { // Extract the user data. let user = user_data.as_ref().unwrap().clone(); let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); if is_authorized("/cottagecalendar", user_data, db_pool.clone()).await { // Get user roles let user_roles = get_user_roles_display(userid, &db_pool.clone()).await; let template = CottageCalendarTemplate { logged_in, user, user_roles, }; HtmlTemplate(template).into_response() } else { Redirect::to("/").into_response() } } else { Redirect::to("/").into_response() } } pub async fn get_events( Extension(user_data): Extension>, State(db_pool): State, ) -> String { let events = "[{\"title\": \"Chris and Terri\", \"start\": \"2024-12-23T14:00:00\", \"end\": \"2024-12-27T10:00:00\", \"allDay\": false}, {\"title\": \"Stephen\", \"start\": \"2024-12-27T14:00:00\", \"end\": \"2024-12-31T10:00:00\", \"allDay\": false}]"; println!("{}", events); events.to_string() }