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 incremental = true
[profile.release] [profile.release]
opt-level = "z" opt-level = 3
lto = true lto = true
codegen-units = 1 codegen-units = 2
# panic = "abort" # panic = "abort"
panic = "unwind" panic = "unwind"
strip = true strip = true

View file

@ -79,6 +79,7 @@
("href" "/mail") ("href" "/mail")
(icon (text "mail")) (icon (text "mail"))
(str (text "general:link.mail"))) (str (text "general:link.mail")))
(text "{% if config.stripe -%}")
(a (a
("href" "/wallet") ("href" "/wallet")
(icon (text "piggy-bank")) (icon (text "piggy-bank"))
@ -87,6 +88,7 @@
("href" "/products") ("href" "/products")
(icon (text "store")) (icon (text "store"))
(str (text "economy:label.my_products"))) (str (text "economy:label.my_products")))
(text "{%- endif %}")
(a (a
("href" "/journals/0/0") ("href" "/journals/0/0")
(icon (text "notebook")) (icon (text "notebook"))

View file

@ -1,6 +1,7 @@
use super::{PaginatedQuery, render_error}; use super::{PaginatedQuery, render_error};
use crate::{ 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::{ use axum::{
extract::{Path, Query}, extract::{Path, Query},
@ -9,11 +10,14 @@ use axum::{
}; };
use crate::cookie::CookieJar; use crate::cookie::CookieJar;
use serde::Deserialize; use serde::Deserialize;
use tetratto_core::model::{ use tetratto_core::{
auth::{AchievementName, DefaultTimelineChoice, ACHIEVEMENTS}, database::FullPost,
model::{
auth::{AchievementName, DefaultTimelineChoice, ACHIEVEMENTS, User},
permissions::FinePermission, permissions::FinePermission,
requests::ActionType, requests::ActionType,
Error, Error,
},
}; };
use std::fs::read_to_string; use std::fs::read_to_string;
use pathbufd::PathBufD; use pathbufd::PathBufD;
@ -685,15 +689,12 @@ pub struct TimelineQuery {
pub responses_only: bool, pub responses_only: bool,
} }
/// `/_swiss_army_timeline` async fn swiss_army_timeline(
pub async fn swiss_army_timeline_request( data: &InnerState,
jar: CookieJar, user: Option<User>,
Extension(data): Extension<State>, req: &TimelineQuery,
Query(req): Query<TimelineQuery>, jar: &CookieJar,
) -> impl IntoResponse { ) -> std::result::Result<Vec<FullPost>, Html<String>> {
let data = data.read().await;
let user = get_user_from_token!(jar, data.0);
let ignore_users = crate::ignore_users_gen!(user, data); let ignore_users = crate::ignore_users_gen!(user, data);
let list = if req.stack_id != 0 { let list = if req.stack_id != 0 {
@ -807,12 +808,40 @@ pub async fn swiss_army_timeline_request(
None 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 lang = get_lang!(jar, data.0);
let mut context = initial_context(&data.0.0.0, lang, &user).await; 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 drivers::DataManager;
pub use common::NAME_REGEX; pub use common::NAME_REGEX;
pub use posts::FullPost;