index.mjs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { merge } from 'lodash-es'
  2. import fs from 'node:fs/promises'
  3. import path from 'node:path'
  4. import { makeExecutableSchema } from '@graphql-tools/schema'
  5. import { defaultKeyGenerator, rateLimitDirective } from 'graphql-rate-limit-directive'
  6. import GraphQLUpload from 'graphql-upload/GraphQLUpload.mjs'
  7. import DateScalar from './scalars/date.mjs'
  8. import JSONScalar from './scalars/json.mjs'
  9. import UUIDScalar from './scalars/uuid.mjs'
  10. export async function initSchema () {
  11. // Rate Limiter
  12. const { rateLimitDirectiveTypeDefs, rateLimitDirectiveTransformer } = rateLimitDirective({
  13. keyGenerator: (directiveArgs, source, args, context, info) => `${context.req.ip}:${defaultKeyGenerator(directiveArgs, source, args, context, info)}`
  14. })
  15. // Schemas
  16. WIKI.logger.info(`Loading GraphQL Schema...`)
  17. const typeDefs = [
  18. rateLimitDirectiveTypeDefs
  19. ]
  20. const schemaList = await fs.readdir(path.join(WIKI.SERVERPATH, 'graph/schemas'))
  21. for (const schemaFile of schemaList) {
  22. typeDefs.push(await fs.readFile(path.join(WIKI.SERVERPATH, `graph/schemas/${schemaFile}`), 'utf8'))
  23. }
  24. // Resolvers
  25. WIKI.logger.info(`Loading GraphQL Resolvers...`)
  26. let resolvers = {
  27. Date: DateScalar,
  28. JSON: JSONScalar,
  29. UUID: UUIDScalar,
  30. Upload: GraphQLUpload
  31. }
  32. const resolverList = await fs.readdir(path.join(WIKI.SERVERPATH, 'graph/resolvers'))
  33. for (const resolverFile of resolverList) {
  34. const resolver = (await import(path.join(WIKI.SERVERPATH, 'graph/resolvers', resolverFile))).default
  35. merge(resolvers, resolver)
  36. }
  37. // Make executable schema
  38. WIKI.logger.info(`Compiling GraphQL Schema...`)
  39. let schema = makeExecutableSchema({
  40. typeDefs,
  41. resolvers
  42. })
  43. // Apply schema transforms
  44. schema = rateLimitDirectiveTransformer(schema)
  45. WIKI.logger.info(`GraphQL Schema: [ OK ]`)
  46. return schema
  47. }