chore: migrating to nodejs 22
This commit is contained in:
parent
0296f86060
commit
2e31ab391f
47 changed files with 16384 additions and 11137 deletions
|
|
@ -4,19 +4,23 @@ const path = require('path')
|
|||
const express = require('express')
|
||||
const https = require('https')
|
||||
const serveStatic = require('serve-static')
|
||||
const cors = require('cors')
|
||||
const helmet = require('helmet')
|
||||
const nocache = require('nocache')
|
||||
const cookieParser = require('cookie-parser')
|
||||
const { graphqlUploadExpress } = require('graphql-upload')
|
||||
const { ApolloServer } = require('apollo-server-express')
|
||||
const { ApolloServer } = require('@apollo/server')
|
||||
const { expressMiddleware } = require('@apollo/server/express4')
|
||||
const { ApolloServerPluginLandingPageDisabled } = require('@apollo/server/plugin/disabled')
|
||||
const { ApolloServerPluginLandingPageLocalDefault } = require('@apollo/server/plugin/landingPage/default')
|
||||
|
||||
const { mergeResolvers } = require('@graphql-tools/merge')
|
||||
const { makeExecutableSchema } = require('@graphql-tools/schema')
|
||||
|
||||
require('../environment-helper')
|
||||
const { asyncLocalStorage, defaultStore } = require('../async-storage')
|
||||
const logger = require('../logger')
|
||||
const exchange = require('../exchange')
|
||||
|
||||
const { AuthDirective } = require('./graphql/directives')
|
||||
const { authDirectiveTransformer } = require('./graphql/directives')
|
||||
const { typeDefs, resolvers } = require('./graphql/schema')
|
||||
const findOperatorId = require('../middlewares/operatorId')
|
||||
const computeSchema = require('../compute-schema')
|
||||
|
|
@ -28,6 +32,7 @@ const devMode = require('minimist')(process.argv.slice(2)).dev
|
|||
const HOSTNAME = process.env.HOSTNAME
|
||||
const KEY_PATH = process.env.KEY_PATH
|
||||
const CERT_PATH = process.env.CERT_PATH
|
||||
const CA_PATH = process.env.CA_PATH
|
||||
const ID_PHOTO_CARD_DIR = process.env.ID_PHOTO_CARD_DIR
|
||||
const FRONT_CAMERA_DIR = process.env.FRONT_CAMERA_DIR
|
||||
const OPERATOR_DATA_DIR = process.env.OPERATOR_DATA_DIR
|
||||
|
|
@ -37,64 +42,79 @@ if (!HOSTNAME) {
|
|||
process.exit(1)
|
||||
}
|
||||
|
||||
const app = express()
|
||||
const loadRoutes = async () => {
|
||||
const app = express()
|
||||
|
||||
app.use(helmet())
|
||||
app.use(compression())
|
||||
app.use(nocache())
|
||||
app.use(cookieParser())
|
||||
app.use(express.json())
|
||||
app.use(express.urlencoded({ extended: true })) // support encoded bodies
|
||||
app.use(express.static(path.resolve(__dirname, '..', '..', 'public')))
|
||||
app.use(cleanUserSessions(USER_SESSIONS_CLEAR_INTERVAL))
|
||||
app.use(computeSchema)
|
||||
app.use(findOperatorId)
|
||||
app.use(session)
|
||||
app.use(graphqlUploadExpress())
|
||||
app.use(helmet())
|
||||
app.use(compression())
|
||||
app.use(nocache())
|
||||
app.use(cookieParser())
|
||||
app.use(express.json())
|
||||
app.use(express.urlencoded({ extended: true })) // support encoded bodies
|
||||
app.use(express.static(path.resolve(__dirname, '..', '..', 'public')))
|
||||
app.use(cleanUserSessions(USER_SESSIONS_CLEAR_INTERVAL))
|
||||
app.use(computeSchema)
|
||||
app.use(findOperatorId)
|
||||
app.use(session)
|
||||
|
||||
const apolloServer = new ApolloServer({
|
||||
typeDefs,
|
||||
resolvers,
|
||||
uploads: false,
|
||||
schemaDirectives: {
|
||||
auth: AuthDirective
|
||||
},
|
||||
playground: false,
|
||||
introspection: false,
|
||||
formatError: error => {
|
||||
const exception = error?.extensions?.exception
|
||||
logger.error(error, JSON.stringify(exception || {}))
|
||||
return error
|
||||
},
|
||||
context: async (obj) => buildApolloContext(obj)
|
||||
})
|
||||
// Dynamic import for graphql-upload since it's not a CommonJS module
|
||||
const { default: graphqlUploadExpress } = await import('graphql-upload/graphqlUploadExpress.mjs')
|
||||
const { default: GraphQLUpload } = await import('graphql-upload/GraphQLUpload.mjs')
|
||||
|
||||
apolloServer.applyMiddleware({
|
||||
app,
|
||||
cors: {
|
||||
credentials: true,
|
||||
origin: devMode && 'https://localhost:3001'
|
||||
}
|
||||
})
|
||||
app.use(graphqlUploadExpress())
|
||||
|
||||
// cors on app for /api/register endpoint.
|
||||
app.use(cors({ credentials: true, origin: devMode && 'https://localhost:3001' }))
|
||||
const schema = makeExecutableSchema({
|
||||
typeDefs,
|
||||
resolvers: mergeResolvers(resolvers, { Upload: GraphQLUpload }),
|
||||
})
|
||||
const schemaWithDirectives = authDirectiveTransformer(schema)
|
||||
|
||||
app.use('/id-card-photo', serveStatic(ID_PHOTO_CARD_DIR, { index: false }))
|
||||
app.use('/front-camera-photo', serveStatic(FRONT_CAMERA_DIR, { index: false }))
|
||||
app.use('/operator-data', serveStatic(OPERATOR_DATA_DIR, { index: false }))
|
||||
const apolloServer = new ApolloServer({
|
||||
schema: schemaWithDirectives,
|
||||
csrfPrevention: false,
|
||||
introspection: false,
|
||||
formatError: (formattedError, error) => {
|
||||
logger.error(error, JSON.stringify(error?.extensions || {}))
|
||||
return formattedError
|
||||
},
|
||||
plugins: [
|
||||
devMode
|
||||
? ApolloServerPluginLandingPageLocalDefault()
|
||||
: ApolloServerPluginLandingPageDisabled()
|
||||
]
|
||||
})
|
||||
|
||||
// Everything not on graphql or api/register is redirected to the front-end
|
||||
app.get('*', (req, res) => res.sendFile(path.resolve(__dirname, '..', '..', 'public', 'index.html')))
|
||||
await apolloServer.start();
|
||||
|
||||
app.use(
|
||||
'/graphql',
|
||||
express.json(),
|
||||
expressMiddleware(apolloServer, {
|
||||
context: async ({ req, res }) => buildApolloContext({ req, res })
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
app.use('/id-card-photo', serveStatic(ID_PHOTO_CARD_DIR, { index: false }))
|
||||
app.use('/front-camera-photo', serveStatic(FRONT_CAMERA_DIR, { index: false }))
|
||||
app.use('/operator-data', serveStatic(OPERATOR_DATA_DIR, { index: false }))
|
||||
|
||||
// Everything not on graphql or api/register is redirected to the front-end
|
||||
app.get('*', (req, res) => res.sendFile(path.resolve(__dirname, '..', '..', 'public', 'index.html')))
|
||||
|
||||
return app
|
||||
}
|
||||
|
||||
const certOptions = {
|
||||
key: fs.readFileSync(KEY_PATH),
|
||||
cert: fs.readFileSync(CERT_PATH)
|
||||
cert: fs.readFileSync(CERT_PATH),
|
||||
ca: fs.readFileSync(CA_PATH)
|
||||
}
|
||||
|
||||
function run () {
|
||||
const store = defaultStore()
|
||||
asyncLocalStorage.run(store, () => {
|
||||
asyncLocalStorage.run(store, async () => {
|
||||
const app = await loadRoutes()
|
||||
const serverPort = devMode ? 8070 : 443
|
||||
|
||||
const serverLog = `lamassu-admin-server listening on port ${serverPort}`
|
||||
|
|
|
|||
|
|
@ -1,24 +0,0 @@
|
|||
const express = require('express')
|
||||
const { ApolloServer } = require('apollo-server-express')
|
||||
|
||||
require('../environment-helper')
|
||||
const { typeDefs, resolvers } = require('./graphql/schema')
|
||||
const logger = require('../logger')
|
||||
|
||||
const app = express()
|
||||
const server = new ApolloServer({
|
||||
typeDefs,
|
||||
resolvers
|
||||
})
|
||||
|
||||
server.applyMiddleware({ app })
|
||||
|
||||
app.use(express.json())
|
||||
|
||||
function run () {
|
||||
const serverLog = `lamassu-admin-server listening on port ${9010}${server.graphqlPath}`
|
||||
|
||||
app.listen(9010, () => logger.info(serverLog))
|
||||
}
|
||||
|
||||
module.exports = { run }
|
||||
|
|
@ -1,40 +1,49 @@
|
|||
const _ = require('lodash/fp')
|
||||
|
||||
const { SchemaDirectiveVisitor, AuthenticationError } = require('apollo-server-express')
|
||||
const { mapSchema, getDirective, MapperKind } = require('@graphql-tools/utils')
|
||||
const { defaultFieldResolver } = require('graphql')
|
||||
|
||||
class AuthDirective extends SchemaDirectiveVisitor {
|
||||
visitObject (type) {
|
||||
this.ensureFieldsWrapped(type)
|
||||
type._requiredAuthRole = this.args.requires
|
||||
}
|
||||
const { AuthenticationError } = require('../errors')
|
||||
|
||||
visitFieldDefinition (field, details) {
|
||||
this.ensureFieldsWrapped(details.objectType)
|
||||
field._requiredAuthRole = this.args.requires
|
||||
}
|
||||
|
||||
ensureFieldsWrapped (objectType) {
|
||||
if (objectType._authFieldsWrapped) return
|
||||
objectType._authFieldsWrapped = true
|
||||
|
||||
const fields = objectType.getFields()
|
||||
|
||||
_.forEach(fieldName => {
|
||||
const field = fields[fieldName]
|
||||
const { resolve = defaultFieldResolver } = field
|
||||
|
||||
field.resolve = function (root, args, context, info) {
|
||||
const requiredRoles = field._requiredAuthRole ? field._requiredAuthRole : objectType._requiredAuthRole
|
||||
function authDirectiveTransformer(schema, directiveName = 'auth') {
|
||||
return mapSchema(schema, {
|
||||
// For object types
|
||||
[MapperKind.OBJECT_TYPE]: (objectType) => {
|
||||
const directive = getDirective(schema, objectType, directiveName)?.[0]
|
||||
if (directive) {
|
||||
const requiredAuthRole = directive.requires
|
||||
objectType._requiredAuthRole = requiredAuthRole
|
||||
}
|
||||
return objectType
|
||||
},
|
||||
|
||||
// For field definitions
|
||||
[MapperKind.OBJECT_FIELD]: (fieldConfig, _fieldName, typeName) => {
|
||||
const directive = getDirective(schema, fieldConfig, directiveName)?.[0]
|
||||
if (directive) {
|
||||
const requiredAuthRole = directive.requires
|
||||
fieldConfig._requiredAuthRole = requiredAuthRole
|
||||
}
|
||||
|
||||
// Get the parent object type
|
||||
const objectType = schema.getType(typeName)
|
||||
|
||||
// Apply auth check to the field's resolver
|
||||
const { resolve = defaultFieldResolver } = fieldConfig
|
||||
fieldConfig.resolve = function (root, args, context, info) {
|
||||
const requiredRoles = fieldConfig._requiredAuthRole || objectType._requiredAuthRole
|
||||
if (!requiredRoles) return resolve.apply(this, [root, args, context, info])
|
||||
|
||||
|
||||
const user = context.req.session.user
|
||||
if (!user || !_.includes(_.upperCase(user.role), requiredRoles)) throw new AuthenticationError('You do not have permission to access this resource!')
|
||||
|
||||
if (!user || !_.includes(_.upperCase(user.role), requiredRoles)) {
|
||||
throw new AuthenticationError('You do not have permission to access this resource!')
|
||||
}
|
||||
|
||||
return resolve.apply(this, [root, args, context, info])
|
||||
}
|
||||
}, _.keys(fields))
|
||||
}
|
||||
|
||||
return fieldConfig
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = AuthDirective
|
||||
module.exports = authDirectiveTransformer
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
const AuthDirective = require('./auth')
|
||||
const authDirectiveTransformer = require('./auth')
|
||||
|
||||
module.exports = { AuthDirective }
|
||||
module.exports = { authDirectiveTransformer }
|
||||
|
|
|
|||
71
lib/new-admin/graphql/errors.js
Normal file
71
lib/new-admin/graphql/errors.js
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
const { GraphQLError } = require('graphql')
|
||||
const { ApolloServerErrorCode } = require('@apollo/server/errors')
|
||||
|
||||
class AuthenticationError extends GraphQLError {
|
||||
constructor() {
|
||||
super('Authentication failed', {
|
||||
extensions: {
|
||||
code: 'UNAUTHENTICATED'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class InvalidCredentialsError extends GraphQLError {
|
||||
constructor() {
|
||||
super('Invalid credentials', {
|
||||
extensions: {
|
||||
code: 'INVALID_CREDENTIALS'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class UserAlreadyExistsError extends GraphQLError {
|
||||
constructor() {
|
||||
super('User already exists', {
|
||||
extensions: {
|
||||
code: 'USER_ALREADY_EXISTS'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class InvalidTwoFactorError extends GraphQLError {
|
||||
constructor() {
|
||||
super('Invalid two-factor code', {
|
||||
extensions: {
|
||||
code: 'INVALID_TWO_FACTOR_CODE'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class InvalidUrlError extends GraphQLError {
|
||||
constructor() {
|
||||
super('Invalid URL token', {
|
||||
extensions: {
|
||||
code: 'INVALID_URL_TOKEN'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class UserInputError extends GraphQLError {
|
||||
constructor() {
|
||||
super('User input error', {
|
||||
extensions: {
|
||||
code: ApolloServerErrorCode.BAD_USER_INPUT
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
AuthenticationError,
|
||||
InvalidCredentialsError,
|
||||
UserAlreadyExistsError,
|
||||
InvalidTwoFactorError,
|
||||
InvalidUrlError,
|
||||
UserInputError
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
const { ApolloError, AuthenticationError } = require('apollo-server-express')
|
||||
|
||||
class InvalidCredentialsError extends ApolloError {
|
||||
constructor(message) {
|
||||
super(message, 'INVALID_CREDENTIALS')
|
||||
Object.defineProperty(this, 'name', { value: 'InvalidCredentialsError' })
|
||||
}
|
||||
}
|
||||
|
||||
class UserAlreadyExistsError extends ApolloError {
|
||||
constructor(message) {
|
||||
super(message, 'USER_ALREADY_EXISTS')
|
||||
Object.defineProperty(this, 'name', { value: 'UserAlreadyExistsError' })
|
||||
}
|
||||
}
|
||||
|
||||
class InvalidTwoFactorError extends ApolloError {
|
||||
constructor(message) {
|
||||
super(message, 'INVALID_TWO_FACTOR_CODE')
|
||||
Object.defineProperty(this, 'name', { value: 'InvalidTwoFactorError' })
|
||||
}
|
||||
}
|
||||
|
||||
class InvalidUrlError extends ApolloError {
|
||||
constructor(message) {
|
||||
super(message, 'INVALID_URL_TOKEN')
|
||||
Object.defineProperty(this, 'name', { value: 'InvalidUrlError' })
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
AuthenticationError,
|
||||
InvalidCredentialsError,
|
||||
UserAlreadyExistsError,
|
||||
InvalidTwoFactorError,
|
||||
InvalidUrlError
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ const loginHelper = require('../../services/login')
|
|||
const T = require('../../../time')
|
||||
const users = require('../../../users')
|
||||
const sessionManager = require('../../../session-manager')
|
||||
const authErrors = require('../errors/authentication')
|
||||
const authErrors = require('../errors')
|
||||
const credentials = require('../../../hardware-credentials')
|
||||
|
||||
const REMEMBER_ME_AGE = 90 * T.day
|
||||
|
|
|
|||
|
|
@ -1,13 +1,9 @@
|
|||
const { GraphQLDateTime } = require('graphql-iso-date')
|
||||
const { GraphQLJSON, GraphQLJSONObject } = require('graphql-type-json')
|
||||
const { GraphQLUpload } = require('graphql-upload')
|
||||
GraphQLDateTime.name = 'Date'
|
||||
const { DateTimeISOResolver, JSONResolver, JSONObjectResolver } = require('graphql-scalars')
|
||||
|
||||
const resolvers = {
|
||||
JSON: GraphQLJSON,
|
||||
JSONObject: GraphQLJSONObject,
|
||||
Date: GraphQLDateTime,
|
||||
UploadGQL: GraphQLUpload
|
||||
JSON: JSONResolver,
|
||||
JSONObject: JSONObjectResolver,
|
||||
Date: DateTimeISOResolver
|
||||
}
|
||||
|
||||
module.exports = resolvers
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Bill {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Blacklist {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type CashboxBatch {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Country {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Currency {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Customer {
|
||||
|
|
@ -6,7 +6,7 @@ const typeDef = gql`
|
|||
authorizedOverride: String
|
||||
daysSuspended: Int
|
||||
isSuspended: Boolean
|
||||
newPhoto: UploadGQL
|
||||
newPhoto: Upload
|
||||
photoType: String
|
||||
frontCameraPath: String
|
||||
frontCameraAt: Date
|
||||
|
|
@ -18,7 +18,7 @@ const typeDef = gql`
|
|||
idCardData: JSONObject
|
||||
idCardDataOverride: String
|
||||
idCardDataExpiration: Date
|
||||
idCardPhoto: UploadGQL
|
||||
idCardPhoto: Upload
|
||||
idCardPhotoPath: String
|
||||
idCardPhotoOverride: String
|
||||
idCardPhotoAt: Date
|
||||
|
|
@ -74,7 +74,7 @@ const typeDef = gql`
|
|||
|
||||
input CustomerEdit {
|
||||
idCardData: JSONObject
|
||||
idCardPhoto: UploadGQL
|
||||
idCardPhoto: Upload
|
||||
usSsn: String
|
||||
subscriberInfo: JSONObject
|
||||
}
|
||||
|
|
@ -108,7 +108,7 @@ const typeDef = gql`
|
|||
removeCustomField(customerId: ID!, fieldId: ID!): Boolean @auth
|
||||
editCustomer(customerId: ID!, customerEdit: CustomerEdit): Customer @auth
|
||||
deleteEditedData(customerId: ID!, customerEdit: CustomerEdit): Customer @auth
|
||||
replacePhoto(customerId: ID!, photoType: String, newPhoto: UploadGQL): Customer @auth
|
||||
replacePhoto(customerId: ID!, photoType: String, newPhoto: Upload): Customer @auth
|
||||
createCustomerNote(customerId: ID!, title: String!, content: String!): Boolean @auth
|
||||
editCustomerNote(noteId: ID!, newContent: String!): Boolean @auth
|
||||
deleteCustomerNote(noteId: ID!): Boolean @auth
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type CoinFunds {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type MachineLog {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type IndividualDiscount {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type MachineStatus {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Query {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Notification {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Mutation {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Rate {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type SanctionMatches {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
scalar JSON
|
||||
scalar JSONObject
|
||||
scalar Date
|
||||
scalar UploadGQL
|
||||
scalar Upload
|
||||
`
|
||||
|
||||
module.exports = typeDef
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Query {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type SMSNotice {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type ProcessStatus {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Transaction {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
const { gql } = require('apollo-server-express')
|
||||
const gql = require('graphql-tag')
|
||||
|
||||
const typeDef = gql`
|
||||
type Query {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
const { AuthenticationError } = require('apollo-server-express')
|
||||
const users = require('../../users')
|
||||
|
||||
const { AuthenticationError } = require('../graphql/errors')
|
||||
|
||||
const buildApolloContext = async ({ req, res }) => {
|
||||
if (!req.session.user) return { req, res }
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
const machineLoader = require('../../machine-loader')
|
||||
const { UserInputError } = require('apollo-server-express')
|
||||
const { UserInputError } = require('../graphql/errors')
|
||||
|
||||
function getMachine (machineId) {
|
||||
return machineLoader.getMachines()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue