use rocket::{get, http::ContentType, request::FlashMessage, routes, Route, State}; use sqlx::SqlitePool; use crate::model::{ event::Event, personal::cal::get_personal_cal, user::{User, UserWithDetails}, }; use rocket_dyn_templates::Template; use tera::Context; #[get("/cal")] async fn cal(db: &State) -> (ContentType, String) { //TODO: add unit test once proper functionality is there (ContentType::Calendar, Event::get_ics_feed(db).await) } #[get("/kalender")] async fn calinfo(db: &State, user: User, flash: Option>) -> Template { let mut context = Context::new(); if let Some(msg) = flash { context.insert("flash", &msg.into_inner()); } context.insert("loggedin_user", &UserWithDetails::from_user(user, db).await); Template::render("calinfo", context.into_json()) } #[get("/cal/personal//")] async fn cal_registered( db: &State, user_id: i32, uuid: &str, ) -> Result<(ContentType, String), String> { let Some(user) = User::find_by_id(db, user_id).await else { return Err("Invalid".into()); }; if &user.user_token != uuid { return Err("Invalid".into()); } Ok((ContentType::Calendar, get_personal_cal(db, &user).await)) } pub fn routes() -> Vec { routes![cal, cal_registered, calinfo] } #[cfg(test)] mod test { use rocket::{http::Status, local::asynchronous::Client}; use sqlx::SqlitePool; use crate::testdb; #[sqlx::test] fn test_without_login() { let db = testdb!(); let rocket = rocket::build().manage(db.clone()); let rocket = crate::tera::config(rocket); let client = Client::tracked(rocket).await.unwrap(); let req = client.get("/"); let response = req.dispatch().await; assert_eq!(response.status(), Status::SeeOther); assert_eq!(response.headers().get("Location").next(), Some("/auth")); } }