224 lines
6.5 KiB
JavaScript
224 lines
6.5 KiB
JavaScript
import express from 'express'
|
|
import cors from 'cors'
|
|
import 'dotenv/config'
|
|
import { ApolloServer, ForbiddenError } from 'apollo-server-express'
|
|
import { mergeSchemas } from 'graphql-tools'
|
|
import jwt from 'express-jwt'
|
|
import jwksRsa from 'jwks-rsa'
|
|
import axios from 'axios'
|
|
|
|
import { createTransformedRemoteSchema } from './createRemoteSchema'
|
|
import { teams, events, operations } from './links'
|
|
|
|
import logger from './logger'
|
|
|
|
async function getUserId (authId) {
|
|
try {
|
|
if(authId === process.env.AACLOUD_ID){
|
|
return authId
|
|
}
|
|
|
|
const userData = await axios({
|
|
url: process.env.USERS_API_URL,
|
|
method: 'post',
|
|
headers: {
|
|
preshared: process.env.USERS_API_PRESHARED
|
|
},
|
|
data: {
|
|
query: `
|
|
{
|
|
userByAuthId(authId: "${authId}")
|
|
{
|
|
id
|
|
}
|
|
}
|
|
`
|
|
}
|
|
})
|
|
return userData.data.data.userByAuthId.id
|
|
} catch (error) {
|
|
return (error)
|
|
}
|
|
}
|
|
|
|
async function run () {
|
|
const transformedKeyVaultSchema = await createTransformedRemoteSchema(
|
|
'keyVault_',
|
|
process.env.KEYVAULT_API_URL,
|
|
process.env.KEYVAULT_API_PRESHARED)
|
|
const transformedTeamsSchema = await createTransformedRemoteSchema(
|
|
'teams_',
|
|
process.env.TEAMS_API_URL,
|
|
process.env.TEAMS_API_PRESHARED)
|
|
const transformedUsersSchema = await createTransformedRemoteSchema(
|
|
'users_',
|
|
process.env.USERS_API_URL,
|
|
process.env.USERS_API_PRESHARED)
|
|
const transformedEventsSchema = await createTransformedRemoteSchema(
|
|
'events_',
|
|
process.env.EVENTS_API_URL,
|
|
process.env.EVENTS_API_PRESHARED)
|
|
const transformedFinancialBeingsSchema = await createTransformedRemoteSchema(
|
|
'financialBeings_',
|
|
process.env.FINANCIAL_BEINGS_API_URL,
|
|
process.env.FINANCIAL_BEINGS_API_PRESHARED)
|
|
const transformedOperationsSchema = await createTransformedRemoteSchema(
|
|
'operations_',
|
|
process.env.OPERATIONS_API_URL,
|
|
process.env.OPERATIONS_API_PRESHARED)
|
|
const transformedNotificationsSchema = await createTransformedRemoteSchema(
|
|
'notifications_',
|
|
process.env.NOTIFICATIONS_API_URL,
|
|
process.env.NOTIFICATIONS_API_PRESHARED)
|
|
const transformedLogsSchema = await createTransformedRemoteSchema(
|
|
'logs_',
|
|
process.env.LOGS_API_URL,
|
|
process.env.LOGS_API_PRESHARED)
|
|
// const transformedMinersSchema = await createTransformedRemoteSchema(
|
|
// 'miners_',
|
|
// process.env.MINERS_API_URL,
|
|
// process.env.MINERS_PRESHARED)
|
|
const transformeStrategizerSchema = await createTransformedRemoteSchema(
|
|
'strategizer_',
|
|
process.env.STRATEGIZER_API_URL,
|
|
process.env.STRATEGIZER_API_PRESHARED)
|
|
const transformeCockpitSchema = await createTransformedRemoteSchema(
|
|
'cockpit_',
|
|
process.env.COCKPIT_API_URL,
|
|
process.env.COCKPIT_API_PRESHARED)
|
|
|
|
var schemas = []
|
|
var resolvers = {}
|
|
|
|
if (transformedTeamsSchema) {
|
|
schemas.push(transformedTeamsSchema)
|
|
if (transformedUsersSchema && transformedEventsSchema && transformeStrategizerSchema) {
|
|
schemas.push(teams.linkSchemaDefs)
|
|
resolvers = Object.assign(resolvers, teams.resolver(transformedUsersSchema, transformedEventsSchema, transformeStrategizerSchema))
|
|
}
|
|
}
|
|
if (transformedUsersSchema) {
|
|
schemas.push(transformedUsersSchema)
|
|
}
|
|
if (transformedEventsSchema) {
|
|
schemas.push(transformedEventsSchema)
|
|
if (transformedUsersSchema && transformedTeamsSchema && transformedOperationsSchema) {
|
|
schemas.push(events.linkSchemaDefs)
|
|
resolvers = Object.assign(resolvers, events.resolver(transformedUsersSchema, transformedTeamsSchema, transformedOperationsSchema))
|
|
}
|
|
}
|
|
if (transformedKeyVaultSchema) {
|
|
schemas.push(transformedKeyVaultSchema)
|
|
}
|
|
if (transformedFinancialBeingsSchema) {
|
|
schemas.push(transformedFinancialBeingsSchema)
|
|
}
|
|
if (transformedOperationsSchema) {
|
|
schemas.push(transformedOperationsSchema)
|
|
if (transformedTeamsSchema && transformeCockpitSchema) {
|
|
schemas.push(operations.linkSchemaDefs)
|
|
resolvers = Object.assign(resolvers, operations.resolver(transformedTeamsSchema, transformeCockpitSchema))
|
|
}
|
|
}
|
|
if (transformedNotificationsSchema) {
|
|
schemas.push(transformedNotificationsSchema)
|
|
}
|
|
if (transformedLogsSchema) {
|
|
schemas.push(transformedLogsSchema)
|
|
}
|
|
if (transformeStrategizerSchema) {
|
|
schemas.push(transformeStrategizerSchema)
|
|
}
|
|
if (transformeCockpitSchema) {
|
|
schemas.push(transformeCockpitSchema)
|
|
}
|
|
|
|
const schema = mergeSchemas({
|
|
schemas,
|
|
resolvers
|
|
})
|
|
|
|
const app = express()
|
|
|
|
app.use('/graphql',
|
|
jwt({
|
|
secret: jwksRsa.expressJwtSecret({
|
|
cache: true,
|
|
rateLimit: true,
|
|
jwksRequestsPerMinute: 1,
|
|
jwksUri: `https://${process.env.AUTH0_DOMAIN}/.well-known/jwks.json`
|
|
}),
|
|
credentialsRequired: false,
|
|
audience: process.env.AUTH0_AUDIENCE,
|
|
issuer: process.env.AUTH0_ISSUER,
|
|
algorithms: [`RS256`]
|
|
}),
|
|
function (err, req, res, next) {
|
|
if (err.code === 'invalid_token') {
|
|
res.locals.error = err.message
|
|
}
|
|
return next()
|
|
}
|
|
)
|
|
|
|
app.use('/graphql', (req, res, next) => {
|
|
res.locals.userId = ''
|
|
if (req.user) {
|
|
getUserId(req.user.sub)
|
|
.then(data => {
|
|
res.locals.userId = data
|
|
next()
|
|
})
|
|
.catch(err => {
|
|
console.log(err)
|
|
next()
|
|
})
|
|
} else {
|
|
next()
|
|
}
|
|
})
|
|
|
|
const context = ({ req, res }) => {
|
|
if (res.locals.error) {
|
|
throw new ForbiddenError(res.locals.error)
|
|
}
|
|
const response = {
|
|
headers: Object.assign(
|
|
res.locals.userId ? { userId: res.locals.userId } : {},
|
|
req.headers.authorization ? { authorization: req.headers.authorization } : {}
|
|
)
|
|
}
|
|
return response
|
|
}
|
|
|
|
const server = new ApolloServer({
|
|
schema,
|
|
context,
|
|
formatError: error => {
|
|
logger.error('An error ocurred inside a module: %s', error.message)
|
|
return error.message
|
|
},
|
|
formatResponse: response => {
|
|
logger.debug('Response from Apollo Server: ' + response)
|
|
return response
|
|
},
|
|
playground: {
|
|
settings: {
|
|
'editor.theme': 'dark',
|
|
'editor.cursorShape': 'line'
|
|
}
|
|
}
|
|
})
|
|
|
|
server.applyMiddleware({ app, cors: { origin: true, credentials: true, methods:'GET,PUT,POST,DELETE,OPTIONS'}})
|
|
|
|
app.listen(4100)
|
|
logger.info(`Server running. Open ${process.env.GRAPHQL_API_URL} to run queries.`)
|
|
}
|
|
|
|
try {
|
|
run()
|
|
} catch (e) {
|
|
logger.error(`An general error occured while running the app: ${e}, details: ${e.message}, stack: ${e.stack}`)
|
|
}
|