Files
makemd/dashboard/src/mock/msw.ts
wurenzhi 15ee1758f5 refactor: 重构项目结构并优化类型定义
- 移除extension模块,将功能迁移至node-agent
- 修复类型导出问题,使用export type明确类型导出
- 统一数据库连接方式,从直接导入改为使用config/database
- 更新文档中的项目结构描述
- 添加多个服务的实用方法,如getForecast、getBalances等
- 修复类型错误和TS1205警告
- 优化RedisService调用方式
- 添加新的实体类型定义
- 更新审计日志格式,统一字段命名
2026-03-21 15:04:06 +08:00

209 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* [MOCK-003] MSW Mock配置
* 拦截HTTP请求返回Mock数据
* AI注意: 这是网络层拦截,业务代码完全无感知
*
* @module mock/msw
* @author AI-Frontend-Team
* @created 2026-03-19
*/
import { http, HttpResponse } from 'msw';
import { setupWorker } from 'msw/browser';
import {
mockCertificates,
getMockCertificates,
getMockCertificateById,
createMockCertificate,
updateMockCertificate,
deleteMockCertificate,
} from './data/certificate.mock';
import type { Certificate } from '@/types/certificate';
/**
* MSW请求处理器
* 拦截证书相关API请求
*/
export const handlers = [
// ============================================
// 证书列表查询
// ============================================
http.get('/api/v1/certificate/certificates', ({ request }) => {
const url = new URL(request.url);
const status = url.searchParams.get('status');
const type = url.searchParams.get('type');
const keyword = url.searchParams.get('keyword');
const page = parseInt(url.searchParams.get('page') || '1');
const pageSize = parseInt(url.searchParams.get('pageSize') || '10');
console.log('[MSW] GET /api/v1/certificate/certificates', { status, type, keyword, page, pageSize });
let data = getMockCertificates({ status: status || undefined, type: type || undefined, keyword: keyword || undefined });
// 分页
const start = (page - 1) * pageSize;
const end = start + pageSize;
const paginatedData = data.slice(start, end);
return HttpResponse.json({
success: true,
data: paginatedData,
total: data.length,
page,
pageSize,
}, { status: 200 });
}),
// ============================================
// 证书详情
// ============================================
http.get('/api/v1/certificate/certificates/:id', ({ params }) => {
const { id } = params;
const cert = getMockCertificateById(id as string);
console.log('[MSW] GET /api/v1/certificate/certificates/:id', { id });
if (!cert) {
return HttpResponse.json(
{ success: false, error: '证书不存在' },
{ status: 404 }
);
}
return HttpResponse.json(
{ success: true, data: cert },
{ status: 200 }
);
}),
// ============================================
// 创建证书
// ============================================
http.post('/api/v1/certificate/certificates', async ({ request }) => {
const body = await request.json() as Partial<Certificate>;
console.log('[MSW] POST /api/v1/certificate/certificates', body);
const newCert = createMockCertificate(body);
return HttpResponse.json(
{
success: true,
data: { id: newCert.id },
},
{ status: 200 }
);
}),
// ============================================
// 更新证书
// ============================================
http.put('/api/v1/certificate/certificates/:id', async ({ params, request }) => {
const { id } = params;
const body = await request.json() as Partial<Certificate>;
console.log('[MSW] PUT /api/v1/certificate/certificates/:id', { id, body });
const updated = updateMockCertificate(id as string, body);
if (!updated) {
return HttpResponse.json(
{ success: false, error: '证书不存在' },
{ status: 404 }
);
}
return HttpResponse.json(
{ success: true, data: updated },
{ status: 200 }
);
}),
// ============================================
// 更新证书状态(审核)
// ============================================
http.put('/api/v1/certificate/certificates/:id/status', async ({ params, request }) => {
const { id } = params;
const body = await request.json() as { status: string; approvedBy?: string };
const { status, approvedBy } = body;
console.log('[MSW] PUT /api/v1/certificate/certificates/:id/status', { id, status, approvedBy });
const updates: Partial<Certificate> = { status: status as Certificate['status'] };
if (status === 'APPROVED') {
updates.approvedBy = approvedBy || 'admin';
updates.approvedDate = new Date().toISOString().split('T')[0];
}
const updated = updateMockCertificate(id as string, updates);
if (!updated) {
return HttpResponse.json(
{ success: false, error: '证书不存在' },
{ status: 404 }
);
}
return HttpResponse.json(
{ success: true },
{ status: 200 }
);
}),
// ============================================
// 删除证书
// ============================================
http.delete('/api/v1/certificate/certificates/:id', ({ params }) => {
const { id } = params;
console.log('[MSW] DELETE /api/v1/certificate/certificates/:id', { id });
const deleted = deleteMockCertificate(id as string);
if (!deleted) {
return HttpResponse.json(
{ success: false, error: '证书不存在' },
{ status: 404 }
);
}
return HttpResponse.json(
{ success: true },
{ status: 200 }
);
}),
];
/**
* MSW Worker实例
* 在浏览器环境中使用
*/
export const worker = setupWorker(...handlers);
/**
* 启动MSW
* @param options 启动选项
*/
export async function startMSW(options?: { onUnhandledRequest?: 'bypass' | 'warn' | 'error' }) {
if (process.env.REACT_APP_USE_MOCK !== 'true') {
console.log('[MSW] Mock mode is disabled');
return;
}
console.log('[MSW] Starting Mock Service Worker...');
await worker.start({
onUnhandledRequest: options?.onUnhandledRequest || 'bypass',
});
console.log('[MSW] Mock Service Worker started');
}
/**
* 停止MSW
*/
export function stopMSW() {
worker.stop();
console.log('[MSW] Mock Service Worker stopped');
}