monitor-ai/src/app/api/admin/roles/route.ts

65 lines
2.6 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.

// GET/PUT /api/admin/roles — 角色权限管理admin
import { NextRequest, NextResponse } from 'next/server'
import { verifyJwt } from '@shared/lib/auth/jwt'
import { authConfig } from '@/lib/auth-config'
import { dbQuery, dbExec } from '@/lib/db'
import { writeAuditLog } from '@/lib/audit'
import { hasPermission, PERMISSIONS } from '@/lib/permissions'
export async function GET(request: NextRequest) {
const token = request.cookies.get('tlyq_session')?.value
if (!token) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
const payload = verifyJwt(token, authConfig.jwtSecret)
if (!payload || !hasPermission(String(payload.role || 'viewer'), 'roles:manage')) {
return NextResponse.json({ error: 'Forbidden' }, { status: 403 })
}
// 返回所有权限定义 + 各角色的权限映射
const rolePermissions = dbQuery<{ role: string; permission_key: string }>('SELECT role, permission_key FROM role_permissions')
const roles = ['admin', 'editor', 'viewer']
const permKeys = PERMISSIONS.map(p => p.key)
const result = roles.map(role => ({
role,
permissions: PERMISSIONS.map(p => ({
key: p.key,
enabled: role === 'admin' || rolePermissions.some(rp => rp.role === role && rp.permission_key === p.key),
})),
}))
return NextResponse.json({ roles: result, allPermissions: permKeys })
}
export async function PUT(request: NextRequest) {
const token = request.cookies.get('tlyq_session')?.value
if (!token) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
const payload = verifyJwt(token, authConfig.jwtSecret)
if (!payload || !hasPermission(String(payload.role || 'viewer'), 'roles:manage')) {
return NextResponse.json({ error: 'Forbidden' }, { status: 403 })
}
const body = await request.json()
const { role, permissions } = body as { role: string; permissions: string[] }
if (!role || !permissions || !Array.isArray(permissions)) {
return NextResponse.json({ error: '参数错误' }, { status: 400 })
}
// 删除旧权限,写入新权限
dbExec(`DELETE FROM role_permissions WHERE role = '${role.replace(/'/g, "''")}'`)
for (const perm of permissions) {
dbExec(`INSERT OR IGNORE INTO role_permissions (role, permission_key) VALUES ('${role.replace(/'/g, "''")}', '${perm.replace(/'/g, "''")}')`)
}
writeAuditLog({
userId: Number(payload.sub) || null,
username: String(payload.username || ''),
action: 'update_role',
entityType: 'role',
details: { role, permissions },
ipAddress: request.headers.get('x-forwarded-for') || '127.0.0.1',
})
return NextResponse.json({ success: true })
}