50 lines
1.3 KiB
TypeScript
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,
|
|
};
|
|
}
|