qpa-server/src/graphql.ts

94 lines
2.6 KiB
TypeScript
Raw Normal View History

2019-06-21 08:07:56 +02:00
import {ApolloServer} from 'apollo-server-express'
2019-03-08 15:58:35 +01:00
import {makeExecutableSchema} from "graphql-tools"
2019-01-30 14:19:18 +01:00
import EventsResolvers from './Events/eventsResolvers'
2019-06-10 19:50:51 +02:00
import UserResolvers from './Auth/userResolvers'
2019-03-08 15:58:35 +01:00
import {importSchema} from 'graphql-import'
import AuthResolvers from "./Auth/authResolvers"
2019-03-11 13:39:16 +01:00
import {Connection} from "typeorm"
2019-03-24 09:04:59 +01:00
import {PostOffice} from "./post_office"
import {Session} from "./Auth/Session.entity"
import {Context} from "./@types/graphql-utils"
2019-06-23 09:08:49 +02:00
import SessionManager from "./Auth/SessionManager"
2018-10-07 21:33:47 +02:00
interface Dependencies {
2019-03-11 13:39:16 +01:00
typeormConnection: Connection
sendEmail: PostOffice
2019-03-27 12:14:28 +01:00
domain?: string
customContext?: Context
2019-06-23 09:08:49 +02:00
sessionManager: SessionManager
2018-10-07 21:33:47 +02:00
}
2019-03-11 13:39:16 +01:00
const resolvers = {
Query: {},
Mutation: {}
}
2018-10-07 21:33:47 +02:00
2019-03-11 13:39:16 +01:00
export const createServer = async (dependencies: Dependencies) => {
2019-03-08 15:58:35 +01:00
2019-03-11 13:39:16 +01:00
const authResolvers = new AuthResolvers({
2019-03-24 09:04:59 +01:00
sendEmail: dependencies.sendEmail,
2019-03-27 12:14:28 +01:00
emailTargetDomain: dependencies.domain,
2019-06-23 09:08:49 +02:00
sessionManager: dependencies.sessionManager
2019-03-11 13:39:16 +01:00
})
2019-07-26 15:32:11 +02:00
const typeDefs = importSchema(__dirname + '/schema.graphql')
2019-05-24 19:59:54 +02:00
const { Query: EventQueryResolvers, Mutation: EventResolversMutation,...eventResolvers} = EventsResolvers
2019-06-10 19:50:51 +02:00
const { Query: UserQueryResolvers, Mutation: UserMutationResolvers, ...userResolvers} = UserResolvers
2019-05-24 19:59:54 +02:00
2019-03-11 13:39:16 +01:00
const schema = makeExecutableSchema({
typeDefs: [
typeDefs
],
resolvers: {
Query: {
...resolvers.Query,
2019-05-24 19:59:54 +02:00
...EventQueryResolvers,
2019-06-10 19:50:51 +02:00
...authResolvers.Query,
...UserQueryResolvers,
2019-01-30 14:19:18 +01:00
},
2019-03-11 13:39:16 +01:00
Mutation: {
...resolvers.Mutation,
2019-05-24 19:59:54 +02:00
...EventResolversMutation,
2019-06-10 19:50:51 +02:00
...authResolvers.Mutation,
...UserMutationResolvers,
2019-03-11 17:50:24 +01:00
},
UserSession: {
...authResolvers.UserSession
2019-05-24 19:59:54 +02:00
},
2019-06-10 19:50:51 +02:00
...eventResolvers,
...userResolvers,
2019-03-11 13:39:16 +01:00
},
})
2019-03-11 18:07:09 +01:00
return new ApolloServer({
schema,
2019-03-27 12:14:28 +01:00
context: dependencies.customContext ? dependencies.customContext : async (a) => {
2019-03-11 18:07:09 +01:00
const ctx: Context = {
req: a.req
}
2019-06-05 07:57:15 +02:00
let authToken
if (a.req.header('authentication')) {
authToken = a.req.header('authentication')
}
2019-05-25 11:14:47 +02:00
if (a.req.headers.cookie) {
2019-06-10 10:12:38 +02:00
console.log('a.req.headers.cookie', a.req.headers.cookie)
2019-05-25 11:14:47 +02:00
const cookies: any = a.req.headers.cookie.split(';').map(s => s.trim().split('=')).reduce((acc, val)=> {acc[val[0]] = val[1]; return acc},{})
2019-06-10 10:12:38 +02:00
2019-05-25 11:14:47 +02:00
if (cookies.authentication) {
2019-06-05 07:57:15 +02:00
authToken = cookies.authentication as string
}
}
if (authToken) {
const session = await Session.findOne({hash: authToken})
if (session) {
ctx.user = session.user
2019-03-27 12:14:28 +01:00
}
2019-03-11 18:07:09 +01:00
}
2019-04-26 12:04:18 +02:00
2019-03-27 12:14:28 +01:00
return ctx
2019-03-11 18:07:09 +01:00
}
})
2018-10-07 21:33:47 +02:00
}