Files
BYW-VoiceHub/server/api/admin/api-keys/[id].get.ts
T
Henry_Du 4ce4649aaf
Build VoiceHub FPK / build-fpk (push) Failing after 56m5s
Build and Push Docker Image / build-and-push (push) Canceled after 1h9m35s
初次提交
2026-09-06 08:19:02 +08:00

93 lines
2.3 KiB
TypeScript

import { apiKeyPermissions, apiKeys, db, users } from '~/drizzle/db'
import { eq } from 'drizzle-orm'
/**
* 获取API Key详情
* GET /api/admin/api-keys/[id]
*/
export default defineEventHandler(async (event) => {
// 检查用户权限 - 只有超级管理员可以管理API Key
const user = event.context.user
if (!user || user.role !== 'SUPER_ADMIN') {
throw createError({
statusCode: 403,
statusMessage: '只有超级管理员可以管理API Key'
})
}
const apiKeyId = getRouterParam(event, 'id')
if (!apiKeyId) {
throw createError({
statusCode: 400,
statusMessage: 'API Key ID不能为空'
})
}
try {
// 获取API Key基本信息
const apiKeyResult = await db
.select({
id: apiKeys.id,
name: apiKeys.name,
description: apiKeys.description,
keyPrefix: apiKeys.keyPrefix,
isActive: apiKeys.isActive,
expiresAt: apiKeys.expiresAt,
usageCount: apiKeys.usageCount,
lastUsedAt: apiKeys.lastUsedAt,
createdAt: apiKeys.createdAt,
updatedAt: apiKeys.updatedAt,
createdBy: apiKeys.createdByUserId,
creatorName: users.name
})
.from(apiKeys)
.leftJoin(users, eq(apiKeys.createdByUserId, users.id))
.where(eq(apiKeys.id, apiKeyId))
.limit(1)
const apiKey = apiKeyResult[0]
if (!apiKey) {
throw createError({
statusCode: 404,
statusMessage: 'API Key不存在'
})
}
// 获取API Key权限
const permissionsResult = await db
.select({
permission: apiKeyPermissions.permission
})
.from(apiKeyPermissions)
.where(eq(apiKeyPermissions.apiKeyId, apiKeyId))
const permissions = permissionsResult.map((p) => p.permission)
// 计算状态
const isExpired = apiKey.expiresAt ? new Date() > apiKey.expiresAt : false
const status = !apiKey.isActive ? 'inactive' : isExpired ? 'expired' : 'active'
return {
success: true,
data: {
...apiKey,
permissions,
isExpired,
status
}
}
} catch (error: any) {
if (error.statusCode) {
throw error
}
throw createError({
statusCode: 500,
statusMessage: `获取API Key详情失败: ${error.message}`
})
}
})