Skip to content

Commit 2633af2

Browse files
committed
chore: Get rid of serde_qs entirely
1 parent 9944eee commit 2633af2

File tree

10 files changed

+53
-425
lines changed

10 files changed

+53
-425
lines changed

Cargo.lock

Lines changed: 14 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ sea-orm-migration = { version = "1", default-features = false }
4545
secrecy = { version = "0.8", default-features = false }
4646
serde = { version = "1", default-features = false }
4747
serde_json = { version = "1", default-features = false }
48-
serde_qs = { version = "0.13", default-features = false }
4948
serde_with = { version = "3", default-features = false }
5049
service = { path = "crates/service" }
5150
strum = { version = "0.26", default-features = false }

crates/rest-api/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ axum = { workspace = true, features = [
2222
"tokio",
2323
"http2",
2424
] }
25-
axum-extra = { workspace = true, features = ["cookie"] }
25+
axum-extra = { workspace = true, features = ["cookie", "query"] }
2626
base64 = { workspace = true }
2727
chrono = { workspace = true }
2828
form_urlencoded = { workspace = true }
@@ -35,7 +35,6 @@ lazy_static = { workspace = true }
3535
secrecy = { workspace = true }
3636
serde = { workspace = true, features = ["derive"] }
3737
serde_json = { workspace = true }
38-
serde_qs = { workspace = true }
3938
serde_with = { workspace = true }
4039
service = { workspace = true }
4140
strum = { workspace = true, features = ["derive"] }

crates/rest-api/src/features/members/enrich_members.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use axum::{
1313
},
1414
Json,
1515
};
16+
use axum_extra::extract::Query;
1617
use futures::Stream;
1718
use serde::{Deserialize, Serialize};
1819
use service::{
@@ -25,7 +26,7 @@ use tokio::sync::mpsc;
2526
use tokio_stream::wrappers::ReceiverStream;
2627
use tracing::trace;
2728

28-
use crate::{error::Error, forms::QsQuery, AppState};
29+
use crate::{error::Error, AppState};
2930

3031
use super::Member;
3132

@@ -45,7 +46,7 @@ pub struct JIDs {
4546

4647
pub async fn enrich_members_route(
4748
member_service: MemberService,
48-
QsQuery(JIDs { jids }): QsQuery<JIDs>,
49+
Query(JIDs { jids }): Query<JIDs>,
4950
app_config: AppConfig,
5051
) -> Result<Json<HashMap<BareJid, EnrichedMember>>, Error> {
5152
let jids_count = jids.len();
@@ -70,7 +71,7 @@ pub async fn enrich_members_route(
7071

7172
pub async fn enrich_members_stream_route(
7273
member_service: MemberService,
73-
QsQuery(JIDs { jids }): QsQuery<JIDs>,
74+
Query(JIDs { jids }): Query<JIDs>,
7475
State(AppState { app_config, .. }): State<AppState>,
7576
) -> Result<Sse<impl Stream<Item = Result<Event, Infallible>>>, Error> {
7677
let member_service = Arc::new(member_service);

crates/rest-api/src/features/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// Copyright: 2024–2025, Rémi Bardon <[email protected]>
44
// License: Mozilla Public License v2.0 (MPL v2.0)
55

6-
use crate::{forms::qs_query::rename_repeated_query_param_names, AppState};
6+
use crate::{forms::multi_value_items::rename_bracketed_query_param_names, AppState};
77

88
pub mod startup_actions;
99

@@ -36,5 +36,5 @@ pub(super) fn router(app_state: AppState) -> axum::Router {
3636
.merge(roles::router(app_state.clone()))
3737
.merge(server_config::router(app_state.clone()))
3838
.merge(workspace_details::router(app_state.clone()))
39-
.layer(tower::ServiceBuilder::new().map_request(rename_repeated_query_param_names))
39+
.layer(tower::ServiceBuilder::new().map_request(rename_bracketed_query_param_names))
4040
}

crates/rest-api/src/forms/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44
// License: Mozilla Public License v2.0 (MPL v2.0)
55

66
mod interval;
7+
pub mod multi_value_items;
78
mod pagination;
8-
pub mod qs_query;
9-
mod strict_qs_query;
109
mod timestamp;
1110

1211
pub use interval::Interval;
1312
pub use pagination::Pagination;
14-
pub use qs_query::QsQuery;
1513
pub use timestamp::Timestamp;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// prose-pod-api
2+
//
3+
// Copyright: 2025, Rémi Bardon <[email protected]>
4+
// License: Mozilla Public License v2.0 (MPL v2.0)
5+
6+
use axum::{extract::Request, http::uri};
7+
8+
/// The Prose Pod API should support repeated query parameters using
9+
/// non-indexed brackets (e.g. `jids[][email protected]&jids[][email protected]`).
10+
/// Both [`axum::extract::Query`] and [`axum_extra::extract::Query`] don't support it,
11+
/// but by removing the brackets, we can leverage [`axum_extra::extract::Query`]'s
12+
/// support for multi-value items and achieve the desired behavior.
13+
pub fn rename_bracketed_query_param_names(req: Request) -> Request {
14+
let (mut head, body) = req.into_parts();
15+
let uri = head.uri.clone();
16+
17+
let query = uri.query().unwrap_or_default();
18+
let new_query = query.replace("[]=", "=");
19+
20+
head.uri = uri::Builder::from(uri.clone())
21+
.path_and_query(format!("{path}?{new_query}", path = uri.clone().path()))
22+
.build()
23+
.unwrap();
24+
25+
Request::from_parts(head, body)
26+
}

crates/rest-api/src/forms/qs_query.rs

Lines changed: 0 additions & 173 deletions
This file was deleted.

0 commit comments

Comments
 (0)