feat: 统一 JSON API 到 /v1 前缀,移除旧邮件兼容路由

- 删除旧邮件查询兼容路由 GET /mail-api/messages、/mail-api/messages/{id}、/mail-api/search
- 所有 JSON API 统一使用 /v1/...:邮件、上下文记忆、动态页面创建和健康检查接口
- 页面路由保持非 /v1 地址:/mail、/mail/messages/{id}、/mail/{slug}、/web/{page_type}/{slug}、/updates
- AI 内部工具调用同步改用 /v1/web/pages 与 /v1/context/memories...
- 无数据库结构变化,新增 0.1.14 升级日志记录
This commit is contained in:
2026-07-06 21:39:56 +08:00
parent 25dd0daa8b
commit 2669861af1
29 changed files with 1845 additions and 89 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "ias-service"
version = "0.1.0"
version = "0.1.1"
edition = "2024"
[dependencies]
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.1.8',
'2026-07-06T00:00:00+08:00',
'邮件账户修改与连通性检查 CLI',
'新增邮件账户修改和 IMAP 连通性检查命令,便于在不直接操作数据库的情况下维护邮箱配置并确认服务器可访问。',
'[
"新增 ias mail edit <id> 命令,可交互式修改已保存的 IMAP 邮件账户配置,密码留空时保留原值。",
"新增 ias mail check <id> 命令,可使用已保存配置检查 IMAP 服务器连通性和邮箱目录可访问性。",
"邮件账户检查成功会更新 last_checked_at 并清空 last_error,失败会记录错误信息。",
"复用新增账户时的 IMAP 连接测试逻辑,TLS 证书错误仍支持交互式选择接受无效证书后重试。",
"无数据库结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.0",
"ias-wechat": "0.1.0",
"ias-context": "0.1.0",
"ias-http": "0.1.0",
"ias-mail": "0.1.1",
"ias-service": "0.1.0",
"ias-main": "0.1.8"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.1.9',
'2026-07-06T00:00:00+08:00',
'邮件最近 20 封未读检查',
'调整邮件轮询策略,每轮读取邮箱最近 20 封邮件并基于 FLAGS 判断未读状态,仅对未读且未入库的邮件生成预览页并发送提醒。',
'[
"调整邮件轮询逻辑:每轮固定读取邮箱最近 20 封邮件,而不是仅搜索 UNSEEN 集合。",
"读取最近邮件时同步获取 FLAGS,只对未包含 \\Seen 标记的邮件入库、生成预览页并发送微信提醒。",
"邮件正文抓取改用 BODY.PEEK[],避免检查最近邮件时把未读邮件隐式标记为已读。",
"新增最近 20 封 sequence range 的单元测试,并通过 cargo test -p ias-mail 与 cargo check 验证。",
"无数据库结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.0",
"ias-wechat": "0.1.0",
"ias-context": "0.1.0",
"ias-http": "0.1.0",
"ias-mail": "0.1.2",
"ias-service": "0.1.0",
"ias-main": "0.1.9"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.1.10',
'2026-07-06T00:00:00+08:00',
'手动邮件拉取与版本更新链接修复',
'新增手动拉取最新邮件的 CLI 命令,并修复服务使用模块版本生成更新日志链接导致 /updates/0.1.0 不存在的问题。',
'[
"新增 ias mail pull [id] 命令,可手动拉取最近 20 封中的未读邮件;不传 id 时拉取所有启用邮件账户,传 id 时拉取指定账户。",
"手动拉取会复用后台轮询的解析、去重、入库和邮件预览页生成逻辑,并输出本次未读、新增和已存在数量。",
"修复服务启动和版本更新通知使用 ias-service crate 版本的问题,改为读取根目录 VERSION 作为整体项目版本。",
"修复版本更新通知可能链接到不存在的 /updates/0.1.0 页面的问题;本版本通知会指向 /updates/0.1.10。",
"无数据库结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.0",
"ias-wechat": "0.1.0",
"ias-context": "0.1.0",
"ias-http": "0.1.0",
"ias-mail": "0.1.3",
"ias-service": "0.1.1",
"ias-main": "0.1.10"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,34 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.1.11',
'2026-07-06T00:00:00+08:00',
'手动邮件拉取同步最近 20 封',
'修正手动邮件拉取命令的语义,使其抓取最近 20 封邮件并入库,同时保留后台轮询只提醒未读邮件的行为。',
'[
"修正 ias mail pull [id] 的手动拉取语义:现在会抓取最近 20 封邮件并入库,不再只处理未读邮件。",
"ias mail pull 输出新增扫描数量,便于确认 IMAP 确实返回了最近邮件;同时继续显示其中未读、新增和已存在数量。",
"后台邮件轮询保持只处理未读邮件并发送微信提醒,手动拉取不发送微信提醒。",
"无数据库结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.0",
"ias-wechat": "0.1.0",
"ias-context": "0.1.0",
"ias-http": "0.1.0",
"ias-mail": "0.1.4",
"ias-service": "0.1.1",
"ias-main": "0.1.11"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.1.12',
'2026-07-06T00:00:00+08:00',
'邮件 HTTP 查询服务增强',
'增强邮件 HTTP 查询接口,支持关键词、账户、邮箱目录、来源和分页查询,并新增查询语义别名路由。',
'[
"增强邮件 HTTP 查询服务:GET /mail-api/messages 支持关键词、账户、邮箱目录、来源和分页查询。",
"新增 GET /mail-api/search 作为邮件查询别名,便于客户端直接按查询语义调用。",
"邮件列表响应新增 page、per_page 和 total 字段,保留 limit 参数的兼容行为。",
"查询关键词 q 会匹配发件人、主题、摘要、正文和 Message-ID。",
"无数据库结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.0",
"ias-wechat": "0.1.0",
"ias-context": "0.1.0",
"ias-http": "0.1.0",
"ias-mail": "0.1.5",
"ias-service": "0.1.1",
"ias-main": "0.1.12"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.1.13',
'2026-07-06T00:00:00+08:00',
'邮件查询 API 与页面',
'新增 v1 邮件查询 API,并提供邮件列表和邮件预览页面,同时保留旧 mail-api 路由兼容已有调用。',
'[
"新增 GET /v1/mail/messages、GET /v1/mail/messages/{id} 和 GET /v1/mail/search,作为邮件查询 API 的新地址。",
"保留 GET /mail-api/messages、GET /mail-api/messages/{id} 和 GET /mail-api/search 兼容旧调用。",
"新增 GET /mail 邮件列表页面,支持关键词、账户、邮箱目录、来源和分页查询。",
"新增 GET /mail/messages/{id} 邮件预览页面,可查看邮件正文、元信息和原始头信息。",
"无数据库结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.0",
"ias-wechat": "0.1.0",
"ias-context": "0.1.0",
"ias-http": "0.1.0",
"ias-mail": "0.1.6",
"ias-service": "0.1.1",
"ias-main": "0.1.13"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.1.14',
'2026-07-06T00:00:00+08:00',
'统一 v1 API 路由',
'删除旧邮件查询兼容入口,并将 JSON API 统一迁移到 /v1 前缀;页面路由保持非 /v1 地址。',
'[
"删除旧邮件查询兼容路由 GET /mail-api/messages、GET /mail-api/messages/{id} 和 GET /mail-api/search。",
"所有 JSON API 统一使用 /v1/...:邮件、上下文记忆、动态页面创建和健康检查接口均迁移到新地址。",
"页面路由继续保持非 /v1 地址:/mail、/mail/messages/{id}、/mail/{slug}、/web/{page_type}/{slug} 和 /updates。",
"AI 内部工具调用同步改用 /v1/web/pages 与 /v1/context/memories...。",
"无数据库结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.1",
"ias-wechat": "0.1.0",
"ias-context": "0.1.1",
"ias-http": "0.1.1",
"ias-mail": "0.1.7",
"ias-service": "0.1.1",
"ias-main": "0.1.14"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
+7 -3
View File
@@ -30,7 +30,11 @@ use crate::channel::wechat::manager::init_wechat;
pub use core::supervisor;
pub use channel::wechat::manager::{delete_account, list_accounts, login_user, rename_account};
const CURRENT_VERSION: &str = env!("CARGO_PKG_VERSION");
const PROJECT_VERSION: &str = include_str!("../../VERSION");
fn current_version() -> &'static str {
PROJECT_VERSION.trim()
}
#[derive(Clone)]
pub struct AppState {
@@ -64,7 +68,7 @@ pub async fn run_service(pool: PgPool) -> anyhow::Result<()> {
anyhow::bail!("服务已在运行,PID: {}", snapshot.pid);
}
println!("{} v{} 已启动...", name, CURRENT_VERSION);
println!("{} v{} 已启动...", name, current_version());
let runtime = Arc::new(RuntimeState::new(host.clone()));
let (sender, receiver) = mpsc::channel::<QueueMessage>(100);
let state = AppState {
@@ -231,7 +235,7 @@ async fn send_version_update_notice(pool: &PgPool, manager: &WeChatMultiAccountM
return;
}
let version = CURRENT_VERSION;
let version = current_version();
match version_notice_already_sent(pool, version).await {
Ok(true) => return,
Ok(false) => {}