mod-portal-v2/server/api/user/complete-welcome.post.ts
2026-08-01 23:59:45 +02:00

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
}
}
})