index.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. const _ = require('lodash')
  2. const fs = require('fs')
  3. const path = require('path')
  4. const autoload = require('auto-load')
  5. const { makeExecutableSchema } = require('@graphql-tools/schema')
  6. const { defaultKeyGenerator, rateLimitDirective } = require('graphql-rate-limit-directive')
  7. const { GraphQLUpload } = require('graphql-upload')
  8. /* global WIKI */
  9. // Rate Limiter
  10. const { rateLimitDirectiveTypeDefs, rateLimitDirectiveTransformer } = rateLimitDirective({
  11. keyGenerator: (directiveArgs, source, args, context, info) => `${context.req.ip}:${defaultKeyGenerator(directiveArgs, source, args, context, info)}`
  12. })
  13. // Schemas
  14. WIKI.logger.info(`Loading GraphQL Schema...`)
  15. const typeDefs = [
  16. rateLimitDirectiveTypeDefs
  17. ]
  18. const schemas = fs.readdirSync(path.join(WIKI.SERVERPATH, 'graph/schemas'))
  19. schemas.forEach(schema => {
  20. typeDefs.push(fs.readFileSync(path.join(WIKI.SERVERPATH, `graph/schemas/${schema}`), 'utf8'))
  21. })
  22. // Resolvers
  23. WIKI.logger.info(`Loading GraphQL Resolvers...`)
  24. let resolvers = {
  25. Date: require('./scalars/date'),
  26. JSON: require('./scalars/json'),
  27. UUID: require('./scalars/uuid'),
  28. Upload: GraphQLUpload
  29. }
  30. const resolversObj = _.values(autoload(path.join(WIKI.SERVERPATH, 'graph/resolvers')))
  31. resolversObj.forEach(resolver => {
  32. _.merge(resolvers, resolver)
  33. })
  34. // Make executable schema
  35. WIKI.logger.info(`Compiling GraphQL Schema...`)
  36. let schema = makeExecutableSchema({
  37. typeDefs,
  38. resolvers
  39. })
  40. // Apply schema transforms
  41. schema = rateLimitDirectiveTransformer(schema)
  42. WIKI.logger.info(`GraphQL Schema: [ OK ]`)
  43. module.exports = schema