From 921aa517baeeb5a967bf02788a8ac49d9407d998 Mon Sep 17 00:00:00 2001 From: Jayden Seric Date: Mon, 29 Oct 2018 21:35:56 +1100 Subject: [PATCH] Use graphql-upload instead of the outdated apollo-server setup. For context see: https://github.com/jaydenseric/graphql-upload/issues/109. --- api/package-lock.json | 16 ++++++++++++++++ api/package.json | 1 + api/resolvers.mjs | 5 ++++- api/server.mjs | 18 ++++++++++++++++-- api/types.mjs | 2 ++ 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/api/package-lock.json b/api/package-lock.json index 124d8d6..f3997ef 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -1952,6 +1952,11 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "fs-capacitor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-1.0.1.tgz", + "integrity": "sha512-XdZK0Q78WP29Vm3FGgJRhRhrBm51PagovzWtW2kJ3Q6cYJbGtZqWSGTSPwvtEkyjIirFd7b8Yes/dpOYjt4RRQ==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2653,6 +2658,17 @@ "uuid": "^3.1.0" } }, + "graphql-upload": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.0.0.tgz", + "integrity": "sha512-DlEi6+Kblj6gAAA5XJahJl1+UfcXICiFypJYIxd4zK26W2/LKm6nwLmSWjECwbAkz/OtB+oSWGb5gqXCDQOLqg==", + "requires": { + "busboy": "^0.2.14", + "fs-capacitor": "^1.0.0", + "http-errors": "^1.7.1", + "object-path": "^0.11.4" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", diff --git a/api/package.json b/api/package.json index 299360c..d5d7714 100644 --- a/api/package.json +++ b/api/package.json @@ -14,6 +14,7 @@ "apollo-server-koa": "^2.1.0", "dotenv": "^6.1.0", "graphql": "^14.0.2", + "graphql-upload": "^8.0.0", "koa": "^2.6.1", "lowdb": "^1.0.0", "mkdirp": "^0.5.1", diff --git a/api/resolvers.mjs b/api/resolvers.mjs index 4130807..4bf472a 100644 --- a/api/resolvers.mjs +++ b/api/resolvers.mjs @@ -1,4 +1,5 @@ import fs from 'fs' +import { GraphQLUpload } from 'graphql-upload' import promisesAll from 'promises-all' import mkdirp from 'mkdirp' import shortid from 'shortid' @@ -39,12 +40,14 @@ const storeDB = file => .write() const processUpload = async upload => { - const { stream, filename, mimetype } = await upload + const { createReadStream, filename, mimetype } = await upload + const stream = createReadStream() const { id, path } = await storeFS({ stream, filename }) return storeDB({ id, filename, mimetype, path }) } export default { + Upload: GraphQLUpload, Query: { uploads: () => db.get('uploads').value() }, diff --git a/api/server.mjs b/api/server.mjs index 071646c..18b5490 100644 --- a/api/server.mjs +++ b/api/server.mjs @@ -2,14 +2,28 @@ import Koa from 'koa' import apolloServerKoa from 'apollo-server-koa' import typeDefs from './types.mjs' import resolvers from './resolvers.mjs' +import { graphqlUploadKoa } from 'graphql-upload' -const app = new Koa() -const server = new apolloServerKoa.ApolloServer({ typeDefs, resolvers }) +const app = new Koa().use( + graphqlUploadKoa({ + maxFileSize: 10000000, // 10 MB + maxFiles: 20 + }) +) + +const server = new apolloServerKoa.ApolloServer({ + typeDefs, + resolvers, + + // Disable outdated built in uploads, to setup graphql-upload instead. + uploads: false +}) server.applyMiddleware({ app }) app.listen(process.env.PORT, error => { if (error) throw error + // eslint-disable-next-line no-console console.info( `Serving http://localhost:${process.env.PORT} for ${process.env.NODE_ENV}.` diff --git a/api/types.mjs b/api/types.mjs index 066ccca..b7a3776 100644 --- a/api/types.mjs +++ b/api/types.mjs @@ -1,4 +1,6 @@ export default /* GraphQL */ ` + scalar Upload + type File { id: ID! path: String!