import { ServerResponse } from 'http'; import { JWT } from '../server/authentication/authenticate'; import { ApolloServer, gql } from 'apollo-server-micro'; import { Ability } from '@casl/ability'; import { PrismaClient, User } from '@prisma/client'; import { schema } from '../schema'; import { verify } from 'jsonwebtoken'; import { config } from '../config'; import { defineDefaultAbility, defineUserAbility } from '../server/authorization/user-authorization'; import { NowRequest } from '@now/node'; import { createConnectionUrl } from 'src/database'; /** Types for the context that is passed to our graphQL resolvers */ export interface ApiContext { request: NowRequest; state: { user?: User | null; ability: Ability; db: PrismaClient; }; } const typeDefs = gql` type Query { sayHello: String } `; const resolvers = { Query: { sayHello(parent, args, context) { return 'Hello World!'; }, }, }; export const server = new ApolloServer({ schema, context: async ({ req, res, }: { req: NowRequest; res: ServerResponse; }): Promise => { let user: User | null; const ctx: ApiContext = { request: req, state: { user: null, ability: defineDefaultAbility(), db: new PrismaClient({ datasources: { db: { url: createConnectionUrl(config.database), } } }), } }; // Verify token and get user // TODO: extract to seperate file // const authString = req.headers.authorization; // const token = authString ? authString.split(' ')[1] : ''; // // console.log(authString, token); // try { // const decodedToken = verify(token, config.session.key, { // algorithms: ['HS256', 'HS512'], // audience: '', // issuer: 'Forage', // }) as JWT; // user = await User.findById(decodedToken.sub); // } catch (e) { // // not a valid token // user = null; // } // // Attach user/abilities to context // ctx.state.user = user; // ctx.state.abilities = defineUserAbility(user); return ctx; }, playground: true, introspection: true, });