SFT/mock-server/routes/permission.js

117 lines
3.8 KiB
JavaScript

import express from 'express'
import { permissions, rolePermissions } from '../db/seedAuth.js'
import { nextId } from '../utils/id.js'
import { sendOk, sendFail } from '../utils/response.js'
import { requireAuth } from '../middleware/requireAuth.js'
const router = express.Router()
router.use(requireAuth)
function toTreeVo(p) {
return {
id: p.id,
permissionName: p.permissionName,
permissionCode: p.permissionCode,
permissionType: p.permissionType,
parentId: p.parentId,
level: p.level,
sortOrder: p.sortOrder,
icon: p.icon,
routePath: p.routePath,
children: [],
pageResourceList: (p.pageResourcePathList || []).map((path, idx) => ({
id: p.id * 1000 + idx,
permissionId: p.id,
pageResourcePath: path
})),
apiResourceList: (p.apiResourcePathList || []).map((path, idx) => ({
id: p.id * 2000 + idx,
permissionId: p.id,
apiResourcePath: path
}))
}
}
function buildTree() {
const sorted = [...permissions].sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0))
const nodeMap = new Map(sorted.map((p) => [p.id, toTreeVo(p)]))
const roots = []
nodeMap.forEach((node) => {
if (node.parentId && nodeMap.has(node.parentId)) {
nodeMap.get(node.parentId).children.push(node)
} else {
roots.push(node)
}
})
return roots
}
router.get('/tree', (req, res) => {
sendOk(res, buildTree())
})
router.post('/create', (req, res) => {
const {
permissionType,
permissionName,
permissionCode,
parentId,
level,
sortOrder,
icon,
routePath,
pageResourcePaths,
apiResourcePaths
} = req.body || {}
if (!permissionName || !permissionCode) return sendFail(res, '权限名称和编码不能为空', 400)
if (permissions.some((p) => p.permissionCode === permissionCode)) return sendFail(res, '权限编码已存在', 400)
const id = nextId('permission')
const permission = {
id,
permissionType: permissionType || 'PAGE',
permissionName,
permissionCode,
parentId: parentId || null,
level: level ?? 0,
sortOrder: sortOrder ?? 0,
icon: icon || '',
routePath: routePath || '',
pageResourcePathList: pageResourcePaths || [],
apiResourcePathList: apiResourcePaths || []
}
permissions.push(permission)
sendOk(res, { id, permissionCode }, '创建成功')
})
router.post('/update', (req, res) => {
const { id, permissionName, permissionCode, parentId, level, sortOrder, icon, routePath, pageResourcePaths, apiResourcePaths } =
req.body || {}
const permission = permissions.find((p) => p.id === id)
if (!permission) return sendFail(res, '权限不存在', 404)
if (permissionName !== undefined) permission.permissionName = permissionName
if (permissionCode !== undefined) permission.permissionCode = permissionCode
if (parentId !== undefined) permission.parentId = parentId
if (level !== undefined) permission.level = level
if (sortOrder !== undefined) permission.sortOrder = sortOrder
if (icon !== undefined) permission.icon = icon
if (routePath !== undefined) permission.routePath = routePath
if (pageResourcePaths !== undefined) permission.pageResourcePathList = pageResourcePaths
if (apiResourcePaths !== undefined) permission.apiResourcePathList = apiResourcePaths
sendOk(res, true, '更新成功')
})
router.post('/delete', (req, res) => {
const { id } = req.body || {}
const index = permissions.findIndex((p) => p.id === id)
if (index === -1) return sendFail(res, '权限不存在', 404)
const hasChildren = permissions.some((p) => p.parentId === id)
if (hasChildren) return sendFail(res, '存在子级权限,不可删除', 400)
permissions.splice(index, 1)
for (let i = rolePermissions.length - 1; i >= 0; i -= 1) {
if (rolePermissions[i].permissionId === id) rolePermissions.splice(i, 1)
}
sendOk(res, true, '删除成功')
})
export default router