2025-05-28 23:00:39 +00:00
|
|
|
use axum::{
|
|
|
|
|
extract::{Request, State},
|
|
|
|
|
http::StatusCode,
|
|
|
|
|
middleware::Next,
|
|
|
|
|
response::Response,
|
|
|
|
|
routing::url_params::UrlParams,
|
|
|
|
|
};
|
|
|
|
|
|
2025-09-01 03:36:13 +00:00
|
|
|
use sqlx::{Postgres, types::Uuid};
|
2025-05-28 23:00:39 +00:00
|
|
|
use tracing::error;
|
|
|
|
|
|
|
|
|
|
use crate::auth::AuthState;
|
2025-09-01 03:36:13 +00:00
|
|
|
use crate::{ApiContext, util::json_err};
|
2025-05-28 23:00:39 +00:00
|
|
|
use pluralkit_models::PKSystem;
|
|
|
|
|
|
2025-06-09 05:39:44 +00:00
|
|
|
// move this somewhere else
|
|
|
|
|
fn parse_hid(hid: &str) -> String {
|
|
|
|
|
if hid.len() > 7 || hid.len() < 5 {
|
|
|
|
|
hid.to_string()
|
|
|
|
|
} else {
|
|
|
|
|
hid.to_lowercase().replace("-", "")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-28 23:00:39 +00:00
|
|
|
pub async fn params(State(ctx): State<ApiContext>, mut req: Request, next: Next) -> Response {
|
|
|
|
|
let pms = match req.extensions().get::<UrlParams>() {
|
|
|
|
|
None => Vec::new(),
|
|
|
|
|
Some(UrlParams::Params(pms)) => pms.clone(),
|
|
|
|
|
_ => {
|
|
|
|
|
return json_err(
|
|
|
|
|
StatusCode::BAD_REQUEST,
|
2025-07-05 17:31:02 +00:00
|
|
|
r#"{"message":"400: Bad Request","code": 0}"#.to_string(),
|
2025-05-28 23:00:39 +00:00
|
|
|
)
|
2025-09-01 03:36:13 +00:00
|
|
|
.into();
|
2025-05-28 23:00:39 +00:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (key, value) in pms {
|
|
|
|
|
match key.as_ref() {
|
|
|
|
|
"system_id" => match value.as_str() {
|
|
|
|
|
"@me" => {
|
|
|
|
|
let Some(system_id) = req
|
|
|
|
|
.extensions()
|
|
|
|
|
.get::<AuthState>()
|
|
|
|
|
.expect("missing auth state")
|
|
|
|
|
.system_id()
|
|
|
|
|
else {
|
|
|
|
|
return json_err(
|
|
|
|
|
StatusCode::UNAUTHORIZED,
|
2025-07-05 17:31:02 +00:00
|
|
|
r#"{"message":"401: Missing or invalid Authorization header","code": 0}"#.to_string(),
|
2025-05-28 23:00:39 +00:00
|
|
|
)
|
|
|
|
|
.into();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
match sqlx::query_as::<Postgres, PKSystem>(
|
|
|
|
|
"select * from systems where id = $1",
|
|
|
|
|
)
|
|
|
|
|
.bind(system_id)
|
|
|
|
|
.fetch_optional(&ctx.db)
|
|
|
|
|
.await
|
|
|
|
|
{
|
|
|
|
|
Ok(Some(system)) => {
|
|
|
|
|
req.extensions_mut().insert(system);
|
|
|
|
|
}
|
|
|
|
|
Ok(None) => {
|
|
|
|
|
error!(
|
|
|
|
|
?system_id,
|
|
|
|
|
"could not find previously authenticated system in db"
|
|
|
|
|
);
|
|
|
|
|
return json_err(
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
r#"{"message": "500: Internal Server Error", "code": 0}"#
|
|
|
|
|
.to_string(),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
Err(err) => {
|
|
|
|
|
error!(
|
|
|
|
|
?err,
|
|
|
|
|
"failed to query previously authenticated system in db"
|
|
|
|
|
);
|
|
|
|
|
return json_err(
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
r#"{"message": "500: Internal Server Error", "code": 0}"#
|
|
|
|
|
.to_string(),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
id => {
|
2025-06-09 20:14:38 +00:00
|
|
|
println!("a {id}");
|
2025-05-28 23:00:39 +00:00
|
|
|
match match Uuid::parse_str(id) {
|
|
|
|
|
Ok(uuid) => sqlx::query_as::<Postgres, PKSystem>(
|
|
|
|
|
"select * from systems where uuid = $1",
|
|
|
|
|
)
|
|
|
|
|
.bind(uuid),
|
2025-06-09 20:14:38 +00:00
|
|
|
Err(_) => match id.parse::<i64>() {
|
|
|
|
|
Ok(parsed) => sqlx::query_as::<Postgres, PKSystem>(
|
|
|
|
|
"select * from systems where id = (select system from accounts where uid = $1)"
|
|
|
|
|
)
|
|
|
|
|
.bind(parsed),
|
|
|
|
|
Err(_) => sqlx::query_as::<Postgres, PKSystem>(
|
|
|
|
|
"select * from systems where hid = $1",
|
|
|
|
|
)
|
|
|
|
|
.bind(parse_hid(id))
|
|
|
|
|
},
|
2025-05-28 23:00:39 +00:00
|
|
|
}
|
|
|
|
|
.fetch_optional(&ctx.db)
|
|
|
|
|
.await
|
|
|
|
|
{
|
|
|
|
|
Ok(Some(system)) => {
|
|
|
|
|
req.extensions_mut().insert(system);
|
|
|
|
|
}
|
|
|
|
|
Ok(None) => {
|
|
|
|
|
return json_err(
|
|
|
|
|
StatusCode::NOT_FOUND,
|
|
|
|
|
r#"{"message":"System not found.","code":20001}"#.to_string(),
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
Err(err) => {
|
|
|
|
|
error!(?err, ?id, "failed to query system from path in db");
|
|
|
|
|
return json_err(
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
r#"{"message": "500: Internal Server Error", "code": 0}"#
|
|
|
|
|
.to_string(),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"member_id" => {}
|
|
|
|
|
"group_id" => {}
|
|
|
|
|
"switch_id" => {}
|
|
|
|
|
"guild_id" => {}
|
|
|
|
|
_ => {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
next.run(req).await
|
|
|
|
|
}
|