import { Session } from '@generated/types'; import 'dotenv/config'; import { Request, Response } from 'express'; import { GraphQLError } from 'graphql'; import jwt from 'jsonwebtoken'; import { config } from './main'; import { prisma } from './prisma/client'; export interface IdentityContext { req: Request; res: Response; identity?: { id: string; email: string; username: string; }; } export async function getIdentityContext({ req, res }: { req: Request; res: Response; }): Promise { try { const authHeaders = req.headers.authorization; if (authHeaders == null) return { req, res }; const session: Session = JSON.parse(authHeaders); const { accessToken } = session; const decoded = jwt.verify(accessToken, config.accessToken.secret) as { userId: string; iat: number; exp: number; }; const identity = await prisma.user.findUnique({ where: { id: decoded.userId }, select: { id: true, email: true, username: true } }); if (identity == null) throw new Error("Couldn't find the user."); return { req, res, identity }; } catch (error) { if (error instanceof Error) throw new GraphQLError(error.message, { extensions: { code: 'UNAUTHENTICATED', http: { status: 401 } } }); throw new GraphQLError(typeof error === 'string' ? error : 'Unknown error', { extensions: { code: 'UNAUTHENTICATED', http: { status: 401 } } }); } }