94 lines
2.6 KiB
TypeScript
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
|
|
}
|
|
})
|
|
}
|