import 'dotenv/config'; import { Request, Response } from 'express'; import jwt from 'jsonwebtoken'; import { prisma } from './prisma/client'; import { Session } from '@generated/types'; export interface IdentityContext { req: Request; res: Response; identity?: { id: string; username: string; }; } export async function getIdentityContext({ req, res }: { req: Request; res: Response; }): Promise { const authHeaders = req.headers.authorization; if (authHeaders == null) return { req, res }; const session: Session = JSON.parse(authHeaders); const { accessToken } = session; const accessTokenSecret = process.env.ACCESS_TOKEN_SECRET; if (accessTokenSecret == null) throw new Error('No `accessToken`.'); const decoded = jwt.verify(accessToken, accessTokenSecret) 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 }; } /* throw new GraphQLError('User is not authenticated', { extensions: { code: 'UNAUTHENTICATED', http: { status: 401 } } }); */ // throw new GraphQLError(`${error}`);