import type { CreateExpressContextOptions } from "@trpc/server/adapters/express"; import type { User } from "../../drizzle/schema"; import { verifyToken } from "./auth"; import { getUserById, getUserByOpenId } from "../db"; import { COOKIE_NAME } from "@shared/const"; import { sdk } from "./sdk"; export type TrpcContext = { req: CreateExpressContextOptions["req"]; res: CreateExpressContextOptions["res"]; user: User | null; }; export async function createContext( opts: CreateExpressContextOptions ): Promise { 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) { // Essayer d'abord l'authentification locale (JWT avec userId) try { const decoded = verifyToken(token); if (decoded && decoded.userId) { user = await getUserById(decoded.userId) || null; } } catch (localAuthError) { // Si l'authentification locale échoue, essayer OAuth const session = await sdk.verifySession(token); if (session && session.openId) { user = await getUserByOpenId(session.openId) || null; } } } } catch (error) { // Authentication is optional for public procedures. user = null; } return { req: opts.req, res: opts.res, user, }; }