index.js 1.5 KB

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