feat: 模块统一 ias- 前缀、独立版本与内网地址支持 (0.1.7)

- 所有 Rust crate 统一加 ias- 前缀:ai → ias-ai、common → ias-common、context → ias-context、mail → ias-mail、service → ias-service、wechat → ias-wechat
- 新增 ias-main 模块承载 CLI 入口和二进制打包
- 各模块开始独立维护版本号,ias-main 0.1.7 代表整体版本
- 新增 IA_WEB_INTERNAL_URL 环境变量,版本通知同时发送公网和内网链接
- 将已有升级日志翻译为中文
- ias_upgrade_logs 新增 modules JSONB 字段
- 新增 VERSION 文件和 CHANGELOG.md
- 新增 AGENTS.md 项目规则文件
This commit is contained in:
2026-07-06 17:57:48 +08:00
parent ed7f89d44f
commit 25dd0daa8b
91 changed files with 5546 additions and 777 deletions
+82
View File
@@ -0,0 +1,82 @@
use axum::extract::{Path, Query};
use axum::http::StatusCode;
use axum::routing::get;
use axum::{Extension, Json, Router};
use serde_json::{Value, json};
use sqlx::PgPool;
use crate::model::MailListQuery;
use crate::repository::MailRepository;
type ApiError = (StatusCode, Json<Value>);
#[derive(Clone)]
pub struct MailRouteState {
pub db: PgPool,
}
impl MailRouteState {
pub fn new(db: PgPool) -> Self {
Self { db }
}
}
pub fn routes<S>(db: PgPool) -> Router<S>
where
S: Clone + Send + Sync + 'static,
{
Router::new()
.route("/mail-api/messages", get(list_messages))
.route("/mail-api/messages/{id}", get(get_message))
.layer(Extension(MailRouteState::new(db)))
}
async fn list_messages(
Extension(state): Extension<MailRouteState>,
Query(query): Query<MailListQuery>,
) -> Result<Json<Value>, ApiError> {
let messages = MailRepository::list_recent(&state.db, query.limit.unwrap_or(20))
.await
.map_err(api_internal_error)?;
Ok(Json(json!({
"success": true,
"messages": messages,
})))
}
async fn get_message(
Extension(state): Extension<MailRouteState>,
Path(id): Path<i64>,
) -> Result<Json<Value>, ApiError> {
let message = MailRepository::find(&state.db, id)
.await
.map_err(api_internal_error)?
.ok_or_else(|| api_not_found("邮件记录不存在"))?;
Ok(Json(json!({
"success": true,
"message": message,
})))
}
fn api_not_found(message: impl Into<String>) -> ApiError {
(
StatusCode::NOT_FOUND,
Json(json!({
"success": false,
"message": message.into(),
})),
)
}
fn api_internal_error(error: anyhow::Error) -> ApiError {
eprintln!("mail 接口失败: {error}");
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(json!({
"success": false,
"message": "mail 接口失败",
})),
)
}