qpa-server/src/graphql.ts

94 lines
2.6 KiB
TypeScript

import {ApolloServer} from 'apollo-server-express'
import {makeExecutableSchema} from "graphql-tools"
import EventsResolvers from './Events/eventsResolvers'
import UserResolvers from './Auth/userResolvers'
import {importSchema} from 'graphql-import'
import AuthResolvers from "./Auth/authResolvers"
import {Connection} from "typeorm"
import {PostOffice} from "./post_office"
import {Session} from "./Auth/Session.entity"
import {Context} from "./@types/graphql-utils"
import SessionManager from "./Auth/SessionManager"
interface Dependencies {
typeormConnection: Connection
sendEmail: PostOffice
domain?: string
customContext?: Context
sessionManager: SessionManager
}
const resolvers = {
Query: {},
Mutation: {}
}
export const createServer = async (dependencies: Dependencies) => {
const authResolvers = new AuthResolvers({
sendEmail: dependencies.sendEmail,
emailTargetDomain: dependencies.domain,
sessionManager: dependencies.sessionManager
})
const typeDefs = importSchema(__dirname + '/schema.graphql')
const { Query: EventQueryResolvers, Mutation: EventResolversMutation,...eventResolvers} = EventsResolvers
const { Query: UserQueryResolvers, Mutation: UserMutationResolvers, ...userResolvers} = UserResolvers
const schema = makeExecutableSchema({
typeDefs: [
typeDefs
],
resolvers: {
Query: {
...resolvers.Query,
...EventQueryResolvers,
...authResolvers.Query,
...UserQueryResolvers,
},
Mutation: {
...resolvers.Mutation,
...EventResolversMutation,
...authResolvers.Mutation,
...UserMutationResolvers,
},
UserSession: {
...authResolvers.UserSession
},
...eventResolvers,
...userResolvers,
},
})
return new ApolloServer({
schema,
context: dependencies.customContext ? dependencies.customContext : async (a) => {
const ctx: Context = {
req: a.req
}
let authToken
if (a.req.header('authentication')) {
authToken = a.req.header('authentication')
}
if (a.req.headers.cookie) {
console.log('a.req.headers.cookie', a.req.headers.cookie)
const cookies: any = a.req.headers.cookie.split(';').map(s => s.trim().split('=')).reduce((acc, val)=> {acc[val[0]] = val[1]; return acc},{})
if (cookies.authentication) {
authToken = cookies.authentication as string
}
}
if (authToken) {
const session = await Session.findOne({hash: authToken})
if (session) {
ctx.user = session.user
}
}
return ctx
}
})
}