Files
formation-manager-itinova/server/_core/context.ts
2025-11-19 08:34:55 -05:00

50 lines
1.3 KiB
TypeScript

import type { CreateExpressContextOptions } from "@trpc/server/adapters/express";
import type { User } from "../../drizzle/schema";
import { verifyToken } from "./auth";
import { getUserById } from "../db";
import { COOKIE_NAME } from "@shared/const";
export type TrpcContext = {
req: CreateExpressContextOptions["req"];
res: CreateExpressContextOptions["res"];
user: User | null;
};
export async function createContext(
opts: CreateExpressContextOptions
): Promise<TrpcContext> {
let user: User | null = null;
try {
// Essayer de récupérer le token depuis le cookie d'abord
let token = opts.req.cookies[COOKIE_NAME];
// Si pas de cookie, essayer le header Authorization
if (!token) {
const authHeader = opts.req.headers.authorization;
if (authHeader && authHeader.startsWith('Bearer ')) {
token = authHeader.substring(7);
}
}
if (token) {
// Vérifier et décoder le token
const decoded = verifyToken(token);
if (decoded) {
// Récupérer l'utilisateur depuis la base de données
user = await getUserById(decoded.userId) || null;
}
}
} catch (error) {
// Authentication is optional for public procedures.
user = null;
}
return {
req: opts.req,
res: opts.res,
user,
};
}