41 lines
1004 B
JavaScript
41 lines
1004 B
JavaScript
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;
|
|
}
|