diff --git a/Cargo.toml b/Cargo.toml index b5beca0..c25b56f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,9 +10,9 @@ package.homepage = "https://tetratto.com" incremental = true [profile.release] -opt-level = "z" +opt-level = 3 lto = true -codegen-units = 1 +codegen-units = 2 # panic = "abort" panic = "unwind" strip = true diff --git a/crates/app/src/public/html/macros.lisp b/crates/app/src/public/html/macros.lisp index ab7c3af..cadeeba 100644 --- a/crates/app/src/public/html/macros.lisp +++ b/crates/app/src/public/html/macros.lisp @@ -79,6 +79,7 @@ ("href" "/mail") (icon (text "mail")) (str (text "general:link.mail"))) + (text "{% if config.stripe -%}") (a ("href" "/wallet") (icon (text "piggy-bank")) @@ -87,6 +88,7 @@ ("href" "/products") (icon (text "store")) (str (text "economy:label.my_products"))) + (text "{%- endif %}") (a ("href" "/journals/0/0") (icon (text "notebook")) diff --git a/crates/app/src/routes/pages/misc.rs b/crates/app/src/routes/pages/misc.rs index a4d6ad5..e069f98 100644 --- a/crates/app/src/routes/pages/misc.rs +++ b/crates/app/src/routes/pages/misc.rs @@ -1,6 +1,7 @@ use super::{PaginatedQuery, render_error}; use crate::{ - assets::initial_context, check_user_blocked_or_private, get_lang, get_user_from_token, State, + assets::initial_context, check_user_blocked_or_private, get_lang, get_user_from_token, + InnerState, State, }; use axum::{ extract::{Path, Query}, @@ -9,11 +10,14 @@ use axum::{ }; use crate::cookie::CookieJar; use serde::Deserialize; -use tetratto_core::model::{ - auth::{AchievementName, DefaultTimelineChoice, ACHIEVEMENTS}, - permissions::FinePermission, - requests::ActionType, - Error, +use tetratto_core::{ + database::FullPost, + model::{ + auth::{AchievementName, DefaultTimelineChoice, ACHIEVEMENTS, User}, + permissions::FinePermission, + requests::ActionType, + Error, + }, }; use std::fs::read_to_string; use pathbufd::PathBufD; @@ -685,15 +689,12 @@ pub struct TimelineQuery { pub responses_only: bool, } -/// `/_swiss_army_timeline` -pub async fn swiss_army_timeline_request( - jar: CookieJar, - Extension(data): Extension, - Query(req): Query, -) -> impl IntoResponse { - let data = data.read().await; - let user = get_user_from_token!(jar, data.0); - +async fn swiss_army_timeline( + data: &InnerState, + user: Option, + req: &TimelineQuery, + jar: &CookieJar, +) -> std::result::Result, Html> { let ignore_users = crate::ignore_users_gen!(user, data); let list = if req.stack_id != 0 { @@ -807,12 +808,40 @@ pub async fn swiss_army_timeline_request( None }, ), - Err(e) => return Ok(Html(render_error(e, &jar, &data, &user).await)), + Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)), }, - Err(e) => return Ok(Html(render_error(e, &jar, &data, &user).await)), + Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)), } }; + Ok(list) +} + +/// `/_swiss_army_timeline` +pub async fn swiss_army_timeline_request( + jar: CookieJar, + Extension(data): Extension, + Query(req): Query, +) -> impl IntoResponse { + let data = data.read().await; + let user = get_user_from_token!(jar, data.0); + + let mut tries_remaining = 1; + let mut empty_retries = 0; // how many times we've retried because of an empty list + let mut list = Vec::new(); + + while tries_remaining > 0 { + list = match swiss_army_timeline(&data, user.clone(), &req, &jar).await { + Ok(x) => x, + Err(e) => return Err(e), + }; + + if list.len() > 0 && empty_retries != 1 { + tries_remaining -= 1; + empty_retries += 1; + } + } + let lang = get_lang!(jar, data.0); let mut context = initial_context(&data.0.0.0, lang, &user).await; diff --git a/crates/core/src/database/mod.rs b/crates/core/src/database/mod.rs index c52a107..18182cf 100644 --- a/crates/core/src/database/mod.rs +++ b/crates/core/src/database/mod.rs @@ -39,3 +39,4 @@ mod userfollows; pub use drivers::DataManager; pub use common::NAME_REGEX; +pub use posts::FullPost;