44 lines
No EOL
1.2 KiB
TypeScript
44 lines
No EOL
1.2 KiB
TypeScript
import { query } from '../../utils/db'
|
|
|
|
function parseJwt(token: string) {
|
|
try {
|
|
const base64Payload = token.split('.')[1]
|
|
return JSON.parse(Buffer.from(base64Payload, 'base64').toString('utf8'))
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const authHeader = getRequestHeader(event, 'authorization')
|
|
const token = authHeader?.replace('Bearer ', '')
|
|
|
|
if (!token) {
|
|
throw createError({ statusCode: 401, statusMessage: 'Missing authorization header' })
|
|
}
|
|
|
|
const decoded = parseJwt(token)
|
|
if (!decoded?.sub) {
|
|
throw createError({ statusCode: 401, statusMessage: 'Invalid token' })
|
|
}
|
|
|
|
let dbUser = null
|
|
try {
|
|
const result = await query(
|
|
`SELECT sfid, pid, first_login_completed FROM users WHERE keycloak_id = $1 LIMIT 1`,
|
|
[decoded.sub]
|
|
)
|
|
dbUser = result.rows[0] || null
|
|
} catch (error) {
|
|
console.error('[DB PROFILE FETCH ERROR]:', error)
|
|
}
|
|
|
|
return {
|
|
keycloakId: decoded.sub,
|
|
username: decoded.preferred_username || decoded.given_name || 'User',
|
|
email: decoded.email,
|
|
sfid: dbUser?.sfid || null,
|
|
pid: dbUser?.pid || null,
|
|
firstLoginCompleted: dbUser?.first_login_completed || false
|
|
}
|
|
}) |