fix(health): 穷尽审计修复 — 权限同步/编译错误/前端bug/审计日志
Some checks failed
CI / frontend-build (push) Has been cancelled
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / security-audit (push) Has been cancelled

审计发现并修复的问题:

HIGH:
- H1: ConsultationDetail 使用 getSession(id) 替代错误的列表搜索
- H2: SessionResp 添加 version/updated_at 字段
- H3: 移除 FollowUpRecordList 调用不存在的导出端点
- H4: 新增 articles.ts 前端 API 模块

MEDIUM:
- M1: article delete 添加乐观锁 (expected_version)
- M2: 取消预约排班释放传播错误 (log::warn -> ?)
- M3: FollowUpTaskList 日期格式 Dayjs -> string
- M4: 补充 15 个缺失审计日志

LOW:
- L1: 替换 follow_up_service 中的 .unwrap()
- L2: PatientListItem 添加 version 字段

CRITICAL (新发现):
- 权限未同步: 健康模块 14 个权限从未写入数据库,添加启动时自动同步
- migration 表名错误: patients -> patient
- 编译错误: health_trend entity 未导入, ToPrimitive trait 未导入
- HealthError 缺少 From<AppError> 实现
This commit is contained in:
iven
2026-04-25 08:58:58 +08:00
parent 9ffb938128
commit 07f4ba41ba
31 changed files with 3373 additions and 445 deletions

View File

@@ -0,0 +1,88 @@
import client from '../client';
import type { PaginatedResponse } from '../types';
// --- Types ---
export interface ArticleListItem {
id: string;
title: string;
summary?: string;
cover_image?: string;
category?: string;
author?: string;
published_at?: string;
}
export interface Article extends ArticleListItem {
content?: string;
created_at: string;
updated_at: string;
version: number;
}
export interface CreateArticleReq {
title: string;
summary?: string;
content?: string;
cover_image?: string;
category?: string;
author?: string;
published_at?: string;
}
export interface UpdateArticleReq {
title?: string;
summary?: string;
content?: string;
cover_image?: string;
category?: string;
author?: string;
published_at?: string;
version: number;
}
// --- API ---
export const articleApi = {
list: async (params: {
page?: number;
page_size?: number;
category?: string;
}) => {
const { data } = await client.get<{
success: boolean;
data: PaginatedResponse<ArticleListItem>;
}>('/health/articles', { params });
return data.data;
},
get: async (id: string) => {
const { data } = await client.get<{
success: boolean;
data: Article;
}>(`/health/articles/${id}`);
return data.data;
},
create: async (req: CreateArticleReq) => {
const { data } = await client.post<{
success: boolean;
data: Article;
}>('/health/articles', req);
return data.data;
},
update: async (id: string, req: UpdateArticleReq) => {
const { data } = await client.put<{
success: boolean;
data: Article;
}>(`/health/articles/${id}`, req);
return data.data;
},
delete: async (id: string) => {
const { data } = await client.delete<{
success: boolean;
data: null;
}>(`/health/articles/${id}`);
return data.data;
},
};

View File

@@ -65,6 +65,14 @@ export const consultationApi = {
return data.data;
},
getSession: async (id: string) => {
const { data } = await client.get<{
success: boolean;
data: Session;
}>(`/health/consultation-sessions/${id}`);
return data.data;
},
closeSession: async (
id: string,
req: { version: number },

View File

@@ -13,6 +13,7 @@ export interface PatientListItem {
source?: string;
created_at: string;
updated_at: string;
version: number;
}
export interface PatientDetail {