refactor(request): replace 'session' with 'envelope' for request ID handling
ZhenYi committed
Modified lib/infra/api/src/middleware.rs lib/infra/api/src/middleware.rs +6 −41 View lib/infra/api/src/middleware.rs
@@ -1,38 +1,13 @@
1use std::future::Future;
2
31use actix_web::body::{BoxBody, MessageBody};
42use actix_web::dev::{ServiceRequest, ServiceResponse};
53use actix_web::http::header::{HeaderName, HeaderValue};
64use actix_web::middleware::Next;
75use actix_web::{Error, HttpMessage};
8use uuid::Uuid;
9
10pub use envelope::context::resolve_request_id;
11
12pub const REQUEST_ID_HEADER: HeaderName = HeaderName::from_static("x-request-id");
13
14#[derive(Debug, Clone)]
15pub struct RequestId(pub String);
16
17/// The request id of the request currently being handled, when one is set.
18pub fn request_id() -> Option<String> {
19 envelope::context::request_id()
20}
216
22/// Runs `future` with `request_id` available to nested code, so queue
23/// consumers keep the id of the request that produced the message.
24pub async fn with_request_id<F: Future>(request_id: Option<&str>, future: F) -> F::Output {
25 match request_id {
26 Some(request_id) => {
27 envelope::context::with_request_id(request_id.to_string(), future).await
28 }
29 None => future.await,
30 }
31}
7pub use envelope::RequestId;
8pub use envelope::context::{request_id, resolve_request_id, with_request_id};
329
33pub fn new_request_id() -> String {
34 Uuid::now_v7().to_string()
35}
10pub const REQUEST_ID_HEADER: HeaderName = HeaderName::from_static(envelope::REQUEST_ID_HEADER);
3611
3712pub async fn trace_request<B>(
3813 request: ServiceRequest,
@@ -41,22 +16,12 @@
4116where
4217 B: MessageBody + 'static,
4318{
44 let request_id = request
45 .extensions()
46 .get::<::session::RequestId>()
47 .map(|value| value.0.clone())
48 .or_else(|| ::session::validate_request_id(header(&request)))
49 .unwrap_or_else(new_request_id);
19 let request_id = RequestId::from_header(header(&request));
5020
51 request
52 .extensions_mut()
53 .insert(RequestId(request_id.clone()));
54 request
55 .extensions_mut()
56 .insert(::session::RequestId(request_id.clone()));
21 request.extensions_mut().insert(request_id.clone());
5722
5823 let response =
59 envelope::context::with_request_id(request_id.clone(), next.call(request)).await?;
24 envelope::context::with_request_id(Some(request_id.as_str()), next.call(request)).await?;
6025 let mut response = response.map_into_boxed_body();
6126 if let Ok(value) = HeaderValue::try_from(request_id.as_str()) {
6227 response.headers_mut().insert(REQUEST_ID_HEADER, value);
Modified lib/infra/envelope/src/context.rs lib/infra/envelope/src/context.rs +13 −2 View lib/infra/envelope/src/context.rs
@@ -6,8 +6,19 @@
66 static REQUEST_ID: String;
77}
88
9pub async fn with_request_id<F: Future>(request_id: String, future: F) -> F::Output {
10 REQUEST_ID.scope(request_id, future).await
9pub async fn with_request_id<F, S>(request_id: Option<S>, future: F) -> F::Output
10where
11 F: Future,
12 S: AsRef<str>,
13{
14 match request_id {
15 Some(request_id) => {
16 REQUEST_ID
17 .scope(request_id.as_ref().to_owned(), future)
18 .await
19 }
20 None => future.await,
21 }
1122}
1223
1324pub fn request_id() -> Option<String> {
Modified lib/infra/envelope/src/lib.rs lib/infra/envelope/src/lib.rs +5 −0 View lib/infra/envelope/src/lib.rs
@@ -1,5 +1,10 @@
11pub mod context;
2pub mod request;
23pub mod response;
34
45pub use context::{request_id, resolve_request_id, with_request_id};
6pub use request::{
7 LEGACY_REQUEST_ID_HEADER, REQUEST_ID_HEADER, REQUEST_ID_MAX_LEN, RequestId, new_request_id,
8 validate_request_id,
9};
510pub use response::{Envelope, NoData};
Added lib/infra/envelope/src/request.rs lib/infra/envelope/src/request.rs +61 −0 View lib/infra/envelope/src/request.rs
@@ -0,0 +1,61 @@
1use std::future::{Ready, ready};
2
3use actix_web::dev::Payload;
4use actix_web::{FromRequest, HttpMessage, HttpRequest};
5use uuid::Uuid;
6
7pub const REQUEST_ID_HEADER: &str = "x-request-id";
8pub const LEGACY_REQUEST_ID_HEADER: &str = "gitdata-request-id";
9pub const REQUEST_ID_MAX_LEN: usize = 64;
10
11#[derive(Debug, Clone)]
12pub struct RequestId(pub String);
13
14impl RequestId {
15 pub fn from_header(value: Option<&str>) -> Self {
16 Self(
17 value
18 .and_then(validate_request_id)
19 .unwrap_or_else(new_request_id),
20 )
21 }
22
23 pub fn as_str(&self) -> &str {
24 &self.0
25 }
26}
27
28pub fn validate_request_id(value: &str) -> Option<String> {
29 let value = value.trim();
30 if value.is_empty() || value.len() > REQUEST_ID_MAX_LEN {
31 return None;
32 }
33 let allowed = value
34 .bytes()
35 .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_' | b'.' | b':'));
36 allowed.then(|| value.to_owned())
37}
38
39pub fn new_request_id() -> String {
40 Uuid::now_v7().to_string()
41}
42
43impl FromRequest for RequestId {
44 type Error = actix_web::Error;
45 type Future = Ready<Result<Self, Self::Error>>;
46
47 fn from_request(req: &HttpRequest, _payload: &mut Payload) -> Self::Future {
48 let request_id = req
49 .extensions()
50 .get::<RequestId>()
51 .cloned()
52 .unwrap_or_else(|| {
53 RequestId::from_header(
54 req.headers()
55 .get(REQUEST_ID_HEADER)
56 .and_then(|value| value.to_str().ok()),
57 )
58 });
59 ready(Ok(request_id))
60 }
61}
Modified lib/infra/envelope/Cargo.toml lib/infra/envelope/Cargo.toml +0 −1 View lib/infra/envelope/Cargo.toml
@@ -5,7 +5,6 @@
55
66[dependencies]
77config = { workspace = true }
8session = { workspace = true }
98actix-web = "4.16.0"
109bytes = { workspace = true }
1110futures-util = "0.3.34"
Modified lib/infra/internal/src/client.rs lib/infra/internal/src/client.rs +3 −2 View lib/infra/internal/src/client.rs
@@ -6,7 +6,8 @@
66use tonic::{Request, Status};
77
88use crate::error::InternalError;
9use crate::interceptor::{RPC_KEY_HEADER, new_request_id};
9use crate::interceptor::RPC_KEY_HEADER;
10use ::envelope::new_request_id;
1011
1112/// 到对端内部 RPC 的共享连接:统一注入 `x-rpc-key` 与请求号。
1213#[derive(Clone)]
@@ -84,7 +85,7 @@
8485 if let Ok(value) = MetadataValue::try_from(request_id) {
8586 request
8687 .metadata_mut()
87 .insert(crate::interceptor::REQUEST_ID_HEADER, value);
88 .insert(::envelope::REQUEST_ID_HEADER, value);
8889 }
8990 Ok(request)
9091 }
Modified lib/infra/internal/src/envelope.rs lib/infra/internal/src/envelope.rs +1 −1 View lib/infra/internal/src/envelope.rs
@@ -143,7 +143,7 @@
143143 sid: session_id.to_owned(),
144144 iat: issued_at,
145145 exp: expires_at,
146 nonce: crate::interceptor::new_request_id(),
146 nonce: ::envelope::new_request_id(),
147147 rid: request_id.to_owned(),
148148 };
149149 let plaintext = serde_json::to_vec(&claims)
Modified lib/infra/internal/src/interceptor.rs lib/infra/internal/src/interceptor.rs +12 −27 View lib/infra/internal/src/interceptor.rs
@@ -3,48 +3,29 @@
33use tonic::metadata::MetadataMap;
44use tonic::service::Interceptor as TonicInterceptor;
55use tonic::{Request, Status};
6use uuid::Uuid;
76
87pub const RPC_KEY_HEADER: &str = "x-rpc-key";
9pub const REQUEST_ID_HEADER: &str = "x-request-id";
10pub const LEGACY_REQUEST_ID_HEADER: &str = "gitdata-request-id";
118pub const CALLER_SERVICE_HEADER: &str = "gitdata-service-id";
12pub const MAX_REQUEST_ID_LEN: usize = 64;
139
1410/// 门禁通过后挂到请求扩展上的元信息;只用于日志与审计。
15#[derive(Debug, Clone, Default)]
11#[derive(Debug, Clone)]
1612pub struct RequestMeta {
17 pub request_id: String,
13 pub request_id: ::envelope::RequestId,
1814 pub caller_service: String,
1915}
2016
2117impl RequestMeta {
2218 pub fn request_id(&self) -> Option<&str> {
23 (!self.request_id.is_empty()).then_some(self.request_id.as_str())
19 (!self.request_id.0.is_empty()).then_some(self.request_id.as_str())
2420 }
2521}
2622
27pub fn validate_request_id(value: &str) -> Option<String> {
28 let trimmed = value.trim();
29 if trimmed.is_empty() || trimmed.len() > MAX_REQUEST_ID_LEN {
30 return None;
31 }
32 trimmed
33 .bytes()
34 .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_' | b'.' | b':'))
35 .then(|| trimmed.to_owned())
36}
37
3823pub fn request_id_from(metadata: &MetadataMap) -> Option<String> {
3924 metadata
40 .get(REQUEST_ID_HEADER)
41 .or_else(|| metadata.get(LEGACY_REQUEST_ID_HEADER))
25 .get(::envelope::REQUEST_ID_HEADER)
26 .or_else(|| metadata.get(::envelope::LEGACY_REQUEST_ID_HEADER))
4227 .and_then(|value| value.to_str().ok())
43 .and_then(validate_request_id)
44}
45
46pub fn new_request_id() -> String {
47 Uuid::now_v7().to_string()
28 .and_then(::envelope::validate_request_id)
4829}
4930
5031/// 共享密钥门禁:校验 `x-rpc-key`,通过后把 `RequestMeta` 挂到请求扩展。
@@ -67,7 +48,9 @@
6748impl TonicInterceptor for Gate {
6849 fn call(&mut self, mut request: Request<()>) -> Result<Request<()>, Status> {
6950 let metadata = request.metadata().clone();
70 let request_id = request_id_from(&metadata);
51 let request_id = ::envelope::context::request_id()
52 .and_then(|value| ::envelope::validate_request_id(&value))
53 .or_else(|| request_id_from(&metadata));
7154 if !self.is_armed() {
7255 return Err(unauthorized(
7356 "rpc gate is not configured",
@@ -88,7 +71,9 @@
8871 ));
8972 }
9073 let meta = RequestMeta {
91 request_id: request_id.unwrap_or_else(new_request_id),
74 request_id: ::envelope::RequestId(
75 request_id.unwrap_or_else(::envelope::new_request_id),
76 ),
9277 caller_service: metadata
9378 .get(CALLER_SERVICE_HEADER)
9479 .and_then(|value| value.to_str().ok())
Modified lib/infra/internal/Cargo.toml lib/infra/internal/Cargo.toml +1 −0 View lib/infra/internal/Cargo.toml
@@ -9,6 +9,7 @@
99axum = "0.8"
1010cache = { workspace = true }
1111config = { workspace = true }
12envelope = { workspace = true }
1213futures-util = { workspace = true }
1314crypt = { workspace = true }
1415hmac = { workspace = true }
Modified lib/infra/oltp/src/actix.rs lib/infra/oltp/src/actix.rs +4 −7 View lib/infra/oltp/src/actix.rs
@@ -70,13 +70,10 @@
7070 let metrics = self.metrics;
7171 let method = request.method().as_str().to_owned();
7272 let path = request.path().to_owned();
73 let request_id = envelope::context::request_id()
74 .or_else(|| {
75 request
76 .extensions()
77 .get::<session::RequestId>()
78 .map(|value| value.0.clone())
79 })
73 let request_id = request
74 .extensions()
75 .get::<envelope::RequestId>()
76 .map(|value| value.0.clone())
8077 .filter(|value| !value.is_empty())
8178 .unwrap_or_default();
8279 let traceparent = request
Modified lib/infra/oltp/src/client.rs lib/infra/oltp/src/client.rs +4 −1 View lib/infra/oltp/src/client.rs
@@ -29,7 +29,10 @@
2929 if let Some(request_id) = envelope::context::request_id()
3030 && let Ok(value) = request_id.parse()
3131 {
32 headers.insert(http::header::HeaderName::from_static("x-request-id"), value);
32 headers.insert(
33 http::header::HeaderName::from_static(envelope::REQUEST_ID_HEADER),
34 value,
35 );
3336 }
3437
3538 let result = request
Modified lib/infra/oltp/src/grpc.rs lib/infra/oltp/src/grpc.rs +4 −8 View lib/infra/oltp/src/grpc.rs
@@ -11,19 +11,15 @@
1111use std::time::Instant;
1212
1313use bytes::Bytes;
14use envelope::{LEGACY_REQUEST_ID_HEADER, REQUEST_ID_HEADER, new_request_id, validate_request_id};
1415use http::header::{HeaderName, HeaderValue};
1516use http::{HeaderMap, Request, Response};
1617use http_body::{Body, Frame, SizeHint};
1718use tower::{Layer, Service};
1819use tracing::Instrument;
19use uuid::Uuid;
2020
2121/// 调用方身份头(可选,缺省表示匿名调用)。
2222const SERVICE_ID_HEADER: &str = "gitdata-service-id";
23/// 请求编号头,由调用方透传或由本服务生成。
24const REQUEST_ID_HEADER: &str = "x-request-id";
25/// 旧调用方沿用的请求编号头,仅作兼容读取。
26const LEGACY_REQUEST_ID_HEADER: &str = "gitdata-request-id";
2723const GRPC_STATUS: &str = "grpc-status";
2824
2925/// gRPC 请求日志层,通过 `tonic::transport::Server::layer` 装配。
@@ -64,8 +60,8 @@
6460 .get(REQUEST_ID_HEADER)
6561 .or_else(|| headers.get(LEGACY_REQUEST_ID_HEADER))
6662 .and_then(|value| value.to_str().ok())
67 .and_then(|value| session::validate_request_id(Some(value)))
68 .unwrap_or_else(|| Uuid::now_v7().to_string())
63 .and_then(validate_request_id)
64 .unwrap_or_else(new_request_id)
6965 };
7066 if let Ok(value) = HeaderValue::from_str(&request_id) {
7167 request
@@ -93,7 +89,7 @@
9389 let future = self.inner.call(request);
9490 let context_id = request_id.clone();
9591 Box::pin(envelope::context::with_request_id(
96 context_id,
92 Some(context_id),
9793 async move {
9894 let response = future.await?;
9995 let (mut parts, body) = response.into_parts();
Modified lib/infra/oltp/Cargo.toml lib/infra/oltp/Cargo.toml +0 −2 View lib/infra/oltp/Cargo.toml
@@ -5,7 +5,6 @@
55
66[dependencies]
77envelope = { workspace = true }
8session = { workspace = true }
98actix-web = "4.16.0"
109bytes = { workspace = true }
1110http = "1.5.0"
@@ -25,4 +24,3 @@
2524tracing = { workspace = true }
2625tracing-opentelemetry = { version = "0.33.0" }
2726tracing-subscriber = { version = "0.3.23", features = ["env-filter", "fmt"] }
28uuid = { workspace = true }
Modified lib/infra/session/src/extract.rs lib/infra/session/src/extract.rs +0 −48 View lib/infra/session/src/extract.rs
@@ -5,10 +5,6 @@
55
66use crate::state::Session;
77
8pub const REQUEST_ID_HEADER: &str = "x-request-id";
9
10pub const REQUEST_ID_MAX_LEN: usize = 64;
11
128impl FromRequest for Session {
139 type Error = actix_web::Error;
1410 type Future = Ready<Result<Self, Self::Error>>;
@@ -20,49 +16,5 @@
2016 "session is not initialized",
2117 ))),
2218 }
23 }
24}
25
26pub fn validate_request_id(value: Option<&str>) -> Option<String> {
27 let value = value?.trim();
28 if value.is_empty() || value.len() > REQUEST_ID_MAX_LEN {
29 return None;
30 }
31 let allowed = value
32 .bytes()
33 .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'-' | b'_' | b'.' | b':'));
34 allowed.then(|| value.to_owned())
35}
36
37#[derive(Debug, Clone)]
38pub struct RequestId(pub String);
39
40impl RequestId {
41 pub fn from_header(value: Option<&str>) -> Self {
42 Self(validate_request_id(value).unwrap_or_else(|| uuid::Uuid::now_v7().to_string()))
43 }
44
45 pub fn as_str(&self) -> &str {
46 &self.0
47 }
48}
49
50impl FromRequest for RequestId {
51 type Error = actix_web::Error;
52 type Future = Ready<Result<Self, Self::Error>>;
53
54 fn from_request(req: &HttpRequest, _payload: &mut Payload) -> Self::Future {
55 let request_id = req
56 .extensions()
57 .get::<RequestId>()
58 .cloned()
59 .unwrap_or_else(|| {
60 RequestId::from_header(
61 req.headers()
62 .get(REQUEST_ID_HEADER)
63 .and_then(|value| value.to_str().ok()),
64 )
65 });
66 ready(Ok(request_id))
6719 }
6820}
Modified lib/infra/session/src/guard.rs lib/infra/session/src/guard.rs +1 −2 View lib/infra/session/src/guard.rs
@@ -4,7 +4,6 @@
44use actix_web::{Error, HttpMessage};
55
66use crate::error::SessionError;
7use crate::extract::RequestId;
87use crate::state::Session;
98
109pub fn require_uid(session: &Session) -> Result<i64, SessionError> {
@@ -26,7 +25,7 @@
2625 if !authorized {
2726 let request_id = request
2827 .extensions()
29 .get::<RequestId>()
28 .get::<envelope::RequestId>()
3029 .map(|value| value.0.clone())
3130 .unwrap_or_default();
3231 let response = SessionError::Unauthorized.response(&request_id);
Modified lib/infra/session/src/lib.rs lib/infra/session/src/lib.rs +0 −1 View lib/infra/session/src/lib.rs
@@ -10,7 +10,6 @@
1010
1111pub use cookie::{clear_session_cookie, read_cookie, session_cookie};
1212pub use error::SessionError;
13pub use extract::{REQUEST_ID_HEADER, REQUEST_ID_MAX_LEN, RequestId, validate_request_id};
1413pub use guard::{require_uid, session_guard};
1514pub use key::{MAX_SESSION_KEY_LEN, SESSION_KEY_LEN, SessionKey};
1615pub use middleware::SessionMiddleware;
Modified lib/infra/session/src/middleware.rs lib/infra/session/src/middleware.rs +1 −20 View lib/infra/session/src/middleware.rs
@@ -2,7 +2,7 @@
22use actix_web::cookie::time::Duration;
33use actix_web::cookie::{Cookie, SameSite as CookieSameSite};
44use actix_web::dev::{Service, ServiceRequest, ServiceResponse, Transform, forward_ready};
5use actix_web::http::header::{HeaderName, HeaderValue, USER_AGENT};
5use actix_web::http::header::USER_AGENT;
66use actix_web::{HttpMessage, HttpResponse};
77use config::session::{SameSite, SessionConfig};
88use std::fmt;
@@ -11,7 +11,6 @@
1111use std::rc::Rc;
1212
1313use crate::error::SessionError;
14use crate::extract::{REQUEST_ID_HEADER, RequestId};
1514use crate::key::SessionKey;
1615use crate::state::{
1716 SESSION_CLIENT_ID, SESSION_CLIENT_IP, SESSION_USER_AGENT, SESSION_USER_ID, Session,
@@ -131,25 +130,7 @@
131130 }
132131 }
133132
134 let request_id = req
135 .extensions()
136 .get::<RequestId>()
137 .cloned()
138 .unwrap_or_else(|| {
139 RequestId::from_header(
140 req.headers()
141 .get(REQUEST_ID_HEADER)
142 .and_then(|value| value.to_str().ok()),
143 )
144 });
145 req.extensions_mut().insert(request_id.clone());
146
147133 let mut res = service.call(req).await?;
148
149 if let Ok(value) = HeaderValue::from_str(request_id.as_str()) {
150 res.headers_mut()
151 .insert(HeaderName::from_static(REQUEST_ID_HEADER), value);
152 }
153134
154135 let session = res
155136 .request()
Modified lib/infra/session/Cargo.toml lib/infra/session/Cargo.toml +1 −0 View lib/infra/session/Cargo.toml
@@ -6,6 +6,7 @@
66[dependencies]
77config = { workspace = true }
88cache = { workspace = true }
9envelope = { workspace = true }
910actix-web = "4.16.0"
1011bytes = { workspace = true }
1112rand = "0.10.3"
Modified lib/service/auth/src/handlers/challenge.rs lib/service/auth/src/handlers/challenge.rs +2 −2 View lib/service/auth/src/handlers/challenge.rs
@@ -1,6 +1,6 @@
11use crate::errors::ApiError;
22pub use crate::services::pow::*;
3use api::http::{Extension, State};
3use api::http::State;
44use api::middleware::RequestId;
55use api::rest::{AppResponseData, NoData};
66use session::Session;
@@ -30,7 +30,7 @@
3030pub async fn challenge(
3131 State(svc): State<crate::AuthService>,
3232 session: Session,
33 Extension(request_id): Extension<RequestId>,
33 request_id: RequestId,
3434) -> Result<AppResponseData<ChallengeResponse>, ApiError> {
3535 let challenge = svc.challenge(session, request_id.0).await?;
3636 Ok(AppResponseData::ok(challenge))
Modified lib/service/auth/src/handlers/identity_me.rs lib/service/auth/src/handlers/identity_me.rs +2 −2 View lib/service/auth/src/handlers/identity_me.rs
@@ -1,6 +1,6 @@
11use crate::errors::ApiError;
22use crate::services::me::MeResponse;
3use api::http::{Extension, State};
3use api::http::State;
44use api::middleware::RequestId;
55use api::rest::{AppResponseData, NoData};
66use session::Session;
@@ -21,7 +21,7 @@
2121pub async fn me(
2222 State(svc): State<crate::AuthService>,
2323 session: Session,
24 Extension(request_id): Extension<RequestId>,
24 request_id: RequestId,
2525) -> Result<AppResponseData<MeResponse>, ApiError> {
2626 let response = svc.me(session, request_id.0).await?;
2727 Ok(AppResponseData::ok(response))
Modified lib/service/auth/src/handlers/login.rs lib/service/auth/src/handlers/login.rs +5 −5 View lib/service/auth/src/handlers/login.rs
@@ -1,6 +1,6 @@
11use crate::errors::ApiError;
22pub use crate::services::login::*;
3use api::http::{Extension, Json, State};
3use api::http::{Json, State};
44use api::middleware::RequestId;
55use api::rest::{AppResponseData, NoData};
66use session::Session;
@@ -26,7 +26,7 @@
2626 State(svc): State<crate::AuthService>,
2727 session: Session,
2828 body: Json<UserLoginRequest>,
29 Extension(request_id): Extension<RequestId>,
29 request_id: RequestId,
3030) -> Result<AppResponseData<UserLoginResponse>, ApiError> {
3131 let response = svc.login(session, body.into_inner(), request_id.0).await?;
3232 Ok(AppResponseData::ok(response))
@@ -53,7 +53,7 @@
5353 State(svc): State<crate::AuthService>,
5454 session: Session,
5555 body: Json<LoginCodeRequest>,
56 Extension(request_id): Extension<RequestId>,
56 request_id: RequestId,
5757) -> Result<AppResponseData<LoginCodeResponse>, ApiError> {
5858 let response = svc
5959 .login_code(session, body.into_inner(), request_id.0)
@@ -82,7 +82,7 @@
8282 State(svc): State<crate::AuthService>,
8383 session: Session,
8484 body: Json<LoginCodeVerifyRequest>,
85 Extension(request_id): Extension<RequestId>,
85 request_id: RequestId,
8686) -> Result<AppResponseData<UserLoginResponse>, ApiError> {
8787 let response = svc
8888 .login_code_verify(session, body.into_inner(), request_id.0)
@@ -111,7 +111,7 @@
111111 State(svc): State<crate::AuthService>,
112112 session: Session,
113113 body: Json<LoginVerifyRequest>,
114 Extension(request_id): Extension<RequestId>,
114 request_id: RequestId,
115115) -> Result<AppResponseData<UserLoginResponse>, ApiError> {
116116 let response = svc
117117 .login_verify(session, body.into_inner(), request_id.0)
Modified lib/service/auth/src/handlers/logout.rs lib/service/auth/src/handlers/logout.rs +2 −2 View lib/service/auth/src/handlers/logout.rs
@@ -1,6 +1,6 @@
11use crate::errors::ApiError;
22pub use crate::services::logout::*;
3use api::http::{Extension, State};
3use api::http::State;
44use api::middleware::RequestId;
55use api::rest::{AppResponseData, NoData};
66use session::Session;
@@ -20,7 +20,7 @@
2020pub async fn logout(
2121 State(svc): State<crate::AuthService>,
2222 session: Session,
23 Extension(request_id): Extension<RequestId>,
23 request_id: RequestId,
2424) -> Result<AppResponseData<LogoutResponse>, ApiError> {
2525 let response = svc.logout(session, request_id.0).await?;
2626 Ok(AppResponseData::ok(response))
Modified lib/service/auth/src/handlers/password_reset.rs lib/service/auth/src/handlers/password_reset.rs +3 −3 View lib/service/auth/src/handlers/password_reset.rs
@@ -1,6 +1,6 @@
11use crate::errors::ApiError;
22pub use crate::services::password::*;
3use api::http::{Extension, Json, State};
3use api::http::{Json, State};
44use api::middleware::RequestId;
55use api::rest::{AppResponseData, NoData};
66use session::Session;
@@ -44,7 +44,7 @@
4444 State(svc): State<crate::AuthService>,
4545 session: Session,
4646 body: Json<PasswordResetRequest>,
47 Extension(request_id): Extension<RequestId>,
47 request_id: RequestId,
4848) -> Result<AppResponseData<PasswordResetResponse>, ApiError> {
4949 let user_agent = session.user_agent()?;
5050 let ip_addr = session.client_ip()?;
@@ -100,7 +100,7 @@
100100 State(svc): State<crate::AuthService>,
101101 session: Session,
102102 body: Json<PasswordResetConfirmRequest>,
103 Extension(request_id): Extension<RequestId>,
103 request_id: RequestId,
104104) -> Result<AppResponseData<PasswordResetConfirmResponse>, ApiError> {
105105 let user_agent = session.user_agent()?;
106106 let ip_addr = session.client_ip()?;
Modified lib/service/auth/src/handlers/register.rs lib/service/auth/src/handlers/register.rs +3 −3 View lib/service/auth/src/handlers/register.rs
@@ -1,6 +1,6 @@
11use crate::errors::ApiError;
22pub use crate::services::register::*;
3use api::http::{Extension, Json, State};
3use api::http::{Json, State};
44use api::middleware::RequestId;
55use api::rest::{AppResponseData, NoData};
66use session::Session;
@@ -50,7 +50,7 @@
5050 State(svc): State<crate::AuthService>,
5151 session: Session,
5252 body: Json<RegisterCodeRequest>,
53 Extension(request_id): Extension<RequestId>,
53 request_id: RequestId,
5454) -> Result<AppResponseData<RegisterCodeResponse>, ApiError> {
5555 let response = svc
5656 .send_register_code(session, body.into_inner(), request_id.0)
@@ -109,7 +109,7 @@
109109 State(svc): State<crate::AuthService>,
110110 session: Session,
111111 body: Json<UserRegisterRequest>,
112 Extension(request_id): Extension<RequestId>,
112 request_id: RequestId,
113113) -> Result<AppResponseData<UserRegisterResponse>, ApiError> {
114114 let user_agent = session.user_agent()?;
115115 let ip_addr = session.client_ip()?;
Modified lib/service/auth/src/rpc/mod.rs lib/service/auth/src/rpc/mod.rs +6 −2 View lib/service/auth/src/rpc/mod.rs
@@ -41,7 +41,7 @@
4141 }
4242 let principal = self
4343 .service
44 .resolve_internal_session(&request.credential, &meta.request_id)
44 .resolve_internal_session(&request.credential, meta.request_id.as_str())
4545 .await
4646 .map_err(status_of)?;
4747 Ok(Response::new(ResolveIdentityResponse {
@@ -57,7 +57,11 @@
5757 let request = request.into_inner();
5858 let principal = self
5959 .service
60 .attest_internal_identity(request.user_id, request.security_version, &meta.request_id)
60 .attest_internal_identity(
61 request.user_id,
62 request.security_version,
63 meta.request_id.as_str(),
64 )
6165 .await
6266 .map_err(status_of)?;
6367 Ok(Response::new(AttestIdentityResponse {
Modified lib/service/auth/src/share/audit.rs lib/service/auth/src/share/audit.rs +1 −1 View lib/service/auth/src/share/audit.rs
@@ -9,7 +9,7 @@
99use crate::errors::AuthResult;
1010
1111pub fn current_request_id() -> String {
12 envelope::context::request_id().unwrap_or_else(|| uuid::Uuid::now_v7().to_string())
12 envelope::context::request_id().unwrap_or_else(envelope::new_request_id)
1313}
1414
1515/// 写一条用户事件;事件总线之外的持久审计兜底。
Modified lib/service/space/src/handlers/space_admin.rs lib/service/space/src/handlers/space_admin.rs +39 −39 View lib/service/space/src/handlers/space_admin.rs
@@ -7,7 +7,7 @@
77 RoleSummary, SetMemberRoleBody, SetRolePermissionsBody, UpdateBanBody, UpdateMemberBody,
88 UpdateOrganizationBody,
99};
10use api::http::{Extension, Json, Path, Query, State};
10use api::http::{Json, Path, Query, State};
1111use api::middleware::RequestId;
1212use api::rest::{AppResponseData, NoData};
1313use session::Session;
@@ -144,7 +144,7 @@
144144pub async fn create_space(
145145 State(svc): State<SpaceService>,
146146 session: Session,
147 Extension(request_id): Extension<RequestId>,
147 request_id: RequestId,
148148 body: Json<CreateOrganizationBody>,
149149) -> Result<AppResponseData<OrganizationSummary>, ApiError> {
150150 let user_id = svc
@@ -172,7 +172,7 @@
172172pub async fn list_spaces(
173173 State(svc): State<SpaceService>,
174174 session: Session,
175 Extension(request_id): Extension<RequestId>,
175 request_id: RequestId,
176176 Query(query): Query<OrgListQuery>,
177177) -> Result<AppResponseData<Vec<OrganizationSummary>>, ApiError> {
178178 let user_id = svc
@@ -207,7 +207,7 @@
207207pub async fn get_space(
208208 State(svc): State<SpaceService>,
209209 session: Session,
210 Extension(request_id): Extension<RequestId>,
210 request_id: RequestId,
211211 Path(path): Path<SpacePath>,
212212) -> Result<AppResponseData<OrganizationSummary>, ApiError> {
213213 let user_id = svc
@@ -239,7 +239,7 @@
239239pub async fn update_space(
240240 State(svc): State<SpaceService>,
241241 session: Session,
242 Extension(request_id): Extension<RequestId>,
242 request_id: RequestId,
243243 Path(path): Path<SpacePath>,
244244 body: Json<UpdateOrganizationBody>,
245245) -> Result<AppResponseData<OrganizationSummary>, ApiError> {
@@ -276,7 +276,7 @@
276276pub async fn archive_space(
277277 State(svc): State<SpaceService>,
278278 session: Session,
279 Extension(request_id): Extension<RequestId>,
279 request_id: RequestId,
280280 Path(path): Path<SpacePath>,
281281 body: Json<ReasonBody>,
282282) -> Result<AppResponseData<OrganizationSummary>, ApiError> {
@@ -312,7 +312,7 @@
312312pub async fn restore_space(
313313 State(svc): State<SpaceService>,
314314 session: Session,
315 Extension(request_id): Extension<RequestId>,
315 request_id: RequestId,
316316 Path(path): Path<SpacePath>,
317317) -> Result<AppResponseData<OrganizationSummary>, ApiError> {
318318 let user_id = svc
@@ -347,7 +347,7 @@
347347pub async fn delete_space(
348348 State(svc): State<SpaceService>,
349349 session: Session,
350 Extension(request_id): Extension<RequestId>,
350 request_id: RequestId,
351351 Path(path): Path<SpacePath>,
352352 Query(query): Query<DeleteOrgQuery>,
353353) -> Result<AppResponseData<bool>, ApiError> {
@@ -386,7 +386,7 @@
386386pub async fn transfer_ownership(
387387 State(svc): State<SpaceService>,
388388 session: Session,
389 Extension(request_id): Extension<RequestId>,
389 request_id: RequestId,
390390 Path(path): Path<SpacePath>,
391391 body: Json<TransferBody>,
392392) -> Result<AppResponseData<OrganizationSummary>, ApiError> {
@@ -426,7 +426,7 @@
426426pub async fn list_members(
427427 State(svc): State<SpaceService>,
428428 session: Session,
429 Extension(request_id): Extension<RequestId>,
429 request_id: RequestId,
430430 Path(path): Path<SpacePath>,
431431 Query(query): Query<MemberListQuery>,
432432) -> Result<AppResponseData<Vec<MemberSummary>>, ApiError> {
@@ -468,7 +468,7 @@
468468pub async fn get_member(
469469 State(svc): State<SpaceService>,
470470 session: Session,
471 Extension(request_id): Extension<RequestId>,
471 request_id: RequestId,
472472 Path(path): Path<SpaceMemberPath>,
473473) -> Result<AppResponseData<MemberSummary>, ApiError> {
474474 let user_id = svc
@@ -505,7 +505,7 @@
505505pub async fn update_self_member(
506506 State(svc): State<SpaceService>,
507507 session: Session,
508 Extension(request_id): Extension<RequestId>,
508 request_id: RequestId,
509509 Path(path): Path<SpacePath>,
510510 body: Json<UpdateMemberBody>,
511511) -> Result<AppResponseData<MemberSummary>, ApiError> {
@@ -546,7 +546,7 @@
546546pub async fn update_member(
547547 State(svc): State<SpaceService>,
548548 session: Session,
549 Extension(request_id): Extension<RequestId>,
549 request_id: RequestId,
550550 Path(path): Path<SpaceMemberPath>,
551551 body: Json<UpdateMemberBody>,
552552) -> Result<AppResponseData<MemberSummary>, ApiError> {
@@ -585,7 +585,7 @@
585585pub async fn add_member(
586586 State(svc): State<SpaceService>,
587587 session: Session,
588 Extension(request_id): Extension<RequestId>,
588 request_id: RequestId,
589589 Path(path): Path<SpacePath>,
590590 body: Json<AddMemberBody>,
591591) -> Result<AppResponseData<MemberSummary>, ApiError> {
@@ -625,7 +625,7 @@
625625pub async fn remove_member(
626626 State(svc): State<SpaceService>,
627627 session: Session,
628 Extension(request_id): Extension<RequestId>,
628 request_id: RequestId,
629629 Path(path): Path<SpaceMemberPath>,
630630 Query(query): Query<ReasonBody>,
631631) -> Result<AppResponseData<bool>, ApiError> {
@@ -663,7 +663,7 @@
663663pub async fn leave_organization(
664664 State(svc): State<SpaceService>,
665665 session: Session,
666 Extension(request_id): Extension<RequestId>,
666 request_id: RequestId,
667667 Path(path): Path<SpacePath>,
668668) -> Result<AppResponseData<bool>, ApiError> {
669669 let user_id = svc
@@ -698,7 +698,7 @@
698698pub async fn set_member_role(
699699 State(svc): State<SpaceService>,
700700 session: Session,
701 Extension(request_id): Extension<RequestId>,
701 request_id: RequestId,
702702 Path(path): Path<SpaceMemberPath>,
703703 body: Json<SetMemberRoleBody>,
704704) -> Result<AppResponseData<MemberSummary>, ApiError> {
@@ -739,7 +739,7 @@
739739pub async fn ban_member(
740740 State(svc): State<SpaceService>,
741741 session: Session,
742 Extension(request_id): Extension<RequestId>,
742 request_id: RequestId,
743743 Path(path): Path<SpaceMemberPath>,
744744 body: Json<BanMemberBody>,
745745) -> Result<AppResponseData<MemberSummary>, ApiError> {
@@ -779,7 +779,7 @@
779779pub async fn unban_member(
780780 State(svc): State<SpaceService>,
781781 session: Session,
782 Extension(request_id): Extension<RequestId>,
782 request_id: RequestId,
783783 Path(path): Path<SpaceMemberPath>,
784784) -> Result<AppResponseData<MemberSummary>, ApiError> {
785785 let user_id = svc
@@ -818,7 +818,7 @@
818818pub async fn list_bans(
819819 State(svc): State<SpaceService>,
820820 session: Session,
821 Extension(request_id): Extension<RequestId>,
821 request_id: RequestId,
822822 Path(path): Path<SpacePath>,
823823 Query(query): Query<MemberListQuery>,
824824) -> Result<AppResponseData<Vec<MemberSummary>>, ApiError> {
@@ -858,7 +858,7 @@
858858pub async fn get_ban(
859859 State(svc): State<SpaceService>,
860860 session: Session,
861 Extension(request_id): Extension<RequestId>,
861 request_id: RequestId,
862862 Path(path): Path<SpaceBanPath>,
863863) -> Result<AppResponseData<MemberSummary>, ApiError> {
864864 let user_id = svc
@@ -892,7 +892,7 @@
892892pub async fn update_ban(
893893 State(svc): State<SpaceService>,
894894 session: Session,
895 Extension(request_id): Extension<RequestId>,
895 request_id: RequestId,
896896 Path(path): Path<SpaceBanPath>,
897897 body: Json<UpdateBanBody>,
898898) -> Result<AppResponseData<MemberSummary>, ApiError> {
@@ -932,7 +932,7 @@
932932pub async fn unban_by_user(
933933 State(svc): State<SpaceService>,
934934 session: Session,
935 Extension(request_id): Extension<RequestId>,
935 request_id: RequestId,
936936 Path(path): Path<SpaceBanPath>,
937937) -> Result<AppResponseData<MemberSummary>, ApiError> {
938938 let user_id = svc
@@ -969,7 +969,7 @@
969969pub async fn set_member_permissions(
970970 State(svc): State<SpaceService>,
971971 session: Session,
972 Extension(request_id): Extension<RequestId>,
972 request_id: RequestId,
973973 Path(path): Path<SpaceMemberPath>,
974974 body: Json<SetRolePermissionsBody>,
975975) -> Result<AppResponseData<Vec<String>>, ApiError> {
@@ -1007,7 +1007,7 @@
10071007pub async fn list_roles(
10081008 State(svc): State<SpaceService>,
10091009 session: Session,
1010 Extension(request_id): Extension<RequestId>,
1010 request_id: RequestId,
10111011 Path(path): Path<SpacePath>,
10121012) -> Result<AppResponseData<Vec<RoleSummary>>, ApiError> {
10131013 let user_id = svc
@@ -1040,7 +1040,7 @@
10401040pub async fn get_role(
10411041 State(svc): State<SpaceService>,
10421042 session: Session,
1043 Extension(request_id): Extension<RequestId>,
1043 request_id: RequestId,
10441044 Path(path): Path<SpaceRolePath>,
10451045) -> Result<AppResponseData<RoleSummary>, ApiError> {
10461046 let user_id = svc
@@ -1071,7 +1071,7 @@
10711071pub async fn create_role(
10721072 State(svc): State<SpaceService>,
10731073 session: Session,
1074 Extension(request_id): Extension<RequestId>,
1074 request_id: RequestId,
10751075 Path(path): Path<SpacePath>,
10761076 body: Json<CreateRoleBody>,
10771077) -> Result<AppResponseData<RoleSummary>, ApiError> {
@@ -1111,7 +1111,7 @@
11111111pub async fn update_role(
11121112 State(svc): State<SpaceService>,
11131113 session: Session,
1114 Extension(request_id): Extension<RequestId>,
1114 request_id: RequestId,
11151115 Path(path): Path<SpaceRolePath>,
11161116 body: Json<UpdateRoleBody>,
11171117) -> Result<AppResponseData<RoleSummary>, ApiError> {
@@ -1157,7 +1157,7 @@
11571157pub async fn delete_role(
11581158 State(svc): State<SpaceService>,
11591159 session: Session,
1160 Extension(request_id): Extension<RequestId>,
1160 request_id: RequestId,
11611161 Path(path): Path<SpaceRolePath>,
11621162) -> Result<AppResponseData<bool>, ApiError> {
11631163 let user_id = svc
@@ -1191,7 +1191,7 @@
11911191pub async fn set_role_permissions(
11921192 State(svc): State<SpaceService>,
11931193 session: Session,
1194 Extension(request_id): Extension<RequestId>,
1194 request_id: RequestId,
11951195 Path(path): Path<SpaceRolePath>,
11961196 body: Json<SetRolePermissionsBody>,
11971197) -> Result<AppResponseData<RoleSummary>, ApiError> {
@@ -1235,7 +1235,7 @@
12351235pub async fn assign_role(
12361236 State(svc): State<SpaceService>,
12371237 session: Session,
1238 Extension(request_id): Extension<RequestId>,
1238 request_id: RequestId,
12391239 Path(path): Path<SpacePath>,
12401240 body: Json<AssignRoleBody>,
12411241) -> Result<AppResponseData<Vec<String>>, ApiError> {
@@ -1273,7 +1273,7 @@
12731273pub async fn unassign_role(
12741274 State(svc): State<SpaceService>,
12751275 session: Session,
1276 Extension(request_id): Extension<RequestId>,
1276 request_id: RequestId,
12771277 Path(path): Path<SpacePath>,
12781278 body: Json<AssignRoleBody>,
12791279) -> Result<AppResponseData<Vec<String>>, ApiError> {
@@ -1313,7 +1313,7 @@
13131313pub async fn join_role(
13141314 State(svc): State<SpaceService>,
13151315 session: Session,
1316 Extension(request_id): Extension<RequestId>,
1316 request_id: RequestId,
13171317 Path(path): Path<SpaceRolePath>,
13181318) -> Result<AppResponseData<MemberSummary>, ApiError> {
13191319 let user_id = svc
@@ -1346,7 +1346,7 @@
13461346pub async fn leave_role(
13471347 State(svc): State<SpaceService>,
13481348 session: Session,
1349 Extension(request_id): Extension<RequestId>,
1349 request_id: RequestId,
13501350 Path(path): Path<SpaceRolePath>,
13511351) -> Result<AppResponseData<MemberSummary>, ApiError> {
13521352 let user_id = svc
@@ -1377,7 +1377,7 @@
13771377pub async fn check_permission(
13781378 State(svc): State<SpaceService>,
13791379 session: Session,
1380 Extension(request_id): Extension<RequestId>,
1380 request_id: RequestId,
13811381 Path(path): Path<SpacePath>,
13821382 body: Json<CheckPermissionBody>,
13831383) -> Result<AppResponseData<PermissionCheck>, ApiError> {
@@ -1416,7 +1416,7 @@
14161416pub async fn create_invite(
14171417 State(svc): State<SpaceService>,
14181418 session: Session,
1419 Extension(request_id): Extension<RequestId>,
1419 request_id: RequestId,
14201420 Path(path): Path<SpacePath>,
14211421 body: Json<CreateInviteBody>,
14221422) -> Result<AppResponseData<CreateInviteResponse>, ApiError> {
@@ -1459,7 +1459,7 @@
14591459pub async fn list_invites(
14601460 State(svc): State<SpaceService>,
14611461 session: Session,
1462 Extension(request_id): Extension<RequestId>,
1462 request_id: RequestId,
14631463 Path(path): Path<SpacePath>,
14641464 Query(query): Query<OrgListQuery>,
14651465) -> Result<AppResponseData<Vec<InviteSummary>>, ApiError> {
@@ -1500,7 +1500,7 @@
15001500pub async fn revoke_invite(
15011501 State(svc): State<SpaceService>,
15021502 session: Session,
1503 Extension(request_id): Extension<RequestId>,
1503 request_id: RequestId,
15041504 Path(path): Path<SpaceInvitePath>,
15051505) -> Result<AppResponseData<bool>, ApiError> {
15061506 let user_id = svc
@@ -1537,7 +1537,7 @@
15371537pub async fn redeem_invite(
15381538 State(svc): State<SpaceService>,
15391539 session: Session,
1540 Extension(request_id): Extension<RequestId>,
1540 request_id: RequestId,
15411541 body: Json<RedeemInviteBody>,
15421542) -> Result<AppResponseData<RedeemInviteResponse>, ApiError> {
15431543 let user_id = svc
Modified lib/service/user/src/handlers/ssh_key.rs lib/service/user/src/handlers/ssh_key.rs +4 −4 View lib/service/user/src/handlers/ssh_key.rs
@@ -1,6 +1,6 @@
11use crate::errors::ApiError;
22use crate::services::ssh_key::types::{SshKeyAddRequest, SshKeySummary};
3use api::http::{Extension, Json, Path, Query, State};
3use api::http::{Json, Path, Query, State};
44use api::middleware::RequestId;
55use api::rest::{AppResponseData, NoData};
66use auth::share::types::ListQuery;
@@ -43,7 +43,7 @@
4343 State(svc): State<crate::services::service::UserService>,
4444 session: Session,
4545 Query(query): Query<ListQuery>,
46 Extension(request_id): Extension<RequestId>,
46 request_id: RequestId,
4747) -> Result<AppResponseData<Vec<SshKeySummary>>, ApiError> {
4848 let svc = crate::services::ssh_key::SshKeyService::new(svc.accounts.clone());
4949 let keys = svc.list_ssh_keys(session, query, request_id.0).await?;
@@ -95,7 +95,7 @@
9595 State(svc): State<crate::services::service::UserService>,
9696 session: Session,
9797 body: Json<SshKeyAddRequest>,
98 Extension(request_id): Extension<RequestId>,
98 request_id: RequestId,
9999) -> Result<AppResponseData<SshKeySummary>, ApiError> {
100100 let svc = crate::services::ssh_key::SshKeyService::new(svc.accounts.clone());
101101 let user_agent = session.user_agent()?;
@@ -154,7 +154,7 @@
154154 State(svc): State<crate::services::service::UserService>,
155155 session: Session,
156156 Path(key_id): Path<Uuid>,
157 Extension(request_id): Extension<RequestId>,
157 request_id: RequestId,
158158) -> Result<AppResponseData<NoData>, ApiError> {
159159 let svc = crate::services::ssh_key::SshKeyService::new(svc.accounts.clone());
160160 let user_agent = session.user_agent()?;
Modified lib/share/events/src/rpc/mod.rs lib/share/events/src/rpc/mod.rs +1 −1 View lib/share/events/src/rpc/mod.rs
@@ -78,7 +78,7 @@
7878 properties,
7979 body,
8080 request.personal,
81 &meta.request_id,
81 meta.request_id.as_str(),
8282 )
8383 .await?;
8484 Ok(Response::new(PublishResponse {
Modified Cargo.lock Cargo.lock +2 −3 View Cargo.lock
@@ -2352,7 +2352,6 @@
23522352 "futures-util",
23532353 "serde",
23542354 "serde_json",
2355 "session",
23562355 "tokio",
23572356 "tracing",
23582357 "utoipa 5.5.0",
@@ -3643,6 +3642,7 @@
36433642 "cache",
36443643 "config 1.0.0",
36453644 "crypt",
3645 "envelope",
36463646 "futures-util",
36473647 "hmac 0.13.0",
36483648 "http 1.5.0",
@@ -4869,7 +4869,6 @@
48694869 "opentelemetry-otlp",
48704870 "opentelemetry_sdk",
48714871 "reqwest 0.12.28",
4872 "session",
48734872 "thiserror 2.0.21",
48744873 "tokio",
48754874 "tonic",
@@ -4877,7 +4876,6 @@
48774876 "tracing",
48784877 "tracing-opentelemetry",
48794878 "tracing-subscriber",
4880 "uuid",
48814879]
48824880
48834881[[package]]
@@ -7095,6 +7093,7 @@
70957093 "bytes",
70967094 "cache",
70977095 "config 1.0.0",
7096 "envelope",
70987097 "rand 0.10.3",
70997098 "serde",
71007099 "serde_json",