build: add server-rs check scripts
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
5. `/healthz`、`/api/*`、SSE 与静态资源兼容层装配
|
||||
6. 由 `../../scripts/dev.ps1` 与 `../../scripts/dev.sh` 驱动的本地开发启动链路
|
||||
7. 由 `../../scripts/test.ps1` 与 `../../scripts/test.sh` 驱动的本地测试链路
|
||||
8. 由 `../../scripts/check.ps1` 与 `../../scripts/check.sh` 驱动的本地统一检查链路
|
||||
|
||||
## 2. 当前阶段说明
|
||||
|
||||
@@ -73,6 +74,13 @@
|
||||
3. 当请求携带 `x-genarrative-response-envelope` 时,`/healthz` 会返回标准 success envelope。
|
||||
4. `x-request-id`、`x-api-version`、`x-route-version`、`x-response-time-ms` 会在 `/healthz` 响应中一并回写。
|
||||
|
||||
当前本地检查链路约定:
|
||||
|
||||
1. `../../scripts/check.ps1` 与 `../../scripts/check.sh` 统一串联 `cargo fmt --all --check`、`cargo clippy`、`cargo check`、`cargo test`。
|
||||
2. 默认检查整个 `server-rs` workspace,确保后续多 package 扩容时仍然保持统一口径。
|
||||
3. 当只需聚焦单个 package 时,可通过 `-Package` 或 `SERVER_RS_CHECK_PACKAGE` 收窄 `clippy / check / test` 目标。
|
||||
4. `cargo fmt --all --check` 仍固定覆盖整个 workspace,避免多 package 下格式基线漂移。
|
||||
|
||||
## 3. 边界约束
|
||||
|
||||
1. `api-server` 负责 HTTP、SSE、Cookie、Header、路由与协议装配。
|
||||
|
||||
@@ -99,8 +99,14 @@ mod tests {
|
||||
|
||||
assert_eq!(body["ok"], Value::Bool(true));
|
||||
assert_eq!(body["data"]["ok"], Value::String("value".to_string()));
|
||||
assert_eq!(body["meta"]["requestId"], Value::String("req-test".to_string()));
|
||||
assert_eq!(body["meta"]["routeVersion"], Value::String(API_VERSION.to_string()));
|
||||
assert_eq!(
|
||||
body["meta"]["requestId"],
|
||||
Value::String("req-test".to_string())
|
||||
);
|
||||
assert_eq!(
|
||||
body["meta"]["routeVersion"],
|
||||
Value::String(API_VERSION.to_string())
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -122,8 +128,14 @@ mod tests {
|
||||
};
|
||||
let body = json_error_body(Some(&request_context), &error).0;
|
||||
|
||||
assert_eq!(body["error"]["code"], Value::String("NOT_FOUND".to_string()));
|
||||
assert_eq!(body["meta"]["requestId"], Value::String("req-test".to_string()));
|
||||
assert_eq!(
|
||||
body["error"]["code"],
|
||||
Value::String("NOT_FOUND".to_string())
|
||||
);
|
||||
assert_eq!(
|
||||
body["meta"]["requestId"],
|
||||
Value::String("req-test".to_string())
|
||||
);
|
||||
assert!(body.get("ok").is_none());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,15 +77,24 @@ mod tests {
|
||||
|
||||
assert_eq!(response.status(), StatusCode::OK);
|
||||
assert_eq!(
|
||||
response.headers().get("x-request-id").and_then(|value| value.to_str().ok()),
|
||||
response
|
||||
.headers()
|
||||
.get("x-request-id")
|
||||
.and_then(|value| value.to_str().ok()),
|
||||
Some("req-health-legacy")
|
||||
);
|
||||
assert_eq!(
|
||||
response.headers().get("x-api-version").and_then(|value| value.to_str().ok()),
|
||||
response
|
||||
.headers()
|
||||
.get("x-api-version")
|
||||
.and_then(|value| value.to_str().ok()),
|
||||
Some("2026-04-08")
|
||||
);
|
||||
assert_eq!(
|
||||
response.headers().get("x-route-version").and_then(|value| value.to_str().ok()),
|
||||
response
|
||||
.headers()
|
||||
.get("x-route-version")
|
||||
.and_then(|value| value.to_str().ok()),
|
||||
Some("2026-04-08")
|
||||
);
|
||||
assert!(response.headers().contains_key("x-response-time-ms"));
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
use axum::{
|
||||
extract::Request,
|
||||
http::header::CONTENT_TYPE,
|
||||
middleware::Next,
|
||||
response::Response,
|
||||
};
|
||||
use axum::{extract::Request, http::header::CONTENT_TYPE, middleware::Next, response::Response};
|
||||
use tracing::{error, warn};
|
||||
|
||||
use crate::{
|
||||
|
||||
@@ -3,9 +3,7 @@ use serde_json::{json, Value};
|
||||
|
||||
use crate::{api_response::json_success_body, request_context::RequestContext};
|
||||
|
||||
pub async fn health_check(
|
||||
Extension(request_context): Extension<RequestContext>,
|
||||
) -> Json<Value> {
|
||||
pub async fn health_check(Extension(request_context): Extension<RequestContext>) -> Json<Value> {
|
||||
json_success_body(
|
||||
Some(&request_context),
|
||||
json!({
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mod app;
|
||||
mod api_response;
|
||||
mod app;
|
||||
mod config;
|
||||
mod error_middleware;
|
||||
mod health;
|
||||
|
||||
@@ -28,12 +28,10 @@ pub async fn propagate_request_id_header(request: Request, next: Next) -> Respon
|
||||
}
|
||||
|
||||
if let Ok(header_value) = HeaderValue::from_str(API_VERSION) {
|
||||
response
|
||||
.headers_mut()
|
||||
.insert(
|
||||
HeaderName::from_static(API_VERSION_HEADER),
|
||||
header_value.clone(),
|
||||
);
|
||||
response.headers_mut().insert(
|
||||
HeaderName::from_static(API_VERSION_HEADER),
|
||||
header_value.clone(),
|
||||
);
|
||||
response
|
||||
.headers_mut()
|
||||
.insert(HeaderName::from_static(ROUTE_VERSION_HEADER), header_value);
|
||||
|
||||
Reference in New Issue
Block a user