Files
BYW-VoiceHub/server/api/auth/identities.get.ts
T

69 lines
1.8 KiB
TypeScript

import { db, eq, userIdentities } from '~/drizzle/db'
import { users } from '~/drizzle/schema'
import { createApiError } from '~~/server/utils/apiError'
import { getIdentityAvatarUrl } from '~~/server/utils/user-avatar'
export default defineEventHandler(async (event) => {
const user = event.context.user
if (!user) {
throw createApiError(401, 'AUTH_UNAUTHORIZED_ACCESS', '未授权访问')
}
const userRecord = await db.query.users.findFirst({
where: eq(users.id, user.id),
columns: {
avatarProvider: true,
avatarProviderUserId: true
}
})
const identities = await db.query.userIdentities.findMany({
where: eq(userIdentities.userId, user.id),
columns: {
id: true, // 需要 id 以便单独删除
provider: true,
providerUserId: true,
providerUsername: true,
avatar: true,
createdAt: true
}
})
return identities.map(identity => {
if (identity.provider === 'webauthn') {
try {
const data = JSON.parse(identity.providerUsername)
return {
...identity,
providerUsername: data.label || 'WebAuthn 设备',
avatar: null,
isAvatarSource: false
// 可以在这里把 label 改为 userFriendlyName
}
} catch {
return {
...identity,
providerUsername: '未知设备',
avatar: null,
isAvatarSource: false
}
}
}
if (identity.provider === 'totp') {
return {
...identity,
avatar: null,
isAvatarSource: false
}
}
const isAvatarSource =
userRecord?.avatarProvider === identity.provider &&
userRecord?.avatarProviderUserId === identity.providerUserId
return {
...identity,
avatar: getIdentityAvatarUrl(identity),
isAvatarSource
}
})
})