import Boom from '@hapi/boom'; import { db } from '../db/knex.js'; import { readUserId } from '../services/userAuth.js'; /** @type {import('@hapi/hapi').RouteOptionsPreObject} */ export const requireUser = { assign: 'user', async method(request) { const token = jwtFromCookie(request.state.user_token); const userId = token ? readUserId(token) : null; if (!userId) { throw Boom.unauthorized('Authentication required'); } const user = await db('users').where({ id: Number(userId) }).first(); if (!user || !user.is_active) { throw Boom.unauthorized('Authentication required'); } return { id: user.id, name: user.name ?? null, email: user.email }; }, }; /** * @param {unknown} value * @returns {string | null} */ function jwtFromCookie(value) { if (typeof value === 'string') { return value; } if (value && typeof value === 'object' && 'token' in value && typeof value.token === 'string') { return value.token; } return null; }