SFT/mock-server/routes/role.js

93 lines
3.6 KiB
JavaScript

import express from 'express'
import { roles, rolePermissions, userRoles, permissions } from '../db/seedAuth.js'
import { nextId } from '../utils/id.js'
import { paginate } from '../utils/pagination.js'
import { sendOk, sendFail } from '../utils/response.js'
import { requireAuth } from '../middleware/requireAuth.js'
const router = express.Router()
router.use(requireAuth)
function toRoleVo(role) {
return { id: role.id, roleName: role.roleName, organizationId: role.organizationId, isBuiltIn: role.isBuiltIn }
}
router.post('/role/page', (req, res) => {
const { roleName, page, pageSize } = req.body || {}
let list = roles
if (roleName) list = list.filter((r) => r.roleName.includes(roleName))
const result = paginate(list, page, pageSize)
sendOk(res, { ...result, records: result.records.map(toRoleVo) })
})
router.post('/role/detail', (req, res) => {
const { roleId } = req.body || {}
const role = roles.find((r) => r.id === roleId)
if (!role) return sendFail(res, '角色不存在', 404)
const permissionIdList = rolePermissions.filter((rp) => rp.roleId === roleId).map((rp) => rp.permissionId)
sendOk(res, { ...toRoleVo(role), permissionIdList })
})
router.post('/role/create', (req, res) => {
const { roleName, organizationId, isBuiltIn } = req.body || {}
if (!roleName) return sendFail(res, '角色名称不能为空', 400)
const id = nextId('role')
const role = { id, roleName, organizationId, isBuiltIn: !!isBuiltIn }
roles.push(role)
sendOk(res, toRoleVo(role), '创建成功')
})
router.post('/role/update', (req, res) => {
const { id, roleName, organizationId } = req.body || {}
const role = roles.find((r) => r.id === id)
if (!role) return sendFail(res, '角色不存在', 404)
if (role.isBuiltIn) return sendFail(res, '内置角色不可修改', 400)
if (roleName !== undefined) role.roleName = roleName
if (organizationId !== undefined) role.organizationId = organizationId
sendOk(res, true, '更新成功')
})
router.post('/role/delete', (req, res) => {
const { roleId } = req.body || {}
const index = roles.findIndex((r) => r.id === roleId)
if (index === -1) return sendFail(res, '角色不存在', 404)
if (roles[index].isBuiltIn) return sendFail(res, '内置角色不可删除', 400)
roles.splice(index, 1)
for (let i = rolePermissions.length - 1; i >= 0; i -= 1) {
if (rolePermissions[i].roleId === roleId) rolePermissions.splice(i, 1)
}
for (let i = userRoles.length - 1; i >= 0; i -= 1) {
if (userRoles[i].roleId === roleId) userRoles.splice(i, 1)
}
sendOk(res, true, '删除成功')
})
router.get('/auth/role-permission/list-by-role', (req, res) => {
const roleId = Number(req.query.roleId)
const permissionIds = rolePermissions.filter((rp) => rp.roleId === roleId).map((rp) => rp.permissionId)
const list = permissions.filter((p) => permissionIds.includes(p.id))
sendOk(res, list)
})
router.post('/auth/role-permission/bind', (req, res) => {
const { roleId, permissionIdList } = req.body || {}
;(permissionIdList || []).forEach((permissionId) => {
if (!rolePermissions.some((rp) => rp.roleId === roleId && rp.permissionId === permissionId)) {
rolePermissions.push({ roleId, permissionId })
}
})
sendOk(res, true, '绑定成功')
})
router.post('/auth/role-permission/unbind', (req, res) => {
const { roleId, permissionIdList } = req.body || {}
for (let i = rolePermissions.length - 1; i >= 0; i -= 1) {
if (rolePermissions[i].roleId === roleId && (permissionIdList || []).includes(rolePermissions[i].permissionId)) {
rolePermissions.splice(i, 1)
}
}
sendOk(res, true, '解绑成功')
})
export default router