import { http, HttpResponse, delay } from 'msw'; import { mockSystemUsers, mockDepts, mockPosts, mockSystemRoles } from '../data'; import type { MockSystemUser } from '../data'; // Mutable in-memory store let users = [...mockSystemUsers]; let nextId = Math.max(...users.map((u) => u.id)) + 1; function paginate(list: T[], pageNo: number, pageSize: number) { const start = (pageNo - 1) * pageSize; return { list: list.slice(start, start + pageSize), total: list.length, }; } function enrichUser(user: MockSystemUser) { const dept = mockDepts.find((d) => d.id === user.deptId); const posts = user.postIds .map((pid) => mockPosts.find((p) => String(p.id) === pid)) .filter(Boolean); const roles = user.username === 'admin' ? [mockSystemRoles[0]] : [mockSystemRoles[1]]; return { ...user, dept: dept ? { id: dept.id, name: dept.name } : null, posts: posts.map((p) => ({ id: p!.id, name: p!.name })), roles: roles.map((r) => ({ id: r.id, name: r.name })), }; } export const userHandlers = [ // Page query http.get('/admin-api/system/user/page', async ({ request }) => { await delay(300); const url = new URL(request.url); const pageNo = Number(url.searchParams.get('pageNo') || 1); const pageSize = Number(url.searchParams.get('pageSize') || 10); const username = url.searchParams.get('username') || ''; const mobile = url.searchParams.get('mobile') || ''; const status = url.searchParams.get('status'); const deptId = url.searchParams.get('deptId'); const createTimeStart = url.searchParams.get('createTime[0]') || url.searchParams.get('createTimeStart') || ''; const createTimeEnd = url.searchParams.get('createTime[1]') || url.searchParams.get('createTimeEnd') || ''; let filtered = [...users]; if (username) { filtered = filtered.filter((u) => u.username.includes(username)); } if (mobile) { filtered = filtered.filter((u) => u.mobile.includes(mobile)); } if (status !== null && status !== '') { filtered = filtered.filter((u) => u.status === Number(status)); } if (deptId) { // Include the dept itself and all children const deptIdNum = Number(deptId); const matchDeptIds = new Set(); function collectChildDepts(parentId: number) { matchDeptIds.add(parentId); mockDepts.filter((d) => d.parentId === parentId).forEach((d) => collectChildDepts(d.id)); } collectChildDepts(deptIdNum); filtered = filtered.filter((u) => matchDeptIds.has(u.deptId)); } if (createTimeStart) { filtered = filtered.filter((u) => u.createTime >= createTimeStart); } if (createTimeEnd) { filtered = filtered.filter((u) => u.createTime <= createTimeEnd); } return HttpResponse.json({ code: 0, data: paginate(filtered, pageNo, pageSize), message: 'ok', }); }), // Get by ID http.get('/admin-api/system/user/get', async ({ request }) => { await delay(200); const url = new URL(request.url); const id = Number(url.searchParams.get('id')); const user = users.find((u) => u.id === id); if (!user) { return HttpResponse.json( { code: 1, data: null, message: '用户不存在' }, ); } return HttpResponse.json({ code: 0, data: enrichUser(user), message: 'ok', }); }), // Create http.post('/admin-api/system/user/create', async ({ request }) => { await delay(300); const body = (await request.json()) as Record; const exists = users.find((u) => u.username === body.username); if (exists) { return HttpResponse.json( { code: 1, data: null, message: '该用户名已存在' }, ); } const newUser: MockSystemUser = { id: nextId++, username: body.username as string, nickname: (body.nickname as string) || (body.username as string), deptId: (body.deptId as number) || 104, postIds: (body.postIds as string[]) || [], email: (body.email as string) || '', mobile: (body.mobile as string) || '', sex: (body.sex as number) ?? 1, avatar: (body.avatar as string) || '', loginIp: '', status: (body.status as number) ?? 0, remark: (body.remark as string) || '', createTime: new Date().toISOString().replace('T', ' ').slice(0, 19), }; users.unshift(newUser); return HttpResponse.json({ code: 0, data: newUser.id, message: 'ok' }); }), // Update http.put('/admin-api/system/user/update', async ({ request }) => { await delay(300); const body = (await request.json()) as Record; const index = users.findIndex((u) => u.id === body.id); if (index === -1) { return HttpResponse.json( { code: 1, data: null, message: '用户不存在' }, ); } // Check username uniqueness (excluding self) if (body.username) { const dup = users.find((u) => u.username === body.username && u.id !== body.id); if (dup) { return HttpResponse.json( { code: 1, data: null, message: '该用户名已存在' }, ); } } users[index] = { ...users[index], ...(body.nickname !== undefined && { nickname: body.nickname as string }), ...(body.username !== undefined && { username: body.username as string }), ...(body.deptId !== undefined && { deptId: body.deptId as number }), ...(body.postIds !== undefined && { postIds: body.postIds as string[] }), ...(body.email !== undefined && { email: body.email as string }), ...(body.mobile !== undefined && { mobile: body.mobile as string }), ...(body.sex !== undefined && { sex: body.sex as number }), ...(body.status !== undefined && { status: body.status as number }), ...(body.remark !== undefined && { remark: body.remark as string }), }; return HttpResponse.json({ code: 0, data: true, message: 'ok' }); }), // Delete single http.delete('/admin-api/system/user/delete', async ({ request }) => { await delay(200); const url = new URL(request.url); const id = Number(url.searchParams.get('id')); if (id === 1) { return HttpResponse.json( { code: 1, data: null, message: '不能删除超级管理员' }, ); } users = users.filter((u) => u.id !== id); return HttpResponse.json({ code: 0, data: true, message: 'ok' }); }), // Delete list (batch) http.delete('/admin-api/system/user/delete-list', async ({ request }) => { await delay(300); const body = (await request.json()) as number[]; if (body.includes(1)) { return HttpResponse.json( { code: 1, data: null, message: '不能删除超级管理员' }, ); } users = users.filter((u) => !body.includes(u.id)); return HttpResponse.json({ code: 0, data: true, message: 'ok' }); }), // Update status http.put('/admin-api/system/user/update-status', async ({ request }) => { await delay(200); const body = (await request.json()) as { id: number; status: number }; const user = users.find((u) => u.id === body.id); if (!user) { return HttpResponse.json( { code: 1, data: null, message: '用户不存在' }, ); } if (user.id === 1) { return HttpResponse.json( { code: 1, data: null, message: '不能修改超级管理员状态' }, ); } user.status = body.status; return HttpResponse.json({ code: 0, data: true, message: 'ok' }); }), ];