add: timeline build retries

This commit is contained in:
trisua 2025-08-09 17:27:33 -04:00
parent fdaae8d977
commit e145449bc7
4 changed files with 51 additions and 19 deletions

View file

@ -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

View file

@ -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"))

View file

@ -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},
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<State>,
Query(req): Query<TimelineQuery>,
) -> 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<User>,
req: &TimelineQuery,
jar: &CookieJar,
) -> std::result::Result<Vec<FullPost>, Html<String>> {
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<State>,
Query(req): Query<TimelineQuery>,
) -> 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;

View file

@ -39,3 +39,4 @@ mod userfollows;
pub use drivers::DataManager;
pub use common::NAME_REGEX;
pub use posts::FullPost;