use super::render_error; use crate::{ assets::initial_context, get_lang, get_user_from_token, routes::pages::misc::NotificationsProps, State, }; use axum::{ response::{Html, IntoResponse}, extract::{Query, Path}, Extension, }; use axum_extra::extract::CookieJar; use tetratto_core::model::{littleweb::TLDS_VEC, permissions::SecondaryPermission, Error}; use serde::Deserialize; /// `/services` pub async fn services_request( jar: CookieJar, Extension(data): Extension, Query(props): Query, ) -> impl IntoResponse { let data = data.read().await; let user = match get_user_from_token!(jar, data.0) { Some(ua) => ua, None => { return Err(Html( render_error(Error::NotAllowed, &jar, &data, &None).await, )); } }; let profile = if props.id != 0 { match data.0.get_user_by_id(props.id).await { Ok(x) => x, Err(e) => return Err(Html(render_error(e, &jar, &data, &None).await)), } } else { user.clone() }; if profile.id != user.id && !user .secondary_permissions .check(SecondaryPermission::MANAGE_SERVICES) { return Err(Html( render_error(Error::NotAllowed, &jar, &data, &None).await, )); } let list = match data.0.get_services_by_user(profile.id).await { Ok(x) => x, Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)), }; let lang = get_lang!(jar, data.0); let mut context = initial_context(&data.0.0.0, lang, &Some(user)).await; context.insert("list", &list); context.insert("profile", &profile); // return Ok(Html( data.1.render("littleweb/services.html", &context).unwrap(), )) } /// `/domains` pub async fn domains_request( jar: CookieJar, Extension(data): Extension, Query(props): Query, ) -> impl IntoResponse { let data = data.read().await; let user = match get_user_from_token!(jar, data.0) { Some(ua) => ua, None => { return Err(Html( render_error(Error::NotAllowed, &jar, &data, &None).await, )); } }; let profile = if props.id != 0 { match data.0.get_user_by_id(props.id).await { Ok(x) => x, Err(e) => return Err(Html(render_error(e, &jar, &data, &None).await)), } } else { user.clone() }; if profile.id != user.id && !user .secondary_permissions .check(SecondaryPermission::MANAGE_DOMAINS) { return Err(Html( render_error(Error::NotAllowed, &jar, &data, &None).await, )); } let list = match data.0.get_domains_by_user(user.id).await { Ok(x) => x, Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)), }; let lang = get_lang!(jar, data.0); let mut context = initial_context(&data.0.0.0, lang, &Some(user)).await; context.insert("list", &list); context.insert("tlds", &*TLDS_VEC); context.insert("profile", &profile); // return Ok(Html( data.1.render("littleweb/domains.html", &context).unwrap(), )) } #[derive(Deserialize)] pub struct FileBrowserProps { #[serde(default)] path: String, } /// `/services/{id}` pub async fn service_request( jar: CookieJar, Path(id): Path, Extension(data): Extension, Query(props): Query, ) -> impl IntoResponse { let data = data.read().await; let user = match get_user_from_token!(jar, data.0) { Some(ua) => ua, None => { return Err(Html( render_error(Error::NotAllowed, &jar, &data, &None).await, )); } }; let service = match data.0.get_service_by_id(id).await { Ok(x) => x, Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)), }; if user.id != service.owner && !user .secondary_permissions .check(SecondaryPermission::MANAGE_SERVICES) { return Err(Html( render_error(Error::NotAllowed, &jar, &data, &None).await, )); } let lang = get_lang!(jar, data.0); let mut context = initial_context(&data.0.0.0, lang, &Some(user)).await; context.insert("service", &service); match service.file(&props.path.replacen("/", "", 1)) { Some((x, p)) => { context.insert("id_path", &p); context.insert("file", &x); context.insert("files", &x.children); } None => { context.insert("id_path", &Vec::<()>::new()); context.insert("files", &service.files); } } let path_segments: Vec<&str> = props.path.split("/").collect(); context.insert("path_segments", &path_segments); context.insert("path", &props.path); // return Ok(Html( data.1.render("littleweb/service.html", &context).unwrap(), )) } /// `/domains/{id}` pub async fn domain_request( jar: CookieJar, Path(id): Path, Extension(data): Extension, ) -> impl IntoResponse { let data = data.read().await; let user = match get_user_from_token!(jar, data.0) { Some(ua) => ua, None => { return Err(Html( render_error(Error::NotAllowed, &jar, &data, &None).await, )); } }; let domain = match data.0.get_domain_by_id(id).await { Ok(x) => x, Err(e) => return Err(Html(render_error(e, &jar, &data, &Some(user)).await)), }; if user.id != domain.owner && !user .secondary_permissions .check(SecondaryPermission::MANAGE_DOMAINS) { return Err(Html( render_error(Error::NotAllowed, &jar, &data, &None).await, )); } let lang = get_lang!(jar, data.0); let mut context = initial_context(&data.0.0.0, lang, &Some(user)).await; context.insert("domain", &domain); // return Ok(Html( data.1.render("littleweb/domain.html", &context).unwrap(), )) } /// `/net` pub async fn browser_home_request( jar: CookieJar, Extension(data): Extension, ) -> impl IntoResponse { let data = data.read().await; let user = get_user_from_token!(jar, data.0); let lang = get_lang!(jar, data.0); let mut context = initial_context(&data.0.0.0, lang, &user).await; context.insert("path", &""); // return Html(data.1.render("littleweb/browser.html", &context).unwrap()) } /// `/net/{uri}` pub async fn browser_request( jar: CookieJar, Path(mut uri): Path, Extension(data): Extension, ) -> impl IntoResponse { let data = data.read().await; let user = get_user_from_token!(jar, data.0); if !uri.contains("/") { uri = format!("{uri}/index.html"); } if !uri.starts_with("atto://") { uri = format!("atto://{uri}"); } let lang = get_lang!(jar, data.0); let mut context = initial_context(&data.0.0.0, lang, &user).await; context.insert("path", &uri.replace("atto://", "")); // return Html(data.1.render("littleweb/browser.html", &context).unwrap()) }