use crate::pages::DefaultLayoutData; use askama::Template; use askama_web::WebTemplate; use axum::{ Extension, extract::Path, response::{IntoResponse, Redirect, Response}, }; use axum_extra::TypedHeader; use headers::Referer; use http::StatusCode; use rustical_store::{Calendar, CalendarStore, auth::Principal}; use std::sync::Arc; #[derive(Template, WebTemplate)] #[template(path = "pages/calendar.html")] struct CalendarPage { calendar: Calendar, user: Principal, } impl DefaultLayoutData for CalendarPage { fn get_user(&self) -> Option<&Principal> { Some(&self.user) } } pub async fn route_calendar( Path((owner, cal_id)): Path<(String, String)>, Extension(store): Extension>, user: Principal, ) -> Result { if !user.is_principal(&owner) { return Ok(StatusCode::UNAUTHORIZED.into_response()); } Ok(CalendarPage { calendar: store.get_calendar(&owner, &cal_id, true).await?, user, } .into_response()) } pub async fn route_calendar_restore( Path((owner, cal_id)): Path<(String, String)>, Extension(store): Extension>, user: Principal, referer: Option>, ) -> Result { if !user.is_principal(&owner) { return Ok(StatusCode::UNAUTHORIZED.into_response()); } store.restore_calendar(&owner, &cal_id).await?; Ok(referer.map_or_else( || (StatusCode::CREATED, "Restored").into_response(), |referer| Redirect::to(&referer.to_string()).into_response(), )) }