69 lines
No EOL
1.7 KiB
TypeScript
69 lines
No EOL
1.7 KiB
TypeScript
import { query } from '../../utils/db'
|
|
import { queryNnas } from '../../utils/nnasDb'
|
|
|
|
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 body = await readBody(event)
|
|
const decoded = body?.token ? parseJwt(body.token) : null
|
|
|
|
if (!decoded?.sub) {
|
|
throw createError({ statusCode: 401, statusMessage: 'Unauthorized' })
|
|
}
|
|
|
|
const usernameInput = body?.sfid?.trim()
|
|
|
|
if (!usernameInput) {
|
|
throw createError({ statusCode: 400, statusMessage: 'SFID is required' })
|
|
}
|
|
|
|
let nnasUser: { pid: number; username: string } | null = null
|
|
|
|
try {
|
|
const nnasResult = await queryNnas(
|
|
`SELECT pid, username FROM users WHERE LOWER(username) = LOWER($1) LIMIT 1`,
|
|
[usernameInput]
|
|
)
|
|
|
|
if (nnasResult.rows.length === 0) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
statusMessage: `SFID "${usernameInput}" was not found in NNAS database.`
|
|
})
|
|
}
|
|
|
|
nnasUser = nnasResult.rows[0]
|
|
} catch (error: any) {
|
|
if (error.statusCode) throw error
|
|
console.error('[NNAS DB Error]:', error)
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: 'Failed to query NNAS database.'
|
|
})
|
|
}
|
|
|
|
await query(
|
|
`UPDATE users
|
|
SET sfid = $1,
|
|
pid = $2,
|
|
first_login_completed = TRUE,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE keycloak_id = $3`,
|
|
[nnasUser.username, nnasUser.pid, decoded.sub]
|
|
)
|
|
|
|
return {
|
|
success: true,
|
|
user: {
|
|
sfid: nnasUser.username,
|
|
pid: nnasUser.pid
|
|
}
|
|
}
|
|
}) |