index.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. const _ = require('lodash')
  2. const fs = require('fs')
  3. // const gqlTools = require('graphql-tools')
  4. const path = require('path')
  5. const autoload = require('auto-load')
  6. const PubSub = require('graphql-subscriptions').PubSub
  7. const { LEVEL, MESSAGE } = require('triple-beam')
  8. const Transport = require('winston-transport')
  9. const { createRateLimitTypeDef, createRateLimitDirective } = require('graphql-rate-limit-directive')
  10. /* global WIKI */
  11. WIKI.logger.info(`Loading GraphQL Schema...`)
  12. // Init Subscription PubSub
  13. WIKI.GQLEmitter = new PubSub()
  14. // Schemas
  15. let typeDefs = [createRateLimitTypeDef()]
  16. let schemas = fs.readdirSync(path.join(WIKI.SERVERPATH, 'graph/schemas'))
  17. schemas.forEach(schema => {
  18. typeDefs.push(fs.readFileSync(path.join(WIKI.SERVERPATH, `graph/schemas/${schema}`), 'utf8'))
  19. })
  20. // Resolvers
  21. let resolvers = {}
  22. const resolversObj = _.values(autoload(path.join(WIKI.SERVERPATH, 'graph/resolvers')))
  23. resolversObj.forEach(resolver => {
  24. _.merge(resolvers, resolver)
  25. })
  26. // Directives
  27. let schemaDirectives = {
  28. ...autoload(path.join(WIKI.SERVERPATH, 'graph/directives')),
  29. rateLimit: createRateLimitDirective({
  30. keyGenerator: (directiveArgs, source, args, context, info) => `${context.req.ip}:${info.parentType}.${info.fieldName}`
  31. })
  32. }
  33. // Live Trail Logger (admin)
  34. class LiveTrailLogger extends Transport {
  35. constructor(opts) {
  36. super(opts)
  37. this.name = 'liveTrailLogger'
  38. this.level = 'debug'
  39. }
  40. log (info, callback = () => {}) {
  41. WIKI.GQLEmitter.publish('livetrail', {
  42. loggingLiveTrail: {
  43. timestamp: new Date(),
  44. level: info[LEVEL],
  45. output: info[MESSAGE]
  46. }
  47. })
  48. callback(null, true)
  49. }
  50. }
  51. WIKI.logger.add(new LiveTrailLogger({}))
  52. WIKI.logger.info(`GraphQL Schema: [ OK ]`)
  53. module.exports = {
  54. typeDefs,
  55. resolvers,
  56. schemaDirectives
  57. }