Rename rate limit columns (fixes #5805) (#5824)

* Rename rate limit columns (fixes #5805)

* update js client
This commit is contained in:
Nutomic 2025-06-24 14:21:50 +00:00 committed by GitHub
parent 497ec72f26
commit 99ec0b7116
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 228 additions and 158 deletions

View file

@ -31,7 +31,7 @@
"eslint-plugin-prettier": "^5.4.0",
"jest": "^29.5.0",
"joi": "^17.13.3",
"lemmy-js-client": "1.0.0-dont-return-actions.1",
"lemmy-js-client": "1.0.0-rename-rate-limit-columns.1",
"prettier": "^3.5.3",
"ts-jest": "^29.3.2",
"tsoa": "^6.6.0",

View file

@ -36,8 +36,8 @@ importers:
specifier: ^17.13.3
version: 17.13.3
lemmy-js-client:
specifier: 1.0.0-dont-return-actions.1
version: 1.0.0-dont-return-actions.1
specifier: 1.0.0-rename-rate-limit-columns.1
version: 1.0.0-rename-rate-limit-columns.1
prettier:
specifier: ^3.5.3
version: 3.5.3
@ -1594,8 +1594,8 @@ packages:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
lemmy-js-client@1.0.0-dont-return-actions.1:
resolution: {integrity: sha512-1eiLU+0ZBOqu//p2CRrO8hOTJbOWgpNYAB/R9I4sjuunp6i0oIzMhXNTg7hW8hQ8fyG7YO2BrgQQu861ZchnDg==}
lemmy-js-client@1.0.0-rename-rate-limit-columns.1:
resolution: {integrity: sha512-zlVJ4zkoI/7hNm6x7vr+Su2cRjAr8PQCA9j0GeK1UCMEIBLLSltknuRPC79VJY2sUhRAuR2JwTR0JtZ75SH2XQ==}
leven@3.1.0:
resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
@ -4404,7 +4404,7 @@ snapshots:
kleur@3.0.3: {}
lemmy-js-client@1.0.0-dont-return-actions.1:
lemmy-js-client@1.0.0-rename-rate-limit-columns.1:
dependencies:
'@tsoa/runtime': 6.6.0
transitivePeerDependencies:

View file

@ -159,12 +159,12 @@ export async function setupLogins() {
// Registration applications are now enabled by default, need to disable them
let editSiteForm: EditSite = {
registration_mode: "Open",
rate_limit_message: 999,
rate_limit_post: 999,
rate_limit_comment: 999,
rate_limit_register: 999,
rate_limit_search: 999,
rate_limit_image: 999,
rate_limit_message_max_requests: 999,
rate_limit_post_max_requests: 999,
rate_limit_comment_max_requests: 999,
rate_limit_register_max_requests: 999,
rate_limit_search_max_requests: 999,
rate_limit_image_max_requests: 999,
};
await alpha.editSite(editSiteForm);
await beta.editSite(editSiteForm);

View file

@ -114,19 +114,23 @@ pub async fn create_site(
LocalSite::update(&mut context.pool(), &local_site_form).await?;
let local_site_rate_limit_form = LocalSiteRateLimitUpdateForm {
message: data.rate_limit_message,
message_per_second: not_zero(data.rate_limit_message_per_second),
post: data.rate_limit_post,
post_per_second: not_zero(data.rate_limit_post_per_second),
register: data.rate_limit_register,
register_per_second: not_zero(data.rate_limit_register_per_second),
image: data.rate_limit_image,
image_per_second: not_zero(data.rate_limit_image_per_second),
comment: data.rate_limit_comment,
comment_per_second: not_zero(data.rate_limit_comment_per_second),
search: data.rate_limit_search,
search_per_second: not_zero(data.rate_limit_search_per_second),
..Default::default()
message_max_requests: data.rate_limit_message_max_requests,
message_interval_seconds: not_zero(data.rate_limit_message_interval_seconds),
post_max_requests: data.rate_limit_post_max_requests,
post_interval_seconds: not_zero(data.rate_limit_post_interval_seconds),
register_max_requests: data.rate_limit_register_max_requests,
register_interval_seconds: not_zero(data.rate_limit_register_interval_seconds),
image_max_requests: data.rate_limit_image_max_requests,
image_interval_seconds: not_zero(data.rate_limit_image_interval_seconds),
comment_max_requests: data.rate_limit_comment_max_requests,
comment_interval_seconds: not_zero(data.rate_limit_comment_interval_seconds),
search_max_requests: data.rate_limit_search_max_requests,
search_interval_seconds: not_zero(data.rate_limit_search_interval_seconds),
import_user_settings_max_requests: data.rate_limit_import_user_settings_max_requests,
import_user_settings_interval_seconds: not_zero(
data.rate_limit_import_user_settings_interval_seconds,
),
updated_at: Some(Some(Utc::now())),
};
LocalSiteRateLimit::update(&mut context.pool(), &local_site_rate_limit_form).await?;

View file

@ -125,19 +125,23 @@ pub async fn update_site(
.ok();
let local_site_rate_limit_form = LocalSiteRateLimitUpdateForm {
message: data.rate_limit_message,
message_per_second: not_zero(data.rate_limit_message_per_second),
post: data.rate_limit_post,
post_per_second: not_zero(data.rate_limit_post_per_second),
register: data.rate_limit_register,
register_per_second: not_zero(data.rate_limit_register_per_second),
image: data.rate_limit_image,
image_per_second: not_zero(data.rate_limit_image_per_second),
comment: data.rate_limit_comment,
comment_per_second: not_zero(data.rate_limit_comment_per_second),
search: data.rate_limit_search,
search_per_second: not_zero(data.rate_limit_search_per_second),
..Default::default()
message_max_requests: data.rate_limit_message_max_requests,
message_interval_seconds: not_zero(data.rate_limit_message_interval_seconds),
post_max_requests: data.rate_limit_post_max_requests,
post_interval_seconds: not_zero(data.rate_limit_post_interval_seconds),
register_max_requests: data.rate_limit_register_max_requests,
register_interval_seconds: not_zero(data.rate_limit_register_interval_seconds),
image_max_requests: data.rate_limit_image_max_requests,
image_interval_seconds: not_zero(data.rate_limit_image_interval_seconds),
comment_max_requests: data.rate_limit_comment_max_requests,
comment_interval_seconds: not_zero(data.rate_limit_comment_interval_seconds),
search_max_requests: data.rate_limit_search_max_requests,
search_interval_seconds: not_zero(data.rate_limit_search_interval_seconds),
import_user_settings_max_requests: data.rate_limit_import_user_settings_max_requests,
import_user_settings_interval_seconds: not_zero(
data.rate_limit_import_user_settings_interval_seconds,
),
updated_at: Some(Some(Utc::now())),
};
LocalSiteRateLimit::update(&mut context.pool(), &local_site_rate_limit_form)

View file

@ -449,17 +449,17 @@ pub fn local_site_rate_limit_to_rate_limit_config(
l: &LocalSiteRateLimit,
) -> EnumMap<ActionType, BucketConfig> {
enum_map! {
ActionType::Message => (l.message, l.message_per_second),
ActionType::Post => (l.post, l.post_per_second),
ActionType::Register => (l.register, l.register_per_second),
ActionType::Image => (l.image, l.image_per_second),
ActionType::Comment => (l.comment, l.comment_per_second),
ActionType::Search => (l.search, l.search_per_second),
ActionType::ImportUserSettings => (l.import_user_settings, l.import_user_settings_per_second),
ActionType::Message => (l.message_max_requests, l.message_interval_seconds),
ActionType::Post => (l.post_max_requests, l.post_interval_seconds),
ActionType::Register => (l.register_max_requests, l.register_interval_seconds),
ActionType::Image => (l.image_max_requests, l.image_interval_seconds),
ActionType::Comment => (l.comment_max_requests, l.comment_interval_seconds),
ActionType::Search => (l.search_max_requests, l.search_interval_seconds),
ActionType::ImportUserSettings => (l.import_user_settings_max_requests, l.import_user_settings_interval_seconds),
}
.map(|_key, (capacity, secs_to_refill)| BucketConfig {
capacity: u32::try_from(capacity).unwrap_or(0),
secs_to_refill: u32::try_from(secs_to_refill).unwrap_or(0),
.map(|_key, (max_requests, interval)| BucketConfig {
max_requests: u32::try_from(max_requests).unwrap_or(0),
interval: u32::try_from(interval).unwrap_or(0),
})
}

View file

@ -52,18 +52,18 @@ impl LocalSiteRateLimit {
impl LocalSiteRateLimitUpdateForm {
fn is_empty(&self) -> bool {
self.message.is_none()
&& self.message_per_second.is_none()
&& self.post.is_none()
&& self.post_per_second.is_none()
&& self.register.is_none()
&& self.register_per_second.is_none()
&& self.image.is_none()
&& self.image_per_second.is_none()
&& self.comment.is_none()
&& self.comment_per_second.is_none()
&& self.search.is_none()
&& self.search_per_second.is_none()
self.message_max_requests.is_none()
&& self.message_interval_seconds.is_none()
&& self.post_max_requests.is_none()
&& self.post_interval_seconds.is_none()
&& self.register_max_requests.is_none()
&& self.register_interval_seconds.is_none()
&& self.image_max_requests.is_none()
&& self.image_interval_seconds.is_none()
&& self.comment_max_requests.is_none()
&& self.comment_interval_seconds.is_none()
&& self.search_max_requests.is_none()
&& self.search_interval_seconds.is_none()
&& self.updated_at.is_none()
}
}

View file

@ -20,22 +20,22 @@ use serde_with::skip_serializing_none;
/// Rate limits for your site. Given in count / length of time.
pub struct LocalSiteRateLimit {
pub local_site_id: LocalSiteId,
pub message: i32,
pub message_per_second: i32,
pub post: i32,
pub post_per_second: i32,
pub register: i32,
pub register_per_second: i32,
pub image: i32,
pub image_per_second: i32,
pub comment: i32,
pub comment_per_second: i32,
pub search: i32,
pub search_per_second: i32,
pub message_max_requests: i32,
pub message_interval_seconds: i32,
pub post_max_requests: i32,
pub post_interval_seconds: i32,
pub register_max_requests: i32,
pub register_interval_seconds: i32,
pub image_max_requests: i32,
pub image_interval_seconds: i32,
pub comment_max_requests: i32,
pub comment_interval_seconds: i32,
pub search_max_requests: i32,
pub search_interval_seconds: i32,
pub published_at: DateTime<Utc>,
pub updated_at: Option<DateTime<Utc>>,
pub import_user_settings: i32,
pub import_user_settings_per_second: i32,
pub import_user_settings_max_requests: i32,
pub import_user_settings_interval_seconds: i32,
}
#[derive(Clone, derive_new::new)]
@ -44,52 +44,52 @@ pub struct LocalSiteRateLimit {
pub struct LocalSiteRateLimitInsertForm {
pub local_site_id: LocalSiteId,
#[new(default)]
pub message: Option<i32>,
pub message_max_requests: Option<i32>,
#[new(default)]
pub message_per_second: Option<i32>,
pub message_interval_seconds: Option<i32>,
#[new(default)]
pub post: Option<i32>,
pub post_max_requests: Option<i32>,
#[new(default)]
pub post_per_second: Option<i32>,
pub post_interval_seconds: Option<i32>,
#[new(default)]
pub register: Option<i32>,
pub register_max_requests: Option<i32>,
#[new(default)]
pub register_per_second: Option<i32>,
pub register_interval_seconds: Option<i32>,
#[new(default)]
pub image: Option<i32>,
pub image_max_requests: Option<i32>,
#[new(default)]
pub image_per_second: Option<i32>,
pub image_interval_seconds: Option<i32>,
#[new(default)]
pub comment: Option<i32>,
pub comment_max_requests: Option<i32>,
#[new(default)]
pub comment_per_second: Option<i32>,
pub comment_interval_seconds: Option<i32>,
#[new(default)]
pub search: Option<i32>,
pub search_max_requests: Option<i32>,
#[new(default)]
pub search_per_second: Option<i32>,
pub search_interval_seconds: Option<i32>,
#[new(default)]
pub import_user_settings: Option<i32>,
pub import_user_settings_max_requests: Option<i32>,
#[new(default)]
pub import_user_settings_per_second: Option<i32>,
pub import_user_settings_interval_seconds: Option<i32>,
}
#[derive(Clone, Default)]
#[cfg_attr(feature = "full", derive(AsChangeset))]
#[cfg_attr(feature = "full", diesel(table_name = local_site_rate_limit))]
pub struct LocalSiteRateLimitUpdateForm {
pub message: Option<i32>,
pub message_per_second: Option<i32>,
pub post: Option<i32>,
pub post_per_second: Option<i32>,
pub register: Option<i32>,
pub register_per_second: Option<i32>,
pub image: Option<i32>,
pub image_per_second: Option<i32>,
pub comment: Option<i32>,
pub comment_per_second: Option<i32>,
pub search: Option<i32>,
pub search_per_second: Option<i32>,
pub import_user_settings: Option<i32>,
pub import_user_settings_per_second: Option<i32>,
pub message_max_requests: Option<i32>,
pub message_interval_seconds: Option<i32>,
pub post_max_requests: Option<i32>,
pub post_interval_seconds: Option<i32>,
pub register_max_requests: Option<i32>,
pub register_interval_seconds: Option<i32>,
pub image_max_requests: Option<i32>,
pub image_interval_seconds: Option<i32>,
pub comment_max_requests: Option<i32>,
pub comment_interval_seconds: Option<i32>,
pub search_max_requests: Option<i32>,
pub search_interval_seconds: Option<i32>,
pub import_user_settings_max_requests: Option<i32>,
pub import_user_settings_interval_seconds: Option<i32>,
pub updated_at: Option<Option<DateTime<Utc>>>,
}

View file

@ -459,22 +459,22 @@ diesel::table! {
diesel::table! {
local_site_rate_limit (local_site_id) {
local_site_id -> Int4,
message -> Int4,
message_per_second -> Int4,
post -> Int4,
post_per_second -> Int4,
register -> Int4,
register_per_second -> Int4,
image -> Int4,
image_per_second -> Int4,
comment -> Int4,
comment_per_second -> Int4,
search -> Int4,
search_per_second -> Int4,
message_max_requests -> Int4,
message_interval_seconds -> Int4,
post_max_requests -> Int4,
post_interval_seconds -> Int4,
register_max_requests -> Int4,
register_interval_seconds -> Int4,
image_max_requests -> Int4,
image_interval_seconds -> Int4,
comment_max_requests -> Int4,
comment_interval_seconds -> Int4,
search_max_requests -> Int4,
search_interval_seconds -> Int4,
published_at -> Timestamptz,
updated_at -> Nullable<Timestamptz>,
import_user_settings -> Int4,
import_user_settings_per_second -> Int4,
import_user_settings_max_requests -> Int4,
import_user_settings_interval_seconds -> Int4,
}
}
@ -1258,6 +1258,7 @@ diesel::joinable!(report_combined -> post_report (post_report_id));
diesel::joinable!(report_combined -> private_message_report (private_message_report_id));
diesel::joinable!(search_combined -> comment (comment_id));
diesel::joinable!(search_combined -> community (community_id));
diesel::joinable!(search_combined -> multi_community (multi_community_id));
diesel::joinable!(search_combined -> person (person_id));
diesel::joinable!(search_combined -> post (post_id));
diesel::joinable!(site -> instance (instance_id));

View file

@ -126,18 +126,20 @@ pub struct CreateSite {
pub discussion_languages: Option<Vec<LanguageId>>,
pub slur_filter_regex: Option<String>,
pub actor_name_max_length: Option<i32>,
pub rate_limit_message: Option<i32>,
pub rate_limit_message_per_second: Option<i32>,
pub rate_limit_post: Option<i32>,
pub rate_limit_post_per_second: Option<i32>,
pub rate_limit_register: Option<i32>,
pub rate_limit_register_per_second: Option<i32>,
pub rate_limit_image: Option<i32>,
pub rate_limit_image_per_second: Option<i32>,
pub rate_limit_comment: Option<i32>,
pub rate_limit_comment_per_second: Option<i32>,
pub rate_limit_search: Option<i32>,
pub rate_limit_search_per_second: Option<i32>,
pub rate_limit_message_max_requests: Option<i32>,
pub rate_limit_message_interval_seconds: Option<i32>,
pub rate_limit_post_max_requests: Option<i32>,
pub rate_limit_post_interval_seconds: Option<i32>,
pub rate_limit_register_max_requests: Option<i32>,
pub rate_limit_register_interval_seconds: Option<i32>,
pub rate_limit_image_max_requests: Option<i32>,
pub rate_limit_image_interval_seconds: Option<i32>,
pub rate_limit_comment_max_requests: Option<i32>,
pub rate_limit_comment_interval_seconds: Option<i32>,
pub rate_limit_search_max_requests: Option<i32>,
pub rate_limit_search_interval_seconds: Option<i32>,
pub rate_limit_import_user_settings_max_requests: Option<i32>,
pub rate_limit_import_user_settings_interval_seconds: Option<i32>,
pub federation_enabled: Option<bool>,
pub captcha_enabled: Option<bool>,
pub captcha_difficulty: Option<String>,
@ -223,23 +225,26 @@ pub struct EditSite {
/// The max length of actor names.
pub actor_name_max_length: Option<i32>,
/// The number of messages allowed in a given time frame.
pub rate_limit_message: Option<i32>,
pub rate_limit_message_per_second: Option<i32>,
pub rate_limit_message_max_requests: Option<i32>,
pub rate_limit_message_interval_seconds: Option<i32>,
/// The number of posts allowed in a given time frame.
pub rate_limit_post: Option<i32>,
pub rate_limit_post_per_second: Option<i32>,
pub rate_limit_post_max_requests: Option<i32>,
pub rate_limit_post_interval_seconds: Option<i32>,
/// The number of registrations allowed in a given time frame.
pub rate_limit_register: Option<i32>,
pub rate_limit_register_per_second: Option<i32>,
pub rate_limit_register_max_requests: Option<i32>,
pub rate_limit_register_interval_seconds: Option<i32>,
/// The number of image uploads allowed in a given time frame.
pub rate_limit_image: Option<i32>,
pub rate_limit_image_per_second: Option<i32>,
pub rate_limit_image_max_requests: Option<i32>,
pub rate_limit_image_interval_seconds: Option<i32>,
/// The number of comments allowed in a given time frame.
pub rate_limit_comment: Option<i32>,
pub rate_limit_comment_per_second: Option<i32>,
pub rate_limit_comment_max_requests: Option<i32>,
pub rate_limit_comment_interval_seconds: Option<i32>,
/// The number of searches allowed in a given time frame.
pub rate_limit_search: Option<i32>,
pub rate_limit_search_per_second: Option<i32>,
pub rate_limit_search_max_requests: Option<i32>,
pub rate_limit_search_interval_seconds: Option<i32>,
/// The number of settings imports or exports allowed in a given time frame.
pub rate_limit_import_user_settings_max_requests: Option<i32>,
pub rate_limit_import_user_settings_interval_seconds: Option<i32>,
/// Whether to enable federation.
pub federation_enabled: Option<bool>,
/// Whether to enable captchas for signups.

View file

@ -31,8 +31,8 @@ pub enum ActionType {
#[derive(PartialEq, Debug, Copy, Clone)]
pub struct BucketConfig {
pub capacity: u32,
pub secs_to_refill: u32,
pub max_requests: u32,
pub interval: u32,
}
#[derive(Clone)]
@ -52,32 +52,32 @@ impl RateLimit {
pub fn with_test_config() -> Self {
Self::new(enum_map! {
ActionType::Message => BucketConfig {
capacity: 180,
secs_to_refill: 60,
max_requests: 180,
interval: 60,
},
ActionType::Post => BucketConfig {
capacity: 6,
secs_to_refill: 300,
max_requests: 6,
interval: 300,
},
ActionType::Register => BucketConfig {
capacity: 3,
secs_to_refill: 3600,
max_requests: 3,
interval: 3600,
},
ActionType::Image => BucketConfig {
capacity: 6,
secs_to_refill: 3600,
max_requests: 6,
interval: 3600,
},
ActionType::Comment => BucketConfig {
capacity: 6,
secs_to_refill: 600,
max_requests: 6,
interval: 600,
},
ActionType::Search => BucketConfig {
capacity: 60,
secs_to_refill: 600,
max_requests: 60,
interval: 600,
},
ActionType::ImportUserSettings => BucketConfig {
capacity: 1,
secs_to_refill: 24 * 60 * 60,
max_requests: 1,
interval: 24 * 60 * 60,
},
})
}
@ -182,8 +182,8 @@ fn new_input(
#[allow(clippy::expect_used)]
let config = configs.read().expect("read rwlock")[action_type];
let interval = Duration::from_secs(config.secs_to_refill.into());
let max_requests = config.capacity.into();
let interval = Duration::from_secs(config.interval.into());
let max_requests = config.max_requests.into();
Ok(SimpleInput {
interval,
max_requests,

View file

@ -0,0 +1,28 @@
ALTER TABLE local_site_rate_limit RENAME COLUMN message_max_requests TO message;
ALTER TABLE local_site_rate_limit RENAME COLUMN message_interval_seconds TO message_per_second;
ALTER TABLE local_site_rate_limit RENAME COLUMN post_max_requests TO post;
ALTER TABLE local_site_rate_limit RENAME COLUMN post_interval_seconds TO post_per_second;
ALTER TABLE local_site_rate_limit RENAME COLUMN comment_max_requests TO comment;
ALTER TABLE local_site_rate_limit RENAME COLUMN comment_interval_seconds TO comment_per_second;
ALTER TABLE local_site_rate_limit RENAME COLUMN register_max_requests TO register;
ALTER TABLE local_site_rate_limit RENAME COLUMN register_interval_seconds TO register_per_second;
ALTER TABLE local_site_rate_limit RENAME COLUMN image_max_requests TO image;
ALTER TABLE local_site_rate_limit RENAME COLUMN image_interval_seconds TO image_per_second;
ALTER TABLE local_site_rate_limit RENAME COLUMN search_max_requests TO search;
ALTER TABLE local_site_rate_limit RENAME COLUMN search_interval_seconds TO search_per_second;
ALTER TABLE local_site_rate_limit RENAME COLUMN import_user_settings_max_requests TO import_user_settings;
ALTER TABLE local_site_rate_limit RENAME COLUMN import_user_settings_interval_seconds TO import_user_settings_per_second;

View file

@ -0,0 +1,28 @@
ALTER TABLE local_site_rate_limit RENAME COLUMN message TO message_max_requests;
ALTER TABLE local_site_rate_limit RENAME COLUMN message_per_second TO message_interval_seconds;
ALTER TABLE local_site_rate_limit RENAME COLUMN post TO post_max_requests;
ALTER TABLE local_site_rate_limit RENAME COLUMN post_per_second TO post_interval_seconds;
ALTER TABLE local_site_rate_limit RENAME COLUMN comment TO comment_max_requests;
ALTER TABLE local_site_rate_limit RENAME COLUMN comment_per_second TO comment_interval_seconds;
ALTER TABLE local_site_rate_limit RENAME COLUMN register TO register_max_requests;
ALTER TABLE local_site_rate_limit RENAME COLUMN register_per_second TO register_interval_seconds;
ALTER TABLE local_site_rate_limit RENAME COLUMN image TO image_max_requests;
ALTER TABLE local_site_rate_limit RENAME COLUMN image_per_second TO image_interval_seconds;
ALTER TABLE local_site_rate_limit RENAME COLUMN search TO search_max_requests;
ALTER TABLE local_site_rate_limit RENAME COLUMN search_per_second TO search_interval_seconds;
ALTER TABLE local_site_rate_limit RENAME COLUMN import_user_settings TO import_user_settings_max_requests;
ALTER TABLE local_site_rate_limit RENAME COLUMN import_user_settings_per_second TO import_user_settings_interval_seconds;